用python帮你生产指定内容的word文档
很多岗位经常发送模板化的内容,比如给员工发送工资条信息,实际上改动的地方只有有限的几个字段,诸如姓名、岗位、底薪、补助等,而其他部分内容基本不改动。
如果能用python自动化填充需要调整的字段,那么工作量将会大大降低。docxtpl可以让我们实现docx文件的自动化批量生成。
!pip3 install docxtpl
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Requirement already satisfied: docxtpl in /usr/local/lib/python3.7/site-packages (0.6.3)
Requirement already satisfied: lxml in /usr/local/lib/python3.7/site-packages (from docxtpl) (4.4.1)
Requirement already satisfied: six in /usr/local/lib/python3.7/site-packages (from docxtpl) (1.12.0)
Requirement already satisfied: python-docx<=0.8.7 in /usr/local/lib/python3.7/site-packages (from docxtpl) (0.8.7)
Requirement already satisfied: jinja2 in /usr/local/lib/python3.7/site-packages (from docxtpl) (2.10.3)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/site-packages (from jinja2->docxtpl) (1.1.1)
最简单的模板,只填充文本内容。
假设这是工资条模板,我们需要在docx内做标记告诉python哪些地方需要填充内容。这里使用到jinja2标记方式, 如下图{{variablename}}是需要填充的变量名
我在template文件夹内建立来一个"工资条.docx"模板,其中的jinja模板内容如下
docx文件中的varibalename会在python代码的字典中当作关键词承接相应的值,比如下面的代码会生成张三.docx
from docxtpl import DocxTemplate
doc = DocxTemplate("template/工资条.docx")
context = {'name' : "张三",
'occupation': '销售',
'base': 3000,
'food':1000,
'transport': 2000,
'bonus': 5000,
'salary': 11000}
doc.render(context)
doc.save("output/张三.docx")
运行结果
更复杂一点,在模板中插入图片。插入图片稍微麻烦一点,需要InlineImage对象,具体参考例子
from docxtpl import DocxTemplate, InlineImage
from docx.shared import Mm #毫米
doc = DocxTemplate("template/感谢信.docx")
#定义插入的图片
picture = InlineImage(doc,
'img/感谢有你.jpg',
width=Mm(50),
height=Mm(30))
#插入docx的内容
context = {'name' : "张三",
'thankpicture': picture}
#插入dd
doc.render(context)
doc.save("output/感谢张三.docx")
运行结果
from docxtpl import DocxTemplate, RichText
from docx.shared import Mm #毫米
doc = DocxTemplate("template/百度.docx")
#定义超链接
rt = RichText('百度一下你就知道',
#超链接的url
url_id=doc.build_url_id('https://www.baidu.com/'))
#插入docx的内容
context = {'baiduclick' : rt}
#插入dd
doc.render(context)
doc.save("output/百度click.docx")
运行结果
jupyter notebook代码获取方式,公众号后台回复关键词“20200116”