Python:Docx文档模板创建使用

✨博文作者 wangzirui32
喜欢的可以 点赞 收藏 关注哦~~
本文首发于CSDN,未经许可禁止转载

Hello,大家好,我是wangzirui32,今天我们来学习Docx文档模板创建与使用,开始学习吧!

1. Docxtpl

Docxtpl是用于快速处理Word模板填充的Python第三方库,它的安装命令如下:

pip install docxtpl

安装完毕后,即可开始学习。

2. Word模板编写

新建一个Word文档(*.docx),根据类似Jinja2模板的语法,写出如下示例模板:
Python:Docx文档模板创建使用_第1张图片
Tips: 这里根据笔者的全国GDP分析预测文章(传送门)制作了文档模板。
这里简单叙述一下模板语法:

2.1 插值语法

插入一段文本或图片或其它内容的语法如下:

{{ 变量名 }}

2.2 循环,判断语法

循环语法如下:

{%tag for i in items %}
{{ i }}  # 每次循环渲染的内容
{%tag endfor %}

判断语法如下:

{%tag if 变量/布尔值 %}
{{ content }}
{%tag endif %}

这里的tag解释如下:
此时这里的语法与Jinja2有些不同,我们需要在原有的语句中根据实际插入内容进行选择,如刚才的示例模板里的表格循环:

{%tr for d in gdp_data %}
...
{%tr endfor %}

这里我们在语句前加了tr,代表这是表格行的循环,这将会提示Docxtpl在渲染结束后删除有这些语句的行。
类似的语法还有以下常见的几种:

{%p jinja2_tag %} # 段落
{%tr jinja2_tag %} # 表格行
{%tc jinja2_tag %} # 表格列

这里特别说明一下段落的使用,如果你想使用语句来生成段落的话,不要这样写:

{%p jinja2_tag %}content{%p end... %}

而应该这样写:

{%p jinja2_tag %}
content
{%p end... %}

这是因为,Word文档自动把同一行的内容视作一个段落,在渲染完毕后,Docxtpl会把含有这些辅助的语句所在段落删除,从而导致把渲染的内容也删除了。同理,这种特性对其它情况也仍然存在。

3. 渲染模板

创建一个新Python文件(*.py),写入如下示例代码:

import jinja2
from docxtpl import DocxTemplatefrom docxtpl import InlineImage
from docx.shared import Mm
# 年份
years = [2010, ... , 2021]
# 数据来源:data.stats.gov.cn 国家统计局 (单位:亿元)
# 第一季度
gdp_Q1 = [87501.3, ... ,247985.0]
# 第二季度
gdp_Q2 = [99347.4, ... ,281528.0]
# 第三季度
gdp_Q3 = [105963.7, ... ,289919.3]
# 第四季度
gdp_Q4 = [119306.8, ... , 324237.4]
# 全年GDP总和
gdp_all_year = [412119.3, ... ,1143669.7]
gdp_data = list(zip(years, gdp_Q1, gdp_Q2, gdp_Q3, gdp_Q4, gdp_all_year))
tpl = DocxTemplate('template.docx')
context = {"gdp_data": gdp_data,
	       "p1": InlineImage(tpl, 'p1.png', width=Mm(175),height=Mm(95)),    
	       "p2": InlineImage(tpl, 'p2.png', width=Mm(175),height=Mm(95)),    
	       "fit": "全年总值 = 第一季度总值 * 0.2041 + 第二季度总值 * 3.8656 + 9671.4240"}
jinja_env = jinja2.Environment() # Jinja2环境 可以自定义渲染规则 默认就行了
tpl.render(context, jinja_env)
tpl.save("output.docx")

这里我们需要先读入模板(DocxTemplate对象),然后生成渲染字典(context),指定每个变量名指代的具体内容,最后生成Jinja2的渲染环境,用render传入并渲染模板,输出到output.docx文件中。
提示:我们可以用InlineImage对象插入图片,可以指定长与宽,如上文代码所示。

4. 最终效果

程序生成的最后效果如下:
Python:Docx文档模板创建使用_第2张图片
可以看到,表格、图片、文字均已正确插入。


好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!

你可能感兴趣的:(Python,Python番外篇,Python模块介绍使用,python,自动化,word)