docxtpl
是一个 Python 库,用于处理 Microsoft Word 文档(.docx),它允许你使用 Jinja2 模板引擎来插入动态内容。Jinja2 是一个强大的模板引擎,用于生成文本输出,特别适合于 HTML Web 页面,但也适用于任何基于文本的格式,包括 Word 文档。
在 Jinja2 中,你可以使用多种类型的变量和控制结构:
{{ variable }}
{% if condition %} ... {% endif %}
{% for item in list %} ... {% endfor %}
假设我们有一个嵌套字典列表,我们想要将其插入到一个 Word 文档中:
from docxtpl import DocxTemplate
# 嵌套字典列表示例
data = [
{
'name': 'Alice',
'scores': {'math': 90, 'science': 85},
'courses': ['Math', 'Science']
},
{
'name': 'Bob',
'scores': {'math': 88, 'science': 92},
'courses': ['Math', 'History']
}
]
# 加载模板文档
doc = DocxTemplate('template.docx')
# 渲染模板
context = {'students': data}
doc.render(context)
# 保存结果
doc.save('output.docx')
在 template.docx
中,你可以使用 Jinja2 语法来插入数据:
{% for student in students %}
<p>Name: {{ student.name }}</p>
<ul>
{% for subject, score in student.scores.items() %}
<li>{{ subject }}: {{ score }}</li>
{% endfor %}
</ul>
<p>Courses:</p>
<ul>
{% for course in student.courses %}
<li>{{ course }}</li>
{% endfor %}
</ul>
{% endfor %}
问题:如果数据中的某个字段缺失,可能会导致模板渲染失败。
解决方法:使用 Jinja2 的 default
过滤器来提供默认值,或者在 Python 代码中预处理数据,确保所有必要的字段都存在。
<p>Name: {{ student.name | default('Unknown') }}</p>
或者在 Python 中:
for student in data:
student.setdefault('name', 'Unknown')
# ... 其他字段的默认值设置
通过这种方式,你可以确保即使某些数据缺失,模板也能正确渲染,而不会抛出异常。
领取专属 10元无门槛券
手把手带您无忧上云