• 【Python】python使用docxtpl生成word模板


    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 格式的一个报告。

  • 相关阅读:
    Java SE 9 新增特性
    【Java对象实例与文件之间互转】
    惊了,国外顶级架构师编写DDD领域驱动设计总结,看到内容后破防了
    C++之weak_ptr与shared_ptr智能指针实例(一百九十五)
    ArrayList扩容源码解析
    【方向盘】JVM除了HotSpot,你还知道哪些?
    springboot中使用页面国际化-i18n
    HTML基础知识
    Oracle SQL执行计划(1)
    Kfka监控工具--Kafka-eagle安装
  • 原文地址:https://blog.csdn.net/wjianwei666/article/details/132605366