Python 使用 DocxTemplate 填充 docx table

Python populate a docx table with DocxTemplate

我在 python-docx-template 上阅读了这份文档,但我对 table 部分感到很困惑。假设我有一个名为 Template.docx 的 docx 模板。在 docx 文件中,我有一个 table,它的标题只有 headers。

如何使用 python-docx-template 动态填充 table(添加行和值)?

一般来说,你用python-docx-template释放了jinja2的力量。

填充单个变量

假设您制作了一个 template.docx 文件,其中包含 table:

**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]

动态table

您还可以动态生成 table,我猜您可能不想这样做(如果您正在谈论在 docx 中指定 "table headers")。不过值得研究。将此 template 与 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')