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. windows音频设备图像隔离audiodg.exe占用内存高(停止与重启audiodg服务)

    首先想到的办法是结束该进程,于是在任务管理器里结束进程后,内存是释放了,但是发现发现电脑没有声音去到电脑的system32目录下双击audiodg.exe后任然没有声音解决方法如下(重启audiodg ...

  2. selenium 使用ddt,运行提示错误信息no such test method

    测试用例test_asg测试数据是通过ddt的方式添加,使用suite.addTest方法添加该用例提示错误信息no such test method in <class 'unitest_lo ...

  3. 使用Vue脚手架

    关于不同版本的Vue: vue.js与vue.runtime.xxx.js的区别: (1) vue.js是完整版的Vue,包含: 核心功能+模板解析器 (2) vue.runtime.xxx.js是运 ...

  4. 最近写了一个demo,想看看java和go语言是怎么写的

    最近写了一个demo:demo的github地址 一. 简单介绍 1. Server端 它是一个WebApi服务,把它当成一个黑盒就行了. 2. MiddleServer端 是重点,它是一个WebAp ...

  5. 【读书笔记】排列研究-模式避免-基础Pattern Avoidance

    目录 模式避免的定义 避免Pattern q 的n-排列计数\(S_n(q)\) q长度是2 q长度是3 对一些模式q,做\(S_n(q)\)的阶估计 Backelin, West, and Xin给 ...

  6. DES算法流程

    初始置换IP 表格的使用方法: 将输入的64bit的明文从1开始标号,依次放入到IP初始置换表中数字对应的位置.填充完毕后,按照行优先的顺序从第1行开始依次读取获得输出. 16轮轮结构 整体结构 因为 ...

  7. P/Invoke之C#调用动态链接库DLL

    本编所涉及到的工具以及框架: 1.Visual Studio 2022 2..net 6.0 P/Invok是什么? P/Invoke全称为Platform Invoke(平台调用),其实际上就是一种 ...

  8. KMP算法的研究

    前脚学后脚忘,是时候给自己通俗易懂的总结一下了 KMP是什么 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个字符串S内查找一个词W的出现位置.一个词在不 ...

  9. idea 热部署插件JRebel

    idea 热部署插件JRebel ​ 当开始开发web项目的时候,需要频繁的修改web页面,此时如果频繁的重启变得很麻烦,因此,可以在idea中集成JRebel插件,改动代码之后不需要重新启动应用程序 ...

  10. pysimplegui之tiee实例(附带github仓库地址)

    今天想写一个文件管理器,结果整了一下午,还是自己看的源代码少,分析别人代码少,最终还是看别人代码才找到错误原因.#!/usr/bin/env python import sys import os i ...