1 场景
合并多个
word文件到一个文件
中,用于文件的批量打印。
要求:
每个文件合并时,均从从一个新页面开始,文件之间的内容不连在一起。
文件的样式不发生改变。
2 方案
采用python
实现,使用python中的python-docx
和docxcompose
结合的方式来实现此功能。
优点:
- 跨平台,不依赖office中的word组件
Word.Application
,可以部署在inux环境中。 - 底层不依赖office中的word组件,
速度快
,文件较多时,不卡顿。
缺点:
只支持docx
文件的合并,不支持doc文件
。如想通过此模式合并doc文件,需将doc文档转换为docx文档。
3 步骤
3.1 安装依赖包
pip install python-docx
pip install docxcompose
3.2 代码
将一个文件夹中的所有文件,都合并到一个文档中。
import os
from docx import Document
from docxcompose.composer import Composer
def merge_doc(source_file_path_list,target_file_path):
'''
合并多个docx文件
:param source_file_path_list: 源文件路径列表
:param target_file_path: 目标文件路径
:return:
'''
# 填充分页符号文档
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)
if __name__ == '__main__':
# 原文件夹路径
source_path = r"E:\\tmp\\mergeDoc\\source\\"
# 目标文件路径
target_file = r'E:\\tmp\\mergeDoc\\target.docx'
source_file_list = os.listdir(source_path)
# 获取源文件夹内文件列表
source_file_list_all = []
for file in source_file_list:
source_file_list_all.append(source_path+file)
merge_doc(source_file_list_all, target_file)
3.3 代码说明
3.3.1 文档分页
要求每个文档,都从一个新页面开始,因此需在除第一个文档的每个文档前面加上分页符
,所以单独定义了一个只包含分页符的文档page_break_doc
。
部分情况下会出现问题,如文档当前已经到最后一行
了,新加的分页符会导致生成一页空白的文件,此种情况,后续更新此文章时解决。
3.3.2 样式问题
定义目标文档,初始化时,采用target_doc = Document(source_file_path_list[0])
的方式,以第一个要拼接的文档作为初始文档。
主要是因为,如果创建的空的文档target_doc = Document()
,新生成的文档中自带的文档样式
(如标题样式、正文样式等)将会影响新拼接的文档中的采用了默认样式的内容
,故模板文档从第一个文档中进行加载默认样式,避免了这种情况。
这也是网上大多数采用此种方式合并word,样式发生变更的原因
,需注意此问题。
同时需注意,如果拼接的文档中,存在默认格式不一样,并且未为段落、文字指定单独样式的情况时,需检查,第一个文件作为模板加载的默认样式,是否会影响后续的其他文件合并后的默认样式
。
3.3.3 速度
200个文件合并,耗时10秒左右。速度非常快
4 扩展
python脚本的程序,其他程序可以直接通过命令行的形式调用
,或者python提供http接口,程序通过http接口调用
。
切记通过http接口调用其他程序是,需设置好调用超时时间,防止无限等待请求结果,导致负载均衡时,大量请求超时而导致的程序整体不再分发请求。