docxtpl
docxtpl 是一个基于 python-docx 的模板库,可以使用 Jinja2 模板语法批量生成 Word 文档。
安装
pip install docxtpl
基本使用
from docxtpl import DocxTemplate
# 加载模板
doc = DocxTemplate("template.docx")
# 准备数据
context = {
'name': '张三',
'age': 25,
'city': '北京',
'hobbies': ['阅读', '编程', '旅行']
}
# 渲染模板
doc.render(context)
# 保存文档
doc.save("output.docx")
print("文档已生成")
模板示例
# 在 Word 模板中使用以下语法:
# 简单变量
# {{ name }}
# 条件判断
# {% if age >= 18 %}
# 成年人
# {% else %}
# 未成年
# {% endif %}
# 循环
# {% for hobby in hobbies %}
# - {{ hobby }}
# {% endfor %}
# 表格
# | 姓名 | 年龄 | 城市 |
# |------|------|------|
# {% for person in persons %}
# | {{ person.name }} | {{ person.age }} | {{ person.city }} |
# {% endfor %}
批量生成文档
from docxtpl import DocxTemplate
# 加载模板
template = DocxTemplate("template.docx")
# 准备数据列表
data_list = [
{'name': '张三', 'age': 25, 'city': '北京'},
{'name': '李四', 'age': 30, 'city': '上海'},
{'name': '王五', 'age': 28, 'city': '广州'}
]
# 批量生成文档
for i, data in enumerate(data_list):
context = {'person': data}
template.render(context)
template.save(f"output_{i+1}.docx")
print(f"已生成: output_{i+1}.docx")
使用图片
from docxtpl import DocxTemplate
from docx.shared import Inches
# 加载模板
doc = DocxTemplate("template.docx")
# 准备数据(包含图片)
context = {
'name': '张三',
'photo': 'photo.png' # 图片路径
}
# 渲染模板
doc.render(context)
# 保存文档
doc.save("output_with_image.docx")
复杂模板
from docxtpl import DocxTemplate
from datetime import datetime
# 加载模板
doc = DocxTemplate("invoice_template.docx")
# 准备发票数据
context = {
'invoice_number': 'INV-2026-001',
'date': datetime.now().strftime('%Y-%m-%d'),
'customer': {
'name': '某某公司',
'address': '北京市朝阳区',
'phone': '010-12345678'
},
'items': [
{'name': '产品A', 'quantity': 2, 'price': 100.00},
{'name': '产品B', 'quantity': 1, 'price': 200.00},
{'name': '产品C', 'quantity': 3, 'price': 50.00}
],
'total': 450.00
}
# 渲染模板
doc.render(context)
# 保存发票
doc.save("invoice_2026_001.docx")
💡 提示:docxtpl 非常适合批量生成格式统一的文档,如合同、发票、报告等。