基于Python实现反向邮件合并功能

2020-07-09 22:13马孝宗戚亚东徐燕
现代信息科技 2020年2期

马孝宗 戚亚东 徐燕

摘  要:邮件合并是Office的一项功能,可便捷地批量生成文档,却无法从大量Word文档中汇总信息。结合实际应用,阐述基于Python语言对Word文档进行批量导入、读取其中的表格与段落、汇总信息至Excel工作簿的实现过程。实现反向邮件合并功能,解决Word文档批量汇总中的多个难点,实现Word文档批量汇总的自动化,有效提高了用户的工作效率,适用于人事数据、财务数据、员工信息的汇总,具有良好的实用性与推广价值。

关键词:Python;邮件合并;批量汇总

中图分类号:TP391      文献标识码:A 文章编号: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提供的一项既强大又实用的功能,其作用是将存放在Excel中的数据源按照一个记录一页的方式生成Word文档,常用于批量制作邮件、请柬、简历、成绩单、证书、工作档案等。邮件合并的使用步骤如下:首先准备标准的Excel数据源和Word模板,接着在Word模板中启动邮件合并、选择收件人、插入数据域、查看合并数据、完成合并。其主要工作在于Excel数据源和Word模板的制作,其余步骤通过在Word模板中选择相应功能即可完成,极大地提高了批量制作文档的效率。

在实际工作中不但需要邮件合并功能,还需要反向邮件合并功能,即从同一模板下的Word文档中提取信息并汇总为Excel表,比如汇总所有员工的工作档案、汇总所有党员的基本信息文档、汇总所有员工的职业资格文档等。但是Office并未提供反向邮件合并功能,无法便捷地从大量Word文档中提取信息。Python语言提供了操作Office的库,基于Python编程实现反向邮件合并,可快速从Word文档的表格、段落中提取信息,汇总并输出为Excel工作簿。

1  需求分析

反向邮件合并即批量读取Word文档,将文档中的信息汇总为Excel工作簿。其功能还包括在计算机桌面检查并生成“反向邮件合并”文件夹,由用户将待合并的文档存放到此文件夹内。Word文档中待合并的信息分别在表格和段落中。对于表格,需要将所有文档相同位置的单元格内容汇总为Excel表的一列;对于段落,需要将全部文档相同位置的段落文本汇总为Excel表的一列,便于下一步根据需要保留、删除信息。

以汇总员工工作档案为例,在单个Word文档中记录了员工个人信息、学历与培训、职业资格、获奖证书、荣誉称号、联系方式等信息,为便于统计,将全体员工的工作档案汇总为Excel表,则Excel表的一列对应着全部Word文档相同位置的信息。比如Excel表的“姓名”列存放全部Word文档中的姓名信息,“培训”列存放所有Word文档中的培训信息等。之后通过保留Excel表部分列的方法即可选取所需的信息。实现反向邮件合并的步骤包括:路径生成、Word文件识别、读取文档、遍历表格与段落、信息汇总至数据帧、合并数据帧、结果输出至Excel工作簿等。

2  编程实现

2.1  编程环境

编程环境采用Windows下的Anaconda软件,Anaconda包含了Conda、Python在内的大量科学包及其依赖项,以及高效的Python开发环境Spyder。具体开发环境为:Windows 7/10操作系统、Anaconda3-5.3.0(64-bit)、Python-docx库、Pandas库。

2.2  导入代码所需的库

实现反向邮件合并功能依赖于Python下的os、Python-docx、Pandas三个库,其中os是Python自带的标准库,Python-docx与Pandas是第三方库,需事先安裝。

import os   #用于路径生成与识别

import docx #用于操作Word

import pandas as pd #用于操作Excel

2.3  获取Word文档中的表格与段落

首先获取计算机桌面的路径,在计算机桌面检查并创建“反向邮件合并”文件夹。遍历该文件夹内所有文件,通过f.endswith('.docx')方法选取路径名以“docx”结尾的文档,通过docx.Document.tables、docx.Document.paragraphs读取文档中的表格集与段落集。关键代码如下:

path_desktop=os.path.join(os.path.expanduser("~"), 'Desktop').replace('\\','/')

path_反向邮件合并=path_desktop+'/反向邮件合并/'#设置反向邮件合并文件夹的路径

if os.path.exists(path_反向邮件合并): #检查并生成反向邮件合并文件夹

pass

else:

os.makedirs(path_反向邮件合并)

files=os.listdir(path_反向邮件合并)#获取该文件夹下所有文件路径

data1 = pd.DataFrame()#创建空的总表

