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

环境搭建:

Python 3.7(可参考博客:https://blog.csdn.net/qq_25814003/article/details/80609729

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

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

下载地址:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/

 

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+1

    smok_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 = temputure
    sheet.Cells(i_in,'O').value = mailv
    sheet.Cells(i_in,'P').value = hupin
    sheet.Cells(i_in,'Q').value = bld_presure_left
    sheet.Cells(i_in,'R').value = bld_presure_left2
    sheet.Cells(i_in,'S').value = bld_presure_right
    sheet.Cells(i_in,'T').value = bld_presure_right2
    sheet.Cells(i_in,'U').value = body_hig
    sheet.Cells(i_in,'V').value = body_weig
    sheet.Cells(i_in,'W').value = yaowei
    sheet.Cells(i_in,'X').value = BMI
    
    sheet.Cells(i_in,'Y').value = self_estimate_num
    sheet.Cells(i_in,'Z').value = self_ability_num
    sheet.Cells(i_in,'AA').value = self_cognition_num
    sheet.Cells(i_in,'AB').value = self_motion_num
    
    sheet.Cells(i_in,'AC').value = exer_fre_num
    sheet.Cells(i_in,'AD').value = exer_time
    sheet.Cells(i_in,'AE').value = exer_holdon
    sheet.Cells(i_in,'AF').value = exer_mode
    sheet.Cells(i_in,'AG').value = eat_habit_num

    sheet.Cells(i_in,'AH').value = smok_condt_num
    sheet.Cells(i_in,'AI').value = smok_perday_num
    sheet.Cells(i_in,'AJ').value = smok_beg_age
    sheet.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": #判断文件扩展名是否为.doc
        word = 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,代码注释也较详细,如有需要,请移步:

https://github.com/JackWon3637/myWord2Execl/blob/master/wToEOked6.py

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

3.3 出现问题

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

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

4.感想及致谢

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

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

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

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

Python处理excel总结  https://www.cnblogs.com/paul-liang/p/9187503.html

用Python读取Word文档并写入Excel(一)https://blog.csdn.net/qq_34475777/article/details/62055523

用Python读取Word文档并写入Excel(二)https://blog.csdn.net/qq_34475777/article/details/77586663

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

文中举例所用表格地址:

学生信息统计表:https://wenku.baidu.com/view/2dd9b14d53ea551810a6f524ccbff121dc36c55a.html

健康体检表:https://wenku.baidu.com/view/72799d4cae1ffc4ffe4733687e21af45b307fe38.html

  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值