1、python-docx-template简介
python-docx库来创建word文档,但是对于文档的修改功能并不灵活。python-docx-template 模块主要依赖两个库, python-docx用于读取,编写和创建子文档 , jinja2用于管理插入到模板docx中的标签 。 其基本思路是利用jinja2制作Word模板,并动态向模板中插入文字、图片、表格等内容。
pip install docxtpl
文档:
1)https://docxtpl.readthedocs.io/en/latest/
2)https://pypi.org/project/docxtpl/
3)https://github.com/elapouya/python-docx-template
2、文档的打开、数据渲染、关闭
docx 模板:
这是一个模板:{{template}}
这是一个Word文件
执行代码:
from docxtpl import DocxTemplate
tpl = DocxTemplate('test.docx') # 打开docx文件
# 要装入的数据信息
context = {
'template': 'Hello World!'
}
tpl.render(context) # 填充数据
tpl.save('test1.docx') # 保存文件操作
结果:
这是一个模板:Hello World!
这是一个Word文件
3、嵌入图片
可以动态地将一个或多个图像添加到文档中。只需 {{ xxx }} 在模板中添加标记。指定模板对象,图像文件路径以及可选的宽度和/或高度。对于高度和宽度,必须使用毫米(Mm),英寸(Inches)或点(Pt)类。
docx 模板:
插入一个图片:{{ myimage }}
执行代码:
from docxtpl import InlineImage, DocxTemplate
from docx.shared import Mm
import jinja2
# 打开docx文件
tpl = DocxTemplate('test.docx')
# 要装入的数据信息
context = {
'template': 'Hello World!',
'myimage': InlineImage(tpl, 'happy.jpg', width=Mm(20)),
}
jinja_env = jinja2.Environment(autoescape=True)
# 填充数据
tpl.render(context, jinja_env)
# 保存文件操作
tpl.save('test_temp.docx')
结果:
4、docxtpl的Jinja2专属标签
docxtpl的类语法包含%p,%tr,%tc,%r。
{%p jinja2_tag %} for paragraphs 段落,对应docx.text.paragraph.Paragraph对象
{%tr jinja2_tag %} for table rows 表格中的一行,对应docx.table._Row对象
{%tc jinja2_tag %} for table columns 表格中的一列,对应docx.table._Column对象
{%r jinja2_tag %} for runs 段落中的一个片段,对应docx.text.run.Run对象
PS:这四种标签,起始标签不能在同一行,必须在不同的行上面,否则无法正确渲染。
{%p if display_paragraph %}
Here is my paragraph
{%p endif %}
表格处理与合并单元格:
1)水平合并单元格
在for循环中要合并的单元格内容前面补充:
{% hm %}
2、垂直合并单元格
在for循环中要合并的单元格内容前面补充:
{% vm %}
参考文章:
1、【python】利用docxtpl和Jinja2生成基于模板的Word文档
【python】利用docxtpl和Jinja2生成基于模板的Word文档-腾讯云开发者社区-腾讯云
2、快速生成定制化的Word文档:Python实践指南(插入柱状图、饼状图)
https://zhuanlan.zhihu.com/p/629766157