? ? 最近一段時間每天都要幫老板匯總各BU的報表始花,我需要做的工作就是把各BU報表中的對應(yīng)的內(nèi)容復(fù)制粘貼到匯總表里永部,然后將匯總后的表格以郵件形式發(fā)送給老板鉴竭,雖然處理這些工作只需要大概10分鐘左右的時間,但如果能將這些工作交給程序自動處理,節(jié)省下來的時間做更有意義的事不香嗎驹饺?說干就干,在查閱了大量網(wǎng)絡(luò)資料后缴渊,通過python的docx庫實現(xiàn)了一鍵批量匯總word表格的功能赏壹,代碼如下:(python3.7版本)
import?os
import?docx
import?datetime
from?docx?import?Document?#導(dǎo)入word編輯庫
import?smtplib?
from?email.header?import?Header?
from?email.mime.text?import?MIMEText?
from?email.mime.multipart?import?MIMEMultipart?#導(dǎo)入郵件庫
zb?=?Document(r"c:\Users\THINKPAD\Desktop\test\xxxx.docx")?#讀入?yún)R總文件模板
curr_time?=?datetime.datetime.now()#獲取當(dāng)前如期
reporttime?=?curr_time.date()?#獲取當(dāng)前如期
newpath?=?r"c:\Users\THINKPAD\Desktop\test\xxxx%s.docx"%reporttime?#設(shè)置保存文件的路徑并在文件名中加入報告日期
newname?=?'xxx公司xxxx報表%s.docx'%reporttime?#自動給生成的匯總表命名
path_yuanqu?=?os.listdir(r"c:\Users\THINKPAD\Desktop\test\xxxx")#獲取保存報表的文件夾下所有文件列表(注意要保證文件夾下只有word文件,即文件后綴名以.docx或.doc結(jié)尾的文件)
print(path_yuanqu)
for?i?in?path_yuanqu:
????yuanqu?=?docx.Document(r'c:\Users\THINKPAD\Desktop\test\xxxx\{}'.format(i))#遍歷讀入文件夾下的文件
????file_name?=?os.path.basename(i)
????file_name?=?file_name.split('.')[0]#取不帶后綴的文件名賦值給file_name變量衔沼,這里是為了便于替換匯總文件模板中的指定內(nèi)容
????tables1?=?yuanqu.tables?#獲取文件中的表格集
????table1?=?tables1[0]#獲取文件中的第一個表格
????result_list?=?[]
????for?i?in?range(1,len(table1.rows)):#從表格第二行開始循環(huán)讀取表格數(shù)據(jù)
????????result?=?table1.cell(i,1).text
????????result_list.append(result)
????????#cell(i,0)表示第(i+1)行第1列數(shù)據(jù)蝌借,以此類推
????tables2?=?zb.tables?#獲取匯總文件模板中的表格集
????table2?=?tables2[0]#獲取文件中的第一個表格
????table2.cell(0,3).text='報告日期:%s'%reporttime?#在第一行第三列表格中填入報告日期
????for?j?in?range(1,len(table2.rows)):#從表格第二行開始循環(huán)替換表格數(shù)據(jù)
????????value?=?"%s:\n"%file_name
????????value_replace?=?"%s:\n%s"%(file_name,result_list[j-1])
????????table2.cell(j,1).text?=?table2.cell(j,1).text.replace(value,?value_replace)
zb.save(newpath)#將修改后的文檔另存到新的路徑
print('匯總表已生成!')
#以下是自動發(fā)送郵件模塊-------------------------------------------------------------------------
sender?=?'xxxx@qq.com'#發(fā)送郵箱
receiver?=?'xxxx'#接收郵箱
smtpserver?=?'smtp.qq.com'#郵箱服務(wù)器
username?=?'xxxx'#發(fā)送郵箱登錄名
password?=?'xxxxx' #郵箱授權(quán)碼
mail_title?=?'xxx報表'#郵件主題
#?創(chuàng)建一個帶附件的實例?
message?=?MIMEMultipart()?
message['From']?=?sender?
message['To']?=?receiver?
message['Subject']?=?Header(mail_title,?'utf-8')?
#?郵件正文內(nèi)容?
message.attach(MIMEText('xxxx報表',?'plain',?'utf-8'))?
#?構(gòu)造附件(附件為word格式的文本)?
att1?=?MIMEText(open(newpath,?'rb').read(),?'base64',?'utf-8')?
att1["Content-Type"]?=?'application/octet-stream'
att1.add_header('Content-Disposition',?'attachment',?filename=?newname)#這里保證發(fā)送的附件顯示的是word格式俐巴,否則會顯示bin文件
message.attach(att1)?
smtpObj?=?smtplib.SMTP_SSL(smtpserver)?#?注意:如果遇到發(fā)送失敗的情況(提示遠(yuǎn)程主機(jī)拒接連接)骨望,這里要使用SMTP_SSL方法?
smtpObj.connect(smtpserver)?
smtpObj.login(username,?password)?
smtpObj.sendmail(sender,?receiver,?message.as_string())?
print("郵件發(fā)送成功!P蓝妗擎鸠!")?
smtpObj.quit()
覺得有用就收藏吧,別忘了點歌贊哦~