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 格式的一个报告。工作也完成了

参考:

1、https://www.jianshu.com/p/758679db62ce

2、https://www.jianshu.com/p/465516750da6

python使用docxtpl生成word模板的更多相关文章

  1. python基于word模板批量生成word文件

    1.需要用到docxtpl库,用于操作word模板 安装:pip insatll docxtpl 处理之前的word模板 处理后的word 下面直接上代码揭开它的神秘面纱:第一步,读取excel中的内 ...

  2. Python生成word

    Python生成word 使用python-docx-template库, 将html转为word. python-docx-template可以使用类似jinja2的模板语法. 依赖docx库, 安 ...

  3. windows&lunix下node.js实现模板化生成word文件

    最近在做了一个小程序!里面有个功能就是根据用户提交的数据,自动生成一份word文档返回给用户.我也是第一次做这功能,大概思路就是先自己弄一份word模板,后台接受小程序发过来的数据,再根据这些数据将相 ...

  4. 根据指定Word模板生成Word文件

    最近业务需要批量打印准考证信息 1.根据Table数据进行循环替换,每次替换的时候只替换Word中第一个Table的数据, 2.每次替换之后将Word中第一个Table数据进行复制,将复制Table和 ...

  5. JSP利用freemarker生成基于word模板的word文档

    利用freemarker生成基于word模板的word文档 freemarker简介 FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出.FreeMarker与Web容器 ...

  6. C# 利用WORD模板和标签(bookmark) 批量生成WORD

    前言: 由于对C#操作WORD不熟悉,也就留下这么一篇水文,别吐糟...=_=||| 利用Microsoft.Office.Interop.Word (2003版也就11版)——因为部分客户端还是用O ...

  7. C#读取Word模板替换相应的字符串(标签)生成新的Word

    在平常工作中,生成word的方式主要是C#读取html的模板文件处理之后保存为.doc文件,这样的好处是方便,快捷,能满足大部分的需求.不过有些特殊的需求并不能满足,如要生成的Word为一个表格,只是 ...

  8. velocity模板技术生成word文档

    本文介绍採用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容例如以下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项 ...

  9. 利用html模板生成Word文件(服务器端不需要安装Word)

    利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...

  10. 使用freemarker模板引擎生成word文档的开发步骤

    1.准备模板文档,如果word文档中有表格,只保留表头和第一行数据:2.定义变量,将word文档中的变量用${var_name}替换:3.生成xml文件,将替换变量符后的word文档另存为xml文件: ...

随机推荐

  1. HTML笔记(二) HTML标签元素

    一 常用的头部元素标签 <head>元素包含了所有的头部标签元素. 1.<title> <title>标签定义了HTML文档的标题,在HTML/XHTML文档中是必 ...

  2. Mysql用户及其权限

    一.创建用户 create user 'user_name' identified by 'password'; 二.用户授权 grant [权限名] on 数据库名.表名 to user_name ...

  3. TensorFlow 的 Graph 模式转换

    定义 TensorFlow 图形并将其保存到磁盘上. 使用 TensorFlow 的 tf.Graph() 和 tf.Session() 函数来定义和运行 TensorFlow 图形,并使用 tf.t ...

  4. Android Studio Dolphin 稳定版正式发布

      作者 / Yuri Blaise, Product Manager, Android为了帮助开发者们更轻松地打造高质量应用,Android Studio 团队深入调研,为大家带来了最新稳定版 An ...

  5. 把OSC_IN/OSC_OUT引脚作为GPIO端口PD0/PD1

    外部振荡器引脚OSC_IN/OSC_OUT可以用做GPIO的PD0/PD1,通过设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现.这个重映射只适用于36. 48和64脚的封装(100脚和 ...

  6. 9. 实现包括前端后台的预约洗狗功能 - 使用Power Automate发送预约邮件 - 使用Power Automate发送带选择按钮(option)的邮件

    ​ 除了发送普通的电子邮件外,我们还可以选择发送带选项的电子邮件来得到客户的反馈,下面我们就一起来创建带有选择功能的电子邮件吧. 1. 打开我们的Power Portal,在左侧导航栏选择流,点击左上 ...

  7. python之序列化与反序列化

    #!/usr/bin/env python# -*- coding:utf-8 -*-#Author:QiFeng Zhang'''序列化反序列化之json应用'''import json #导入js ...

  8. IDEA-日志管理神器

    Grep Console-插件的好处就在于能使控制台输出日志时,可以直接修改插件中定义好的规则,也可以根据自己定义的规则,输出不同的颜色.这样就可以将错误信息标记成显眼的颜色,方便查看,提高bug寻找 ...

  9. 从零开始学习 Java 系列之你为什么要学 Java?

    全文大约[4000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货! 在正式开始本系列教程之前,壹哥希望先用一篇文章,来扫清你学习前的认知障碍.请坚定自己的学习信念,不要半途而废浪费时间,壹哥希 ...

  10. CF1801B题解

    CF1801B题解 传送门 更好的阅读体验 简化题意:有 n 个商店,每个商店卖 a,b 两种商品,价格分别为 \(a_i,b_i\),你需要在每个商店买一个商品,并且不能在所有商店都买同一种商品,最 ...