馬孝宗 戚亞東 徐燕
摘? 要:郵件合并是Office的一項(xiàng)功能,可便捷地批量生成文檔,卻無法從大量Word文檔中匯總信息。結(jié)合實(shí)際應(yīng)用,闡述基于Python語言對(duì)Word文檔進(jìn)行批量導(dǎo)入、讀取其中的表格與段落、匯總信息至Excel工作簿的實(shí)現(xiàn)過程。實(shí)現(xiàn)反向郵件合并功能,解決Word文檔批量匯總中的多個(gè)難點(diǎn),實(shí)現(xiàn)Word文檔批量匯總的自動(dòng)化,有效提高了用戶的工作效率,適用于人事數(shù)據(jù)、財(cái)務(wù)數(shù)據(jù)、員工信息的匯總,具有良好的實(shí)用性與推廣價(jià)值。
關(guān)鍵詞:Python;郵件合并;批量匯總
中圖分類號(hào):TP391? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2096-4706(2020)02-0119-03
Abstract:Mail merge is a feature of Office that makes it easy to produce documents in bulk,but doesnt aggregate information from a large number of Word documents. Combined with practical application,this paper describes the implementation process of importing Word documents in batches based on Python language,reading the tables and paragraphs therein,and summarizing the information to the Excel workbook. Realize the function of reverse mail merge,solve many difficulties in the batch summary of Word documents,realize the automation of batch summary of Word documents,effectively improve the work efficiency of users,suitable for the summary of personnel data,financial data,employee information,with good practicability and promotion value.
Keywords:Python;mail merge;bulk summary
0? 引? 言
郵件合并是Office提供的一項(xiàng)既強(qiáng)大又實(shí)用的功能,其作用是將存放在Excel中的數(shù)據(jù)源按照一個(gè)記錄一頁的方式生成Word文檔,常用于批量制作郵件、請(qǐng)柬、簡歷、成績單、證書、工作檔案等。郵件合并的使用步驟如下:首先準(zhǔn)備標(biāo)準(zhǔn)的Excel數(shù)據(jù)源和Word模板,接著在Word模板中啟動(dòng)郵件合并、選擇收件人、插入數(shù)據(jù)域、查看合并數(shù)據(jù)、完成合并。其主要工作在于Excel數(shù)據(jù)源和Word模板的制作,其余步驟通過在Word模板中選擇相應(yīng)功能即可完成,極大地提高了批量制作文檔的效率。
在實(shí)際工作中不但需要郵件合并功能,還需要反向郵件合并功能,即從同一模板下的Word文檔中提取信息并匯總為Excel表,比如匯總所有員工的工作檔案、匯總所有黨員的基本信息文檔、匯總所有員工的職業(yè)資格文檔等。但是Office并未提供反向郵件合并功能,無法便捷地從大量Word文檔中提取信息。Python語言提供了操作Office的庫,基于Python編程實(shí)現(xiàn)反向郵件合并,可快速從Word文檔的表格、段落中提取信息,匯總并輸出為Excel工作簿。
1? 需求分析
反向郵件合并即批量讀取Word文檔,將文檔中的信息匯總為Excel工作簿。其功能還包括在計(jì)算機(jī)桌面檢查并生成“反向郵件合并”文件夾,由用戶將待合并的文檔存放到此文件夾內(nèi)。Word文檔中待合并的信息分別在表格和段落中。對(duì)于表格,需要將所有文檔相同位置的單元格內(nèi)容匯總為Excel表的一列;對(duì)于段落,需要將全部文檔相同位置的段落文本匯總為Excel表的一列,便于下一步根據(jù)需要保留、刪除信息。
以匯總員工工作檔案為例,在單個(gè)Word文檔中記錄了員工個(gè)人信息、學(xué)歷與培訓(xùn)、職業(yè)資格、獲獎(jiǎng)證書、榮譽(yù)稱號(hào)、聯(lián)系方式等信息,為便于統(tǒng)計(jì),將全體員工的工作檔案匯總為Excel表,則Excel表的一列對(duì)應(yīng)著全部Word文檔相同位置的信息。比如Excel表的“姓名”列存放全部Word文檔中的姓名信息,“培訓(xùn)”列存放所有Word文檔中的培訓(xùn)信息等。之后通過保留Excel表部分列的方法即可選取所需的信息。實(shí)現(xiàn)反向郵件合并的步驟包括:路徑生成、Word文件識(shí)別、讀取文檔、遍歷表格與段落、信息匯總至數(shù)據(jù)幀、合并數(shù)據(jù)幀、結(jié)果輸出至Excel工作簿等。
2? 編程實(shí)現(xiàn)
2.1? 編程環(huán)境
編程環(huán)境采用Windows下的Anaconda軟件,Anaconda包含了Conda、Python在內(nèi)的大量科學(xué)包及其依賴項(xiàng),以及高效的Python開發(fā)環(huán)境Spyder。具體開發(fā)環(huán)境為:Windows 7/10操作系統(tǒng)、Anaconda3-5.3.0(64-bit)、Python-docx庫、Pandas庫。
2.2? 導(dǎo)入代碼所需的庫
實(shí)現(xiàn)反向郵件合并功能依賴于Python下的os、Python-docx、Pandas三個(gè)庫,其中os是Python自帶的標(biāo)準(zhǔn)庫,Python-docx與Pandas是第三方庫,需事先安裝。
import os? ?#用于路徑生成與識(shí)別
import docx #用于操作Word
import pandas as pd #用于操作Excel
2.3? 獲取Word文檔中的表格與段落
首先獲取計(jì)算機(jī)桌面的路徑,在計(jì)算機(jī)桌面檢查并創(chuàng)建“反向郵件合并”文件夾。遍歷該文件夾內(nèi)所有文件,通過f.endswith('.docx')方法選取路徑名以“docx”結(jié)尾的文檔,通過docx.Document.tables、docx.Document.paragraphs讀取文檔中的表格集與段落集。關(guān)鍵代碼如下:
path_desktop=os.path.join(os.path.expanduser("~"), 'Desktop').replace('\\','/')
path_反向郵件合并=path_desktop+'/反向郵件合并/'#設(shè)置反向郵件合并文件夾的路徑
if os.path.exists(path_反向郵件合并): #檢查并生成反向郵件合并文件夾
pass
else:
os.makedirs(path_反向郵件合并)
files=os.listdir(path_反向郵件合并)#獲取該文件夾下所有文件路徑
data1 = pd.DataFrame()#創(chuàng)建空的總表
data2 = pd.DataFrame()
for f in files:? ? ? ? ? ? ?#對(duì)于該文件夾下所有文件
if f.endswith('.docx'):? #如果文檔的后綴名是docx
document=docx.Document(path_反向郵件合并+f)#讀取文檔
tables=document.tables #獲取文檔中的表格集
paragraphs=document.paragraphs #獲取文檔中的段落集
else:
pass#忽略目錄下的非docx文件
2.4? 表格信息合并
表格中的信息存放在每個(gè)單元格中,通過table.cell.text方法可按位置獲取單元格內(nèi)的文本。首先創(chuàng)建與Word表格同樣尺寸的數(shù)據(jù)幀,遍歷表格中的所有單元格,將每個(gè)單元格內(nèi)的信息連接為一個(gè)文本后存放到數(shù)據(jù)幀的相同位置,便生成了與當(dāng)前Word文檔表格內(nèi)容一致的數(shù)據(jù)幀。但多個(gè)表格內(nèi)容不可直接縱向合并,否則會(huì)導(dǎo)致多種屬性的數(shù)據(jù)被存放到一列中,影響下一步的信息提取。因此將每個(gè)數(shù)據(jù)幀重塑為一行,再將所有行的數(shù)據(jù)幀合并。關(guān)鍵代碼如下:
for table in tables:? #對(duì)于每一個(gè)表格
row_num = len(table.rows) #獲取表格的行數(shù)
col_num = len(table.columns)#獲取表格的列數(shù)
total_num = row_num*col_num #獲取表格的單元格數(shù)
#創(chuàng)建與文檔中的每個(gè)表格同樣大小的數(shù)據(jù)幀
data1_small=pd.DataFrame(columns=range(col_num), index=range(row_num))
for row in range(row_num):
for col in range(col_num):
message = ''.join(table.cell(row,col).text.split())#獲取當(dāng)前單元格的信息
data1_small.iloc[row,col] = message? #存放到數(shù)據(jù)幀的對(duì)應(yīng)位置
data1_small = pd.DataFrame(data1_small.values.reshape (1,total_num))#將數(shù)據(jù)幀重塑為一行
data1 = pd.concat([data1, data1_small],ignore_index= True) #將該單行數(shù)據(jù)幀合并到總表1中
2.5? 段落信息合并
段落中的信息即該段落的全部文本,通過paragraph.text方法可按順序獲取段落文本。首先創(chuàng)建列數(shù)等于段落數(shù)的單行數(shù)據(jù)幀,遍歷所有段落,將每個(gè)段落的文本存放到數(shù)據(jù)幀的對(duì)應(yīng)列,便生成了包含當(dāng)前Word文檔所有段落文本的單行數(shù)據(jù)幀,再將所有行數(shù)據(jù)幀合并。關(guān)鍵代碼如下:
p_num = len(paragraphs)
data2_small = pd.DataFrame(columns=range(p_num), index=range(1))
for i,t in enumerate(paragraphs): #枚舉段落集中的段落與下標(biāo)
message = t.text #獲取當(dāng)前段落文本
data2_small.iloc[0,i] = message #存放到數(shù)據(jù)幀的對(duì)應(yīng)位置
data2_small = pd.DataFrame(data2_small.values.reshape (1,p_num))#重塑數(shù)據(jù)幀
data2 = pd.concat([data2, data2_small],ignore_index= True) #將該單行數(shù)據(jù)幀合并到總表2中
2.6? 信息輸出
將信息提取結(jié)果輸出為“反向郵件合并結(jié)果.xlsx”工作簿,其中包含“表格合并結(jié)果”與“段落合并結(jié)果”兩個(gè)工作表,關(guān)鍵代碼如下:
writer = pd.ExcelWriter(path_反向郵件合并+'反向郵件合并結(jié)果.xlsx')
data1.to_excel(writer,'表格合并結(jié)果')
data2.to_excel(writer,'段落合并結(jié)果')
writer.save()
3? 結(jié)? 論
Office的郵件合并功能可便捷地批量生成文檔,卻無法從大量Word文檔中匯總信息,如果缺乏自動(dòng)化、批量化的匯總方法,信息匯總的過程將成為耗時(shí)多、易出錯(cuò)、效率低的瓶頸環(huán)節(jié)。借助Python下的Python-docx庫與Pandas庫,管理人員可以快速、準(zhǔn)確地從結(jié)構(gòu)一致的Word文檔中讀取數(shù)據(jù)并匯總至Excel工作簿,從而實(shí)現(xiàn)反向郵件合并功能。除了匯總Word文檔中的信息,Python的Pandas庫自帶功能齊全的統(tǒng)計(jì)分析函數(shù),用戶也可以方便地自定義函數(shù),對(duì)匯總后的信息進(jìn)行個(gè)性化的分析,極大地拓展了Python的分析能力,有效地提高了用戶的工作效率,具有良好的實(shí)用性與推廣價(jià)值。
參考文獻(xiàn):
[1] 張良均,王路,譚立云,等.Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn) [M].北京:機(jī)械工業(yè)出版社,2015:60-64.
[2] Kyxdpzy.從Excel到Python:數(shù)據(jù)分析進(jìn)階指南 [M/OL].(2019-04-27)http://www.doc88.com/p-7012538072968.html.
[3] MCKINNEY W.利用Python進(jìn)行數(shù)據(jù)分析:第2版 [M].徐敬一,譯.北京:機(jī)械工業(yè)出版社,2018:10-11.
[4] 恒盛杰資訊.Word/Excel/PPT2016高效辦公實(shí)戰(zhàn)從入門到精通 [M].北京:機(jī)械工業(yè)出版社,2017:366-373.
[5] 楊陽.Word/Excel/PPT2016辦公應(yīng)用從入門到精通 [M].天津:天津科學(xué)技術(shù)出版社,2017:570-574.
[6] 張志強(qiáng),趙越.零基礎(chǔ)學(xué)Python [M].北京:機(jī)械工業(yè)出版社,2015:85-86.
作者簡介:馬孝宗(1989-),男,漢族,河南駐馬店人,信息管理員,助理工程師,碩士學(xué)位,研究方向:數(shù)據(jù)分析、辦公自動(dòng)化、深度學(xué)習(xí)。