目录

背景:

设计思路:

查看各目录未提交名单:

合并word文件:

脚本环境说明:

完整代码:

功能执行效果图:

总结:


背景:

由于工作需要,现在有这么一个需求,要合并大量的word文档,而且要在不同的目录下找到同一个人的word文档,进行合并,最终输出一个合并后的word文档。一般来说几个或者十几个量不多的话,就手工合并一下好了,但现在这个量是真的大。目录有十多个,每个目录又有50多个不同人的word文档,而且同一个人在不同目录下又不一定都有word文档,因此,整个合并工作就出现了人工操作的困难:

  1. 工作量多;
  2. 容易疏漏犯错。

为此,利用python进行高效准确的执行这类工作,尤为凸显现代自动化办公的能力。因此,我写了这个python脚本,作为一个小工具来辅助我的工作需求。


设计思路:

首先,整个脚本实现两个功能:

  1. 查看各目录下未提交word文档的名单
  2. 合并各目录下的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'] = Snodict['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,则转换为.docxif 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))continueif 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,我们可以很便捷的满足我们的需求,鉴于这个需求似乎是长期性的,所以还是有必要写个小工具来优化一下自己的办公方式,提高自己的业务能力。

python实现word文档合并相关推荐

  1. 利用Python实现word文档合并

    实现步骤: 1.安装依赖 pip install docx pip install docxcompose pip install pyinstaller // 将py文件打包成exe文件的库 2.编 ...

  2. python实现word文档合并 v2.0

    目录 前言 要求 运行效果 脚本下载链接 前言 之前发表了一个小工具,python用于合并word文档以完成特定的工作任务,现在领导给出了新需求,适当的调整了一下word文档的合并情况.同时,各位同事 ...

  3. python操作word文档(python-docx)

    python操作word文档(python-docx) 1. 效果图 1.1 python-docx文档标题段落(等级.加粗.斜体.居中)效果图 1.2 python-docx字体(加粗.斜体.居中. ...

  4. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

  5. 用python将word文档导入数据库_python读取word文档,插入mysql数据库的示例代码

    表格内容如下: 1.实现批量导入word文档,取文档标题中的数字作为编号 2.除取上面打钩的内容需要匹配出来入库入库,其他内容全部直接入库mysql # wuyanfeng # -*- coding: ...

  6. python操作word文档中的图片_Python操作word文档插入图片和表格的实例演示

    前言P6Q免费资源网 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码P6Q免费资源网 实例代码: ...

  7. python 读取word_教你怎么使用 Python 对 word文档 进行操作

    使用Python对word文档进行操作 一.安装Python-docx Python-docx是专门针对于word文档的一个模块,只能读取docx 不能读取doc文件.说白了,python就相当于wi ...

  8. npoi操作word书签_100份Word文档合并只需3分钟?不用复制粘贴,简单到一学就会...

    办公中,我们时常会需要将很多份Word文档合并在一起,如果不会便捷的技巧光靠复制粘贴,那将会花费我们很多的时间和精力.所以,今天我们就是要教大家一个非常简单的方法,只用三分钟就能将上百份文档合并在一起 ...

  9. python获取word页数_使用Python的word文档的页数(Number of pages of a word document with Python)...

    使用Python的word文档的页数(Number of pages of a word document with Python) 有没有办法用Python有效地获得word文档(.doc,.doc ...

最新文章

  1. [微信小程序系列] 动画案例之圆点沿着圆圈运动
  2. 一份超详细的 Java 问题排查工具单
  3. DayDayUp:本博主预计2019下半年将会出两本书(关于人工智能算法及其实战案例应用方向、计算机算法竞赛集锦方向),如有合作意向,请留言告知
  4. 页面性能优化参考建议
  5. VIP站长大会(北京站)常见问题解答
  6. jQuery slideToggler() 方法 -《狗嗨默示录》-
  7. Hive Udf Rank
  8. 计算机学业水平测试网,学业水平测试
  9. TextBox的样式改成Lable
  10. 《Programming WPF》翻译 第8章 3.Storyboard
  11. 个人信息安全管理条例解释
  12. access设置 dolby_win10系统设置和安装新款杜比音效的方法
  13. 二本学院计算机专业的考研er如何顺利上岸?
  14. 2019,谁把握了 “私域流量”,谁就把握了未来十年!私域流量的未来是矩阵化!...
  15. 正高职称 程序员_软考通过之后,如何评职称呢?
  16. js 公众号 获取code_微信公众号开发之网页授权登录及code been used 解决!
  17. Tkinter 极简例子——Event篇
  18. 2022年10个最佳URL缩短器:URL缩短器替代方案
  19. Windows的文件命名长度的坑
  20. 常微分方程数值解——差商、欧拉公式详细推导及代码实现

热门文章

  1. Linux man帮助文档
  2. 2015年微信营销趋势分析与归纳!
  3. 2011刚上市的句子
  4. 微商城模板的核心处理逻辑
  5. 区块链安全:实现公链双花攻击的多种方法
  6. 秃顶之路-Day11
  7. 京东一元抢宝系统的数据库架构优化
  8. CodeForces Canada Cup 2016 A、B水题 _(:з」∠)_
  9. 计算机手机远程控制,手机怎么远程控制电脑?手机远程控制电脑步骤详解
  10. 如何屏蔽迅雷9右侧广告首页