Python заполнить таблицу docx с помощью DocxTemplate

Я прочитал эту документацию на python-docx-template но я довольно запутался в разделе таблицы. Допустим, у меня есть шаблон DOCX называется Template.docx, Внутри файла DOCX у меня есть таблица, которая имеет только заголовки для своего заголовка.

Как я могу использовать python-docx-template динамически заполнить таблицу (добавить строки и значения)?

3 ответа

В общем, вы отпустите силу jinja2 с python-docx-template,

Заполнение отдельных переменных

Представь, что ты делаешь template.docx файл с таблицей:

**table 1**           **table 2**
{{some_content1}}      {{some_content2}}

Тогда вы можете заполнить его, используя

from docxtpl import DocxTemplate
import jinja2

doc = DocxTemplate("template.docx")
context = { 'some_content1' : "test", "some_content_2": "other"}  # Where the magic happens
doc.render(context)
doc.save("generated_doc.docx")

Если у вас есть данные, доступные как pd.DataFrame тогда вы также можете создать context толковый словарь. Например:

import itertools 
context = {}
for row, col in itertools.product(df.index, df.columns):
    context[f'{row}_{col}'] = df.loc[row, col]

Динамический стол

Вы также можете генерировать таблицы динамически, что, я думаю, вы, возможно, не хотите делать (если вы говорите об указании "заголовков таблиц" в docx). Это стоит посмотреть, хотя. Используйте этот шаблон с этим примером из тестов git:

from docxtpl import DocxTemplate
tpl = DocxTemplate('templates/dynamic_table_tpl.docx')

context = {
'col_labels' : ['fruit', 'vegetable', 'stone', 'thing'],
'tbl_contents': [
    {'label': 'yellow', 'cols': ['banana', 'capsicum', 'pyrite', 'taxi']},
    {'label': 'red', 'cols': ['apple', 'tomato', 'cinnabar', 'doubledecker']},
    {'label': 'green', 'cols': ['guava', 'cucumber', 'aventurine', 'card']},
    ]
}

tpl.render(context)
tpl.save('output/dynamic_table.docx')

Здесь у вас есть рабочий пример (https://chowdera.com/2022/02/202202101239322085.html) с текстом и изображениями в динамически заполняемых строках.

Файл шаблона docx должен иметь объединенную строку с инструкцией for, затем обычную строку с нужными столбцами, заполненными шаблонами, затем объединенную строку с инструкцией endfor.

      ----------------------------------
| {%tr for f in frameworks %}    |
----------------------------------
| {{ f.title }}  |  {{ f.desc }} |
----------------------------------
| {%tr endfor %}                 |
----------------------------------

и код питона:

      from docxtpl import DocxTemplate
import jinja2

tpl = DocxTemplate('test-tpl.docx')

context = {
    'frameworks': [
        {
            'title': 'this is line # 1',
            'desc': 'Lorem ipsum dolor sit amet.',
        },
        {
            'title': 'this is line # 2',
            'desc': 'Rem nemo ipsam id facilis molestias et enim in pariatur voluptas sed temporibus illo dolor quibusdam.',
        },
        {
            'title': 'this is line # 3',
            'desc': 'A cupiditate esse et dolores temporibus sed sequi nisi cum voluptatem praesentium et odit voluptatem.',
        },
    ],
}
jinja_env = jinja2.Environment(autoescape=True)
tpl.render(context, jinja_env)
tpl.save('test-result.docx')

Более полный пример (на французском языке): https://sysgenre.it/automatisation-de-template-docx/

Я вообще не получил ответа на этот вопрос. Кажется, не хватает именно того, что интересно: как увеличить количество строк! Кроме того, вы говорите о силе jinja2, но она импортирована в пустоту и никогда не используется ... :(

РЕДАКТИРОВАТЬ: Да, «здесь происходит волшебство», я думаю, это был весь вопрос, с которого нужно было начать, остальное мы выяснили сами (и застряли).

Другие вопросы по тегам