You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:37:13