⽤python将word⽂档合并实例代码
⽬录
背景:
设计思路:
脚本环境说明:
完整代码:
功能执⾏效果图:
总结:
背景:
由于⼯作需要,现在有这么⼀个需求,要合并⼤量的word⽂档,⽽且要在不同的⽬录下到同⼀个⼈的word⽂档,进⾏合并,最终输出⼀个合并后的word⽂档。⼀般来说⼏个或者⼗⼏个量不多的话,就⼿⼯合并⼀下好了,但现在这个量是真的⼤。⽬录有⼗多个,每个⽬录⼜有50多个不同⼈的word⽂档,⽽且同⼀个⼈在不同⽬录下⼜不⼀定都有word⽂档,因此,
整个合并⼯作就出现了⼈⼯操作的困难:
⼯作量多;容易疏漏犯错。
为此,利⽤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 docxcomposeposer 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 = l_values(2)[1::]
Sname_list = l_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 ists('实训汇总'):
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.wd(),'%s.docx' % fname), 16)
doc.Close()
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 = ime(tmp_file)
new_file_mtime = ime(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,我们可以很便捷的满⾜我们的需求,鉴于这个需求似乎是长期性的,所以还是有必要写个⼩⼯具来优化⼀下⾃⼰的办公⽅式,提⾼⾃⼰的业务能⼒。
到此这篇关于⽤python将word⽂档合并实例代码的⽂章就介绍到这了,更多相关python word⽂档合并内容请搜索以前的⽂章或
继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。