data2 = pd.DataFrame()

for f in files:             #对于该文件夹下所有文件

if f.endswith('.docx'):  #如果文档的后缀名是docx

document=docx.Document(path_反向邮件合并+f)#读取文档

tables=document.tables #獲取文档中的表格集

paragraphs=document.paragraphs #获取文档中的段落集

else:

pass#忽略目录下的非docx文件

2.4  表格信息合并

表格中的信息存放在每个单元格中,通过table.cell.text方法可按位置获取单元格内的文本。首先创建与Word表格同样尺寸的数据帧,遍历表格中的所有单元格,将每个单元格内的信息连接为一个文本后存放到数据帧的相同位置,便生成了与当前Word文档表格内容一致的数据帧。但多个表格内容不可直接纵向合并,否则会导致多种属性的数据被存放到一列中,影响下一步的信息提取。因此将每个数据帧重塑为一行,再将所有行的数据帧合并。关键代码如下:

for table in tables:  #对于每一个表格

row_num = len(table.rows) #获取表格的行数

col_num = len(table.columns)#获取表格的列数

total_num = row_num*col_num #获取表格的单元格数

#创建与文档中的每个表格同样大小的数据帧

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())#获取当前单元格的信息

data1_small.iloc[row,col] = message  #存放到数据帧的对应位置

data1_small = pd.DataFrame(data1_small.values.reshape (1,total_num))#将数据帧重塑为一行

data1 = pd.concat([data1, data1_small],ignore_index= True) #将该单行数据帧合并到总表1中

2.5  段落信息合并

段落中的信息即该段落的全部文本,通过paragraph.text方法可按顺序获取段落文本。首先创建列数等于段落数的单行数据帧,遍历所有段落,将每个段落的文本存放到数据帧的对应列,便生成了包含当前Word文档所有段落文本的单行数据帧,再将所有行数据帧合并。关键代码如下:

p_num = len(paragraphs)

data2_small = pd.DataFrame(columns=range(p_num), index=range(1))

for i,t in enumerate(paragraphs): #枚举段落集中的段落与下标

message = t.text #获取当前段落文本

data2_small.iloc[0,i] = message #存放到数据帧的对应位置

data2_small = pd.DataFrame(data2_small.values.reshape (1,p_num))#重塑数据帧

data2 = pd.concat([data2, data2_small],ignore_index= True) #将该单行数据帧合并到总表2中

2.6  信息输出

将信息提取结果输出为“反向邮件合并结果.xlsx”工作簿,其中包含“表格合并结果”与“段落合并结果”两个工作表,关键代码如下:

writer = pd.ExcelWriter(path_反向邮件合并+'反向邮件合并结果.xlsx')

data1.to_excel(writer,'表格合并结果')

data2.to_excel(writer,'段落合并结果')

writer.save()

3  结  论

Office的邮件合并功能可便捷地批量生成文档,却无法从大量Word文档中汇总信息,如果缺乏自动化、批量化的汇总方法,信息汇总的过程将成为耗时多、易出错、效率低的瓶颈环节。借助Python下的Python-docx库与Pandas庫,管理人员可以快速、准确地从结构一致的Word文档中读取数据并汇总至Excel工作簿,从而实现反向邮件合并功能。除了汇总Word文档中的信息,Python的Pandas库自带功能齐全的统计分析函数,用户也可以方便地自定义函数,对汇总后的信息进行个性化的分析,极大地拓展了Python的分析能力,有效地提高了用户的工作效率,具有良好的实用性与推广价值。

参考文献:

[1] 张良均,王路,谭立云,等.Python数据分析与挖掘实战 [M].北京:机械工业出版社,2015:60-64.

[2] Kyxdpzy.从Excel到Python:数据分析进阶指南 [M/OL].(2019-04-27)http://www.doc88.com/p-7012538072968.html.

[3] MCKINNEY W.利用Python进行数据分析:第2版 [M].徐敬一,译.北京:机械工业出版社,2018:10-11.

[4] 恒盛杰资讯.Word/Excel/PPT2016高效办公实战从入门到精通 [M].北京:机械工业出版社,2017:366-373.

[5] 杨阳.Word/Excel/PPT2016办公应用从入门到精通 [M].天津:天津科学技术出版社,2017:570-574.

[6] 张志强,赵越.零基础学Python [M].北京:机械工业出版社,2015:85-86.

作者简介:马孝宗(1989-),男,汉族,河南驻马店人,信息管理员,助理工程师,硕士学位,研究方向:数据分析、办公自动化、深度学习。