✨博文作者 wangzirui32
💖 喜欢的可以 点赞 收藏 关注哦~~
👉本文首发于CSDN,未经许可禁止转载
😎Hello,大家好,我是wangzirui32,今天我们来学习Docx文档模板创建与使用,开始学习吧!
1. Docxtpl
Docxtpl
是用于快速处理Word模板填充的Python第三方库,它的安装命令如下:
pip install docxtpl
安装完毕后,即可开始学习。
2. Word模板编写
新建一个Word文档(*.docx
),根据类似Jinja2模板的语法,写出如下示例模板:
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. 最终效果
程序生成的最后效果如下:
可以看到,表格、图片、文字均已正确插入。
🎉🎉🎉 好了,今天的课程就到这里,我是wangzirui32,喜欢的可以点个收藏和关注,我们下次再见!