【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.now4:6 + '.' + self.now6: # 现在时间

self.last = self.last4:6 + '.' + self.last6: # 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 格式的一个报告。

相关推荐
疋瓞3 小时前
python和C++对比(1)_数据类型和数据结构
数据结构·c++·python
如此这般英俊4 小时前
手搓Claude Code-第六章 subagent
数据结构·人工智能·python·语言模型·自然语言处理
元Y亨H5 小时前
Python - FastAPI 全方位介绍
python·fastapi
error:(7 小时前
【系统与实战双精通】VS Code 调试 ROS2 Python 节点与 Launch 系统指南
android·java·python
weigangwin7 小时前
LlamaIndex 第一次试用:别先写 RAG Demo,先验上下文合同
python·ai·agent·rag·检索·llamaindex·观测性
省四收割者7 小时前
一文详解信号完整性(1)
python·嵌入式硬件·数学建模·信息与通信·信号处理·智能硬件
ai生成式引擎优化技术8 小时前
从知识连接到智能组织:WSaiOS认知网络的理论框架与系统设计摘要
网络·python·plotly·django·pygame
用户8356290780518 小时前
使用 Python 保护和取消保护 Excel 工作表和工作簿
后端·python
骑士雄师8 小时前
大模型:临时会话
开发语言·python
CodeStats8 小时前
【编程语言】深度梳理C/C++、Java、Python、Go、Rust的区别
java·linux·c语言·c++·python·rust·go