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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