600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Python win32com初步实现将批量的Word文件信息统计写入同一Excel表格中

Python win32com初步实现将批量的Word文件信息统计写入同一Excel表格中

时间:2019-04-10 19:28:34

相关推荐

Python win32com初步实现将批量的Word文件信息统计写入同一Excel表格中

环境搭建:

Python 3.7(可参考博客:/qq_25814003/article/details/80609729)

docx模块(命令行环境下输入:pip install python-docx,回车键安装)

win32com模块(命令行环境下输入:python -m pip install pypiwin32 ,回车键安装,另需下载pywin32-221,版本3.7,手工安装;如果Python安装成功,则自动选择安装地址。

下载地址:/projects/pywin32/files/pywin32/Build%1/)

1.问题描述

先举个栗子:班里有50名同学,需要将每个人的个人信息统计到一张Excel表格里。当所有人将Word文档填好之后,统计者将收到50份格式相同,但信息不同的文档,Ta 要做的可能是将每个人对应的信息复制、粘贴进相应的Excel表格单元中。假设统计所用Word文档如下:

但如果表格信息很多、表格数量较大时,再这么复制、粘贴的纯手工重复性作业,似乎太让人心神俱疲了!怎么个疲法呢?请看下表(目前为第一页,共计四页):

对于这种Word表格,Excel体检统计表一般设计为,每行统计一个个体的所有信息,每列统计所人的某一信息。此体检统计表除了统计信息的数量较学生信息统计表多之外,信息的种类也更加丰富。不像学生统计表,所有信息均可以接从单元格提取,不用处理。此体检统计表要复杂很多,局部如下图:

对于Word体检表,每个正方形框处,填写的是每个选择的代号;而多个框框,则代表为多选,实际的填写中,可能会填一个代号(如,1),也可能会填多个(如,1/2/3)。在Excel统计表中,要写入Word表格中相应框处的数字,但怎样将Word表中的每个代号正确而无遗漏地提取出来,是一个需要解决的问题。

对于体温、脉率、呼吸频率、血压等信息,我们需将Word表中每个对应单元中的数字提取出来,而不需要单位信息。

当我们将Word表格中的信息提取出来之后,还需要将对应的信息写入Excel统计表格中,怎样将每个信息写入对应的表格,怎样将批量Word文件写入同一Excel表格,将会在下文介绍。

注:表格信息仅做展示说明之用,不合理不科学之处,请勿指出(指出我也不改),谢谢!

再注:以上注明仅限表格信息,其他不足之处,还请批评指正,谢谢!

2.问题解决的程序块介绍

2.1 从docx文件中提取信息

请看代码:

'''提取所需信息'''#读取docx,返回所需信息def parse_docx(docx_path,i_in,workbook):document = Document(docx_path) #读入文件tables = document.tables #获取文件中的表格集''' 第一张表格 '''table = tables[0] #获取文件中的第一个表格title= document.paragraphs[0].text #文档标题name = table.cell(0,1).text.split() #患者姓名,<class 'str'>time = table.cell(1,2).text #体检日期doctor = table.cell(1,5).text.split() #责任医生,<class 'str'>#症状;为多选情形,用一个for循环,将所有数字代号存入列表中seq = table.cell(3,1).text.split() #症状,<class 'list'>seq_num = [] #症状代号 for n_i in range(50,len(seq)):if seq[n_i] != '/':seq_num.append(seq[n_i])n_i = n_i+1#一般情况#re.findall()函数,正则表达式提取数字temputure = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(4,2).text) #体温 mailv = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(4,5).text) #脉率hupin = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(5,2).text) #呼吸频率bld_presure_left = table.cell(5,6).text.split()[0] #血压左侧收缩bld_presure_left2 = table.cell(5,6).text.split()[2] #血压左侧舒张bld_presure_right = table.cell(6,6).text.split()[0] #血压右侧收缩bld_presure_right2 = table.cell(6,6).text.split()[2] #血压右侧舒张 body_hig = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(7,2).text) #身高body_weig = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(7,5).text) #体重yaowei = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(8,2).text) #腰围BMI = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(8,5).text) #体质指数self_estimate = table.cell(9,2).text #老年人健康状态自我评估self_estimate_num = self_estimate.split()[-1] #选中列表中的倒数第一个元素self_ability = table.cell(10,2).text #老年人自理能力自我评估self_ability_num = self_ability.split()[-1]self_cognition = table.cell(11,2).text #老年人认知功能self_cognition_num = self_cognition.split()[-1]self_motion = table.cell(12,2).text #老年人情感状态self_motion_num = self_motion.split()[-1]#生活方式exer_fre = table.cell(13,3).text #锻炼频率exer_fre_num = exer_fre.split()[-1]exer_time = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(14,3).text) #每次锻炼时间exer_holdon = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(14,5).text) #坚持锻炼时间exer_mode = table.cell(15,3).text #锻炼方式eat_habit = table.cell(16,2).text.split() #饮食习惯eat_habit_num = [] #for循环,找出所有数字代号for n_j in range(12,len(eat_habit)):if eat_habit[n_j] != '/':eat_habit_num.append(eat_habit[n_j])n_j = n_j+1smok_condt_num = table.cell(17,3).text.split()[-1] #吸烟状况smok_perday_num = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(18,3).text) #日吸烟量smok_beg_age = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(19,3).text) #开始吸烟年龄smok_end_age = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(19,5).text) #戒烟年龄drink_fre = table.cell(20,3).text.split()[-1] #饮酒频率drink_perday = re.findall(r'-?\d+.?\d*e?-?\d*?',table.cell(21,3).text) #日饮酒量

