python使用docxtpl生成word模板
python-docxtpl包简单使用和实战python处理worddocx文件">python-docxtpl包简单使用和实战,Python处理word,docx文件。
最近需要处理一些爬虫得到的数据来进行一些自动化报告的操作,因为需要生成的是word的报告,所以估选用docxtpl库来直接生成模板
docxtpl 模板标签主要来自jinja2,可以了解 jinja2语法,也有些额外的不一样,可以自行百度或者参考官方文档
开始
使用Pip安装docxtpl
pip install docxtpl
简单demo
根据官网的简单举例:
from docxtpl import DocxTemplatedoc = DocxTemplate("my_word_template.docx") # 读取模板
context = { \'company_name\' : "World company" } # 需要传入的字典, 需要在word对应的位置输入 {{ company_name }}
doc.render(context) # 渲染到模板中
doc.save("generated_doc.docx") # 生成一个新的模板
至此,就可以直接拿来实战了, 实战中包含了图片的替换和表格文本的一些插入。都是很简单的,就是将组成的字典渲染到word中去就可以
实战
#!/usr/bin/env python# -*- encoding: utf-8 -*-
\'\'\'
@File : generate_word.py
@Time : 2021/05/28 15:52:57
@Author : OD
@Version : 1.0
\'\'\'
# here put the import lib
from docx import Document
from docx.shared import Pt
import datetime
from docxtpl import DocxTemplate, RichText, InlineImage
from docx.shared import Mm
import json
# 根据模板生成一个周报内容
class Generate2Word:
def __init__(self):
self.now = str(datetime.date.today() - datetime.timedelta(days=0)).replace("-", "").replace(" ", "")
self.last = str(datetime.date.today() - datetime.timedelta(days=7)).replace("-", "").replace(" ", "")
self.now = self.now[4:6] + \'.\' + self.now[6:] # 现在时间
self.last = self.last[4:6] + \'.\' + self.last[6:] # 7天前时间
def generate_report(self, tpl_file, report_file):
tpl= DocxTemplate(tpl_file)
# 第一个图表
context = {
\'start_time\' : self.last,
\'end_time\' : self.now,
\'total_attention\': 123,
\'add_attention\': 20,
\'dau\': 100,
\'dau_per\':20 / 100,
\'theme_tiezi\':1234,
\'all_tiezi\': 12345,
\'add_theme_tiezi\': 25,
\'add_tiezi\': 20,
\'official_pub\':12,
\'del_tiezi\': 5,
}
image1_path = r\'1.png\' # 要生成的图片地址
image2_path = r\'2.png\' # 要生成的图片地址
insert_image1 = InlineImage(tpl, image1_path, width=Mm(140))
insert_image2 = InlineImage(tpl, image2_path, width=Mm(140))
# 作为图片的替换
img_context = {
\'img1\': insert_image1,
\'img2\': insert_image2
}
# 管理帖子,需要渲染
bawu_lists = {
"bawu_table":
[{
\'publish_time\': \'2021/5/7\',
\'title\': \'测试1\',
\'link\': \'https://www.baidu,com,
\'reply_num\': 27
},
{
\'publish_time\': \'2021/5/8\',
\'title\': \'测试2\',
\'link\': \'https://www.baidu,com\',
\'reply_num\': 4
},
{
\'publish_time\': \'2021/5/31\',
\'title\': \'湖人浓眉伤退\',
\'link\': \'https://www.baidu,com\',
\'reply_num\': 40
},
{
\'publish_time\': \'2021/6/2\',
\'title\': \'勒布朗詹姆斯率队拿下g5\',
\'link\': \'https://www.baidu,com\',
\'reply_num\': 444
}
],
"navy_table":
[{
\'publish_time\': \'2021/4/23\',
\'title\': \'测试3\',
\'link\': \'https://www.baidu,com\',
\'reply_num\': 444
},
{
\'publish_time\': \'2021/4/30\',
\'title\': \'测试4\',
\'link\': \'https://www.baidu,com\',
\'reply_num\': 444
},
{
\'publish_time\': \'2021/5/30\',
\'title\': \'测试5\',
\'link\': \'https://www.baidu,com\',
\'reply_num\': 444
}
]
}
bawu_summary = dict()
bawu_sum_reply = 0 # 总有多少个回复
for bawu_data in bawu_lists.get(\'bawu_table\'):
bawu_summary[\'bawu_publish_num\'] = len(bawu_lists.get(\'bawu_table\', 0))
bawu_sum_reply += int(bawu_data.get(\'reply_num\', 0))
bawu_summary[\'bawu_sum_reply\'] = bawu_sum_reply
navy_summary = dict()
navy_sum_reply = 0
for navy_data in bawu_lists.get(\'navy_table\'):
navy_summary[\'navy_publish_num\'] = len(bawu_lists.get(\'navy_table\', 0))
navy_sum_reply += int(navy_data.get(\'reply_num\', 0))
navy_summary[\'navy_sum_reply\'] = navy_sum_reply
tpl.render({**context, **img_context, ** bawu_lists, **bawu_summary, **navy_summary}) # 多个字典解构
print(\'生成模板成功...\')
tpl.save(report_file)
def main(self):
tpl_file = "文件模板.docx" # 指定的模板
report_file = f"新得{self.last}-{self.now}报告.docx" # 指定生成的报告位置
self.generate_report(tpl_file, report_file)
if __name__ == \'__main__\':
demo = Generate2Word()
demo.main()
这样 就可以生成一个保留 word 格式的一个报告。工作也完成了
参考:
1、https://www.jianshu.com/p/758679db62ce
2、https://www.jianshu.com/p/465516750da6
以上是 python使用docxtpl生成word模板 的全部内容, 来源链接: utcz.com/z/388368.html