用Python自動(dòng)生成數(shù)據(jù)日?qǐng)?bào)!

其實(shí)我覺(jué)得蠻簡(jiǎn)單,核心就是你組裝好日?qǐng)?bào)的內(nèi)容模板,然后將變化的量交給python去填充,需要用到的基本就是python處理excel、word和ppt等相關(guān)的庫(kù)。熟練的使用它們,你就可以自動(dòng)化一條龍了。
日?qǐng)?bào),是大部分打工人繞不過(guò)的難題。
對(duì)于管理者來(lái)說(shuō),日?qǐng)?bào)是事前管理的最好抓手,可以了解團(tuán)隊(duì)的氛圍和狀態(tài)。可對(duì)于員工來(lái)說(shuō),那就有的聊了。對(duì)于重復(fù)性的工作,我非常推薦大家使用Python將其變成模塊化、自動(dòng)化,幫助我們實(shí)現(xiàn)高效辦公。
下面我們通過(guò)一個(gè)補(bǔ)寫銷售日?qǐng)?bào)的案例,展示一下Python自動(dòng)化辦公的優(yōu)勢(shì)。本文簡(jiǎn)化了案例的流程,在文末附有完整代碼。

需求詳解
朋友的需求是這樣的,他們平時(shí)的銷售數(shù)據(jù)是記錄在Excel上,匯總后會(huì)按照部門進(jìn)行統(tǒng)計(jì)。但是今年年初時(shí),領(lǐng)導(dǎo)突然要求寫日?qǐng)?bào),大家寫了一個(gè)月發(fā)現(xiàn)并不檢查就沒(méi)繼續(xù)寫下去。

現(xiàn)在突然被要求明天交本月之前的所有日?qǐng)?bào),這相當(dāng)于要補(bǔ)2-5月將近120天的日?qǐng)?bào),如果靠雙手復(fù)制粘貼,那估計(jì)要吐血了。朋友將其寫日?qǐng)?bào)的相關(guān)文件都發(fā)了過(guò)來(lái),發(fā)現(xiàn)最終日?qǐng)?bào)效果如下所示。

所以需求也就是比較簡(jiǎn)單了,只需要從Excel表格中讀取每日的數(shù)據(jù),使用Python將其處理后,再依次寫入Word文檔中,即可實(shí)現(xiàn)批量生成日?qǐng)?bào)。
數(shù)據(jù)處理
在進(jìn)行數(shù)據(jù)處理之前,要先了解最終需要哪些數(shù)據(jù)。如下圖所示,在目標(biāo)日?qǐng)?bào)Word中主要分為兩類:紅色標(biāo)記的數(shù)值主要是由當(dāng)日的數(shù)據(jù)、或者由它們計(jì)算后得到的數(shù)據(jù)構(gòu)成;綠色標(biāo)記的表格則更簡(jiǎn)單了,就是近七日的數(shù)據(jù)(銷售數(shù)量、銷售金額、銷售目標(biāo)、完成度)。

首先我們導(dǎo)入Pandas模塊進(jìn)行數(shù)據(jù)處理。
import pandas as pd
df = pd.read_excel("日?qǐng)?bào)數(shù)據(jù).xlsx")
df
輸出結(jié)果:

導(dǎo)入數(shù)據(jù)后,接著就可以按照我們的需求,來(lái)進(jìn)行數(shù)據(jù)運(yùn)算了。數(shù)據(jù)運(yùn)算主要分為兩種,一種是利用加 +、減 -、乘 *、除 / 進(jìn)行數(shù)據(jù)運(yùn)算,另一種是利用統(tǒng)計(jì)方法進(jìn)行數(shù)據(jù)運(yùn)算。
在交互式環(huán)境中輸入如下命令:
df["日期"] = df["日期"].apply(lambda x:x.strftime("%Y-%m-%d"))
df["當(dāng)日完成度"] = (df["銷售金額"]/df["銷售目標(biāo)"]*100).round(1)
df["累計(jì)銷售金額"] = df["銷售金額"].cumsum()
df["當(dāng)年完成度"] = (df["累計(jì)銷售金額"]/2200000*100).round(1)
df["累計(jì)銷售金額"] = (df["累計(jì)銷售金額"]/10000).round(2)
df
輸出結(jié)果:

可以看到,最終結(jié)果截圖中紅色標(biāo)記的數(shù)據(jù)內(nèi)容已經(jīng)全部被計(jì)算出來(lái)。而綠色標(biāo)記的表格則更加簡(jiǎn)單了,使用Pandas模塊中的數(shù)據(jù)選取即可。
在交互式環(huán)境中輸入如下命令:
num = 10
df.iloc[num-7:num, :5]
輸出結(jié)果:

通過(guò)這種方法就可以輕松得到某一日期的過(guò)去7日內(nèi)的日?qǐng)?bào)數(shù)據(jù)合集。
自動(dòng)生成日?qǐng)?bào)
使用Python自動(dòng)化操作Word通常會(huì)使用python-docx模塊,而批量生成Word文檔一般有兩種方法:使用add_ paragraph()、add_table()等方法給Word文檔添加各種內(nèi)容。另一種就是我們這次要用的,即按照位置替換原Word文檔中的文字和表格數(shù)據(jù)等。
在交互式環(huán)境中輸入如下命令:
for index, rows in df.iterrows():
if index > 30:
doc.paragraphs[0].runs[1].text = rows[0]
doc.paragraphs[4].runs[4].text = rows[0]
doc.paragraphs[4].runs[6].text = str(rows[1])
doc.paragraphs[4].runs[8].text = str(rows[2])
doc.paragraphs[5].runs[1].text = str(rows[3])
doc.paragraphs[5].runs[3].text = str(rows[4])
doc.paragraphs[9].runs[2].text = str(rows[5])
doc.paragraphs[9].runs[7].text = str(rows[6])
table = doc.tables[0]
data_table = df.iloc[index-6:index+1,:5]
for i in range(7):
for j in range(5):
table.cell(i+1,j).text = str(df.iloc[i,j])
doc.save(f"銷售日?qǐng)?bào)-{rows[0]}.docx")
執(zhí)行代碼,輸出結(jié)果:

如上圖所示,120份有記錄的銷售日?qǐng)?bào)就寫好啦,Python自動(dòng)化辦公就是怎么神奇。
完整代碼獲取方式:
鏈接:??https://pan.baidu.com/s/1gayOUOq_YCONvRmtNo0NIA???
提取碼:p9iw
因?yàn)檎Z(yǔ)法簡(jiǎn)單、容易上手,Python 被稱為“最適合初學(xué)者學(xué)習(xí)”的編程語(yǔ)言。而對(duì)于工作中各種重復(fù)性的電腦工作,都可以考慮用Python來(lái)轉(zhuǎn)變?yōu)樽詣?dòng)化程序。
如果你是一個(gè)Python初學(xué)者,會(huì)發(fā)現(xiàn)本文的邏輯非常簡(jiǎn)單,甚至大家還可以對(duì)此進(jìn)行改進(jìn)。比如python-docx模塊在讀取Word文檔有優(yōu)勢(shì),但是向模板中寫入文本時(shí),可以考慮使用docxtpl模塊(學(xué)一點(diǎn)Jinja2語(yǔ)法)。






























