网站首页 > 博客文章 正文
由于工作原因,我会经常的出word版的数据分析报告,有一天我突然想,既然Excel的数据都是用python做的,而且报告的内容几乎都是不变的,变的只是里面的数值,那为什么我还要把分析结果的数值,一边用眼睛看一边往word里填呢。
在网上找资料,看看哪个库能操作word,最后用的python-docx这个库,说实在的感觉在自动化处理word文档这块,还真是一言难尽啊!不管是python-docx对word段落的操作,还是我最后用的win32com.client,由于word文档内容的千变万化,感觉想让word自动化帮你写报告就是个笑话。还不如直接用word软件直接一个一个字打呢,要么就来个Chat GPT帮你写个报告。
不过为什么最后没用python-docx这个库,那是因为为了让python-docx能找到word文档中要填数据的段落,就需要把填数据的地方改成粗体,这就导致用python填完数据后,还需要把字体改回去。最后才选的用win32com.client这个库,用python操作word的vba对象去做这件事。不过操作思路都是一样的。
好了正式开始,先拿个简单的例子讲。
门店数据
下图是,每周要生成的报告,简单写了一个,为了看出python操作Word的效果,我把不同字段改成了不同样式
首先导入数据
import pandas as pd
filepath=r"D:\门店数据.xlsx"
colindex=['序号','门店','类别','产品名称','进价','进货总价','库存']#用列表构建一个新的表头
df=pd.read_excel(filepath,sheet_name='Sheet1',header=None,names=colindex,skiprows=3)
fillcol=['序号','门店']
for i in fillcol:#先填充不需要分组填充的数据
df[i].fillna(method='ffill', inplace=True)
df['类别']=df.groupby('序号')['类别'].ffill()
df
导入后的数据
生成汇总数据
pt=pd.pivot_table(df,values=['进货总价','类别','产品名称'],index=['门店'],aggfunc={'进货总价':sum,'类别':pd.Series.unique,'产品名称':pd.Series.unique},margins=True)
pt
数据汇总结果
为了能让python帮我向word里添加数据,我唯一能想到的是,把要总修改的数据,在word里面用特殊符号标识上,然后让程序替换相应的标识符号,最后想来想去用花括号里面放数字的方法最合适了。修改下总结报告,做一个模版。
k = {'{' + str(i) + '}': pd.NaT for i in range(0, 10)}
#生成一个字典,用于对应模版中的标识符号
#把对应的数据复制给相应标识符号的key
for i,v in enumerate(pt.index):
if v!='All':
cls='、'.join(pt.loc[v,'类别'])
clslen=len(pt.loc[v,'类别'])
clsname=len(pt.loc[v,'产品名称'])
totp=pt.loc[v,'进货总价']
k['{'+str(i)+'}']='{}现出售{}共{}类{}种产品,总进价{}元'.format(v,cls,clslen,clsname,totp)
else:
k['{'+str(3)+'}']=','.join(pt.loc[v,'类别'])
k['{'+str(4)+'}']=len(pt.loc[v,'类别'])
k['{'+str(5)+'}']=len(pt.loc[v,'产品名称'])
k['{'+str(6)+'}']=pt.loc[v,'进货总价']
k['{7}']='2088年6月18日'
k
最后标识符号字典的结果
可以进行替换模版了
import win32com.client as win32
wfile=r"D:\分析报告模板.docx"
words = win32.gencache.EnsureDispatch('Word.Application')
words.Visible = True
docs = words.Documents
outputs = docs.Open(wfile)
for sy, zhi in k.items():
if pd.notnull(zhi):
docs.Application.Selection.Find.Text = sy # 要查找的值
docs.Application.Selection.Find.Replacement.Text = zhi # 要替换的值
docs.Application.Selection.Find.Execute(Replace=2) # 执行替换
最后的结果
文章到此结束
- 上一篇: NAT技术:一文搞懂计算机内外网IP地址转换
- 下一篇: 一文掌握NAT网络地址转换原理与介绍
猜你喜欢
- 2025-01-18 防火墙NAT配置,配置NAT静态转换,配置NAT动态转换PAT及No-PAT模式
- 2025-01-18 四种网路类型外网穿透力与优化方法
- 2025-01-18 运维自动化之实用python代码汇总
- 2025-01-18 通过Python实现内网穿透的几种方式?
- 2025-01-18 小科普 | 联机游戏卡顿?改善你的NAT类型吧
- 2025-01-18 如何用Python实现神经网络(附完整代码)
- 2025-01-18 公司内网用户如何通过NAT地址访问外网,一文读懂!
- 2025-01-18 从联机游戏学习NAT类型
- 2025-01-18 python-网络编程总结
- 2025-01-18 工业路由器网关的网络协议之NAT技术
你 发表评论:
欢迎- 367℃用AI Agent治理微服务的复杂性问题|QCon
- 360℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)