2.2 写入.xlsx/.xls文件

上代码:

'''将word表格信息写入excel'''def write_excel(docx_path,i_in,workbook,name,doctor,seq_num,temputure,mailv,hupin,bld_presur_left,bld_presure_left2,bld_presure_right,bld_presure_right2,body_hig,body_weig, yaowei,BMI,self_estimate_num,self_ability_num,self_cognition_num,self_motion_num,exer_fre_num,exer_time,exer_holdon,exer_mode,eat_habit_num,smok_condt_num,smok_perday_num,smok_beg_age,drink_fre):sheet=workbook.Worksheets(1) #获取当前第一个表格sheet.Cells(i_in,'M').value = seq_num #将信息写入对应单元格sheet.Cells(i_in,'N').value = temputuresheet.Cells(i_in,'O').value = mailvsheet.Cells(i_in,'P').value = hupinsheet.Cells(i_in,'Q').value = bld_presure_leftsheet.Cells(i_in,'R').value = bld_presure_left2sheet.Cells(i_in,'S').value = bld_presure_rightsheet.Cells(i_in,'T').value = bld_presure_right2sheet.Cells(i_in,'U').value = body_higsheet.Cells(i_in,'V').value = body_weigsheet.Cells(i_in,'W').value = yaoweisheet.Cells(i_in,'X').value = BMIsheet.Cells(i_in,'Y').value = self_estimate_numsheet.Cells(i_in,'Z').value = self_ability_numsheet.Cells(i_in,'AA').value = self_cognition_numsheet.Cells(i_in,'AB').value = self_motion_numsheet.Cells(i_in,'AC').value = exer_fre_numsheet.Cells(i_in,'AD').value = exer_timesheet.Cells(i_in,'AE').value = exer_holdonsheet.Cells(i_in,'AF').value = exer_modesheet.Cells(i_in,'AG').value = eat_habit_numsheet.Cells(i_in,'AH').value = smok_condt_numsheet.Cells(i_in,'AI').value = smok_perday_numsheet.Cells(i_in,'AJ').value = smok_beg_agesheet.Cells(i_in,'AL').value = drink_fre

2.3 其他辅助程序模块

将.doc文件另存为.docx文件

#将doc文件另存为docx文件def doc_to_docx(path):if os.path.splitext(path)[1] == ".doc": #判断文件扩展名是否为.docword = win32com.client.Dispatch('Word.Application') #调用Word程序doc = word.Documents.Open(path) #打开目标路径下的文件doc.SaveAs(os.path.splitext(path)[0]+".docx",16) #另存为docx文件后的路径和名称,16代表另存为docx文件doc.Close()word.Quit()

查找目标目录下所有文件

#获取文件夹下的所有文件的绝对路径def find_file(path, ext, file_list=[]):dir = os.listdir(path)for i in dir:i = os.path.join(path, i)if os.path.isdir(i):find_file(i, ext, file_list)else:if ext == os.path.splitext(i)[1]:file_list.append(i)return file_list #返回文件列表

3.完整程序运行

3.1 完整程序

完整代码已上传到GitHub,代码注释也较详细,如有需要,请移步:

/JackWon3637/myWord2Execl/blob/master/wToEOked6.py

3.2 运行结果(统计表局部)

3.3 出现问题

3.3.1 在Word统计表中,出现表格中嵌套表格的情况;我个人目前还没找到方法,故此部分信息未能提取。

3.3.2 此段代码在调用Word和Excel程序时,会涉及到文件的打开和关闭、程序的调用和退出,涉及到文件与程序的协作。关于文件和程序报错,如AttributeError中的xxxx.SaveAs、xxxx.Close错误,_eeor:(-2147417848,‘被调用的对象已与其客户端断开连接。’,None,None),均与程序的状态有关。故在程序运行时,最好不要人为打开或关闭Word或Excel程序以及其他与二者有关的程序。

4.感想及致谢

这是我本人的第一篇技术博客,在整个小项目的完成过程中,参考了许多技术文章、博客、论坛等,在此一并向分享这些知识和信息的前辈表示感谢!

希望自己的这篇博客,能带给相关需求者相应的帮助,正如那些前辈们对我的帮助一样;希望自己的技术之路,在给自己带来提升的同时,也能帮助到其他人。

这是段简陋的代码,缺少的东西太多,不足的地方太多,所以,如果能有好的方法,还望不吝指出,谢谢!

主要参考的博客附录如下:

Python处理excel总结/paul-liang/p/9187503.html

用Python读取Word文档并写入Excel(一)/qq_34475777/article/details/62055523

用Python读取Word文档并写入Excel(二)/qq_34475777/article/details/77586663

Excel VBA中对workbook、worksheet、range的选择和操作/phoebeland/p/7808882.html

文中举例所用表格地址:

学生信息统计表:/view/2dd9b14d53ea551810a6f524ccbff121dc36c55a.html

健康体检表:/view/72799d4cae1ffc4ffe4733687e21af45b307fe38.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。