龙空技术网

干货分享:用python做完数据分析后再帮你把数据填到word报告里?

睡觉偷懒的肥猫 1304

前言:

现在看官们对“python如何把数据写入到word”都比较注意,咱们都想要知道一些“python如何把数据写入到word”的相关知识。那么小编在网络上收集了一些对于“python如何把数据写入到word””的相关内容,希望朋友们能喜欢,看官们快快来了解一下吧!

#暑期创作大赛#

由于工作原因,我会经常的出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 pdfilepath=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)}#生成一个字典,用于对应模版中的标识符号#把对应的数据复制给相应标识符号的keyfor 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 win32wfile=r"D:\分析报告模板.docx"words = win32.gencache.EnsureDispatch('Word.Application')words.Visible = Truedocs = words.Documentsoutputs = 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)  # 执行替换

最后的结果

文章到此结束

标签: #python如何把数据写入到word