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
