双轨网站开发号码认证
python使用docxtpl生成word模板
python-docxtpl包简单使用和实战,Python处理word,docx文件。
 最近需要处理一些爬虫得到的数据来进行一些自动化报告的操作,因为需要生成的是word的报告,所以估选用docxtpl库来直接生成模板
docxtpl 模板标签主要来自jinja2,可以了解 jinja2语法,也有些额外的不一样,可以自行百度或者参考官方文档
开始
使用Pip安装docxtpl
pip install docxtpl
 简单demo
 根据官网的简单举例:
from docxtpl import DocxTemplate
 doc = 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 格式的一个报告。
