如何用Jinja将Pandas DataFrame填充至Word文档表格?
问题分析与解决办法
核心问题是数据结构和Jinja模板的匹配度问题:你当前的improvementDict是按列存储数据(每个键对应整列的所有值),但docxtpl填充表格需要的是按行存储的结构(每个元素代表一行的所有字段),再配合对应模板语法才能正确生成多行数据。
1. 修正数据结构
把列导向的字典改成行导向的列表,最简单的方式是用Pandas的to_dict('records')方法直接生成:
from docxtpl import DocxTemplate doc = DocxTemplate("weekly-report-template.docx") # 筛选数据 improvementDF = excel_file.loc[excel_file["Issue Type"] == "Improvement"] # 重命名列并生成行列表:每个元素是一行的字典 improvement_rows = improvementDF.rename(columns={ 'Issue key': 'improvKey', 'Summary': 'improvTitle', 'Custom field (RelNote Description)': 'improvNotes' }).to_dict('records') # 填充内容的结构调整 fill_content = {'improvementTable': improvement_rows} doc.render(fill_content) doc.save('TEST.docx')
生成的improvement_rows结构示例:
[ {"improvKey": "E-1234", "improvTitle": "Test Title 1", "improvNotes": " "}, {"improvKey": "E-1235", "improvTitle": "Test Title 2", "improvNotes": " "}, {"improvKey": "E-1236", "improvTitle": "Test Title 3", "improvNotes": " "} ]
2. 修正Word模板的Jinja语法
打开你的weekly-report-template.docx,找到目标表格,按以下方式设置模板标签:
- 选中需要重复的表格行,在该行开头插入循环起始标签:
{% for row in improvementTable %} - 在该行的三个单元格里分别填入:
{{ row.improvKey }}、{{ row.improvTitle }}、{{ row.improvNotes }} - 在该行末尾插入循环结束标签:
{% endfor %}
如果不会用Word的域工具,直接在单元格内手动输入标签即可,确保循环标签完整包裹住要重复的行。
之前写法出错的原因
- 列导向的数据结构,若模板循环遍历列键,会导致每个单元格填入整个列表,出现“所有数据挤在一行”的情况;
- 空白行则是因为模板语法与数据结构不匹配,无法正确解析列表中的单个值,最终渲染出空内容。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

