用Python怎样实现和执行批量的word文档合并操作
Admin 2022-06-21 群英技术资�
工作量多;容易疏漏犯错�
为此,利用python进行高效准确的执行这类工作,尤为凸显现代自动化办公的能力。因此,我写了这个python脚本,作为一个小工具来辅助我的工作需求�
首先,整个脚本实现两个功能:
查看各目录下未提交word文档的名单合并各目录下的word文档查看各目录未提交名单�
对于这个需求,首先是读一个写有所有人姓名等信息的Excel文件,有格式要求。然后通过遍历Excel的信息,获取到所有人的姓名。遍历各目录下,是否有对应姓名的文件存在,如果没有,则输出没有提交文件的姓名�
合并word文件�
合并word文件和上一个需求有类似的地方。首先我们都需要读Excel文件,得到姓名信息,然后在各目录下获取到这个人所提交的所有word文件的文件路径,然后通过合并word的操作实现文件合并,合并后最终输出到指定的目录下�
脚本对第三方包有依赖,执行前必须先安装对应的第三方包
pip install python-docx pywin32 xlrd
首先,目录结构必须是如下图所示,所有需要遍历的目录名称都必须是【实�+数字】,因为脚本中涉及多处正则匹配�
其次,Excel文件必须遵循下图所示的格式,首行是标题行,遍历的时候会自动跳过,遍历时会遍历C列和D列,其中C列是人员编号,D列是人员姓名
接着,python脚本必须要根目录�
最�,执行脚本的时候,必须带有传参,传递的参数就是那个Excel�
Microsoft Windows [版本 10.0.19043.1415] (c) Microsoft Corporation。保留所有权利� C:\Windows\system32>python tools.py 花名�.xlsx
#! /usr/bin env python # -*- coding:utf-8 -*- """ ============================ ======Power By Python3====== ====== Author Task138 ====== ============================ """ import sys import xlrd, os, re from docx import Document from docxcompose.composer import Composer from win32com import client as wc # 读Excel表获取学生的学号和姓� def read_excel(excel_file): workbook = xlrd.open_workbook(excel_file) sheet = workbook.sheet_by_index(0) name_list = [] name_dict = [] Sno_list = sheet.col_values(2)[1::] Sname_list = sheet.col_values(3)[1::] for i in range(len(Sno_list)): try: Sno = str(int(Sno_list[i])) except: Sno = Sno_list[i] dict = {} dict['Sno'] = Sno dict['Sname'] = Sname_list[i] name_list.append(Sname_list[i]) name_dict.append(dict) return name_list, name_dict # 合并文档 def merge_doc(source_file_path_list,target_file_path): #填充分页符号文档 page_break_doc = Document() page_break_doc.add_page_break() #定义新文� target_doc = Document(source_file_path_list[0]) target_composer = Composer(target_doc) for i in range(len(source_file_path_list)): #跳过第一个作为模板的文件 if i==0: continue #填充分页符文� target_composer.append(page_break_doc) #拼接文档内容 f = source_file_path_list[i] target_composer.append(Document(f)) #保存目标文档 target_composer.save(target_file_path) print('[ %s ]保存成功' % target_file_path) if __name__ == '__main__': if len(sys.argv) < 2: print('缺乏必要的参数,请输入学生Excel表作为参�') print('程序终止') exit() excel_file = sys.argv[1] print('请选择需要执行的功能�') print('[ 0 ] 查看各实训目录下未提交的学生名单') print('[ 1 ] 合并实训文件') cmd = input('请选择� ') while cmd not in ['0','1']: print('输入有误,请重新输入,按 Ctrl+C 可退出程�') print('请选择需要执行的功能�') print('[ 0 ] 查看各实训目录下未提交的学生名单') print('[ 1 ] 合并实训文件') cmd = input('请选择� ') try: name_list, name_dict = read_excel(excel_file) except Exception as e: print('Excel读取失败,程序终止,错误如下�') print(e) print() exit() else: if cmd == '0': # 实训目录的数� file_list = [] for i in os.listdir(): if os.path.isdir(i): if re.match(r'实训\d', i): file_list.append(i) for i in range(1, len(file_list) + 1): dir_name = '实训%s' % i # 进入该实训目� os.chdir(dir_name) file_list = os.listdir() submit_list = [] for x in file_list: for j in name_list: if j in x and j not in submit_list: submit_list.append(j) result = list(set(submit_list) ^ set(name_list)) if result: print(dir_name, result) os.chdir('../') if cmd == '1': if not os.path.exists('实训汇�'): os.mkdir('实训汇�') print('目录[ 实训汇� ]创建成功') # 实训目录的数� file_list = [] for i in os.listdir(): if os.path.isdir(i): if re.match(r'实训\d',i): file_list.append(i) for i in name_dict: doc_list = [] for j in range(1,len(file_list)+1): dir_name = '实训%s' % j # 进入该实训目� os.chdir(dir_name) tmp = [] for x in os.listdir(): # 判断文件尾缀 fname,fext = os.path.splitext(x) # 如果�.doc,则转换�.docx if fext == '.doc' and not x.startswith('~$'): w = wc.Dispatch('Word.Application') doc = w.Documents.Open(os.path.abspath(x)) doc.SaveAs(os.path.join(os.getcwd(),'%s.docx' % fname), 16) doc.Close() os.remove(x) print('转换文件[ %s ]类型�.docx' % x) elif fext == '.docx': if (i['Sname'] in x) and (len(tmp) == 0): # 只有一个文� tmp.append(x) elif (i['Sname'] in x) and (len(tmp) != 0): # 有多个文件,按照最新的修改时间进行替换 tmp_file = tmp.pop() old_file_mtime = os.path.getmtime(tmp_file) new_file_mtime = os.path.getmtime(x) if new_file_mtime > old_file_mtime: # 新文件比较新,以新的为准 tmp.append(x) else: # 老文件比较新,以老文件为� tmp.append(tmp_file) else: # 其它文件类型,直接跳� # print('当前文件[ %s ]类型不是.doc或�.docx,跳过此文件的合�' % os.path.abspath(x)) continue if tmp: # 如果这次实训有这位同学的文件 doc_list.append(os.path.join(dir_name,tmp.pop())) # 返回父目� os.chdir('../') if doc_list: # 有内容,进行文档合并 try: merge_file_name = i['Sno'] + '-' + i['Sname'] + '-' + '实训汇�' + '.docx' merge_doc(doc_list, './实训汇�/' + merge_file_name) except Exception as e: print() print('[ %s ]学生信息有误,程序中�' % i['Sname']) print(e) print()
通过python,我们可以很便捷的满足我们的需求,鉴于这个需求似乎是长期性的,所以还是有必要写个小工具来优化一下自己的办公方式,提高自己的业务能力�
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容�
猜你喜欢
这篇文章主要为大家详细介绍了基于OpenCV如何实现答题卡识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一�
这篇文章主要介绍了Django跨域请求无法传递Cookie的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Python 3版本中的异常处理与Python 2版本主要有以�4点不同:
们经常会遇到这种情况,有一个数学函�,我们希望了解他的图像,这个时候使用python 的matplotlib就可以帮助我�,下面这篇文章主要介绍了利用Python Matlab绘制曲线图的相关资料,需要的朋友可以参考下
这篇文章主要介绍了Python yield 关键词,要理解yield的作用,你必须理解生成器是什么。在理解生成器之前,必须先理解迭代器。下面文章我们就先从<BR>迭代器开始展开yield关键词的相关自资料�,需要的朋友可以参考一�
推荐内容
联系我们
24小时售后 � 24小时售后TEL�0668-2555666 售前咨询TEL�400-678-4567 投诉建议TEL�0668-2555999 投诉建议邮箱:t[email protected] 信息安全TEL�0668-2555118 域名空间客服 � 公司总机�0668-2555555 公司传真�0668-2555000Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所� 茂名市群英网络有限公�
增值电信经营许可证 : B1.B2-20140078