求助:使用docxtpl和jinja2生成动态Word表格的正确模板语法
问题分析与解决方案
你的核心问题在于数据结构的嵌套形式和Word模板中Jinja2循环语法的匹配度不足:project_disciplines_final的每个元素是单键字典(如{"dict_1": [...]}),直接遍历无法直接获取到表格需要的列表值,导致模板渲染失效。以下是具体的修正方案:
1. 预处理数据(可选,简化模板语法)
先在Python代码中将嵌套字典转换成更易处理的二维列表,避免在模板中写复杂的取值逻辑:
from docxtpl import DocxTemplate # 你的原始数据 data = { "col_labels": ["Naam", "Discipline", "Rol", "Bedrijf"], "project_disciplines_final": [ {"dict_1": ["Marcel", "discipline_eof", "projectfunctie_1", "discipline_instantie_2"]}, {"dict_2": ["Hamed", "discipline_eof", "projectfunctie_2", "discipline_instantie_2"]}, {"dict_3": ["Robin", "discipline_eof", "projectfunctie_6", "discipline_instantie_1"]}, {"dict_4": ["Gerritsen", "discipline_eof", "projectfunctie_2", "discipline_instantie_1"]} ] } # 预处理:将单键字典转换为二维列表 data["project_rows"] = [list(item.values())[0] for item in data["project_disciplines_final"]] # 后续渲染代码 doc = DocxTemplate("your_template.docx") doc.render(data) doc.save("output.docx")
2. Word模板的正确Jinja2语法
在Word中插入表格,按以下方式编写标签:
表头行(支持动态生成)
如果要根据col_labels自动生成表头,表头的4个单元格依次写入:
{{ col_labels[0] }} | {{ col_labels[1] }} | {{ col_labels[2] }} | {{ col_labels[3] }}
(如果表头固定,也可以直接手动输入Naam、Discipline等文本,无需循环)
动态数据行
在表格的第二行(作为模板行),将循环标签和取值逻辑写在对应单元格中:
| 单元格1 | 单元格2 | 单元格3 | 单元格4 |
|---|---|---|---|
| {% for row in project_rows %}{{ row[0] }} | {{ row[1] }} | {{ row[2] }} | {{ row[3] }}{% endfor %} |
关键说明:
{% for ... %}和{% endfor %}需要包裹整行的取值逻辑,docxtpl会自动根据循环次数生成对应行数的表格内容。
3. 不预处理数据的模板写法(直接处理原始嵌套结构)
如果不想修改原始数据,模板中可以直接通过entry.values()|first提取每个单键字典中的列表:
| 单元格1 | 单元格2 | 单元格3 | 单元格4 |
|---|---|---|---|
| {% for entry in project_disciplines_final %}{{ entry.values() | first[0] }} | {{ entry.values() | first[1] }} |
内容的提问来源于stack exchange,提问作者Luc
相关产品推荐
相关产品推荐

