python合并word

1 场景

合并多个word文件到一个文件中,用于文件的批量打印。

要求:

  1. 每个文件合并时,均从从一个新页面开始,文件之间的内容不连在一起。

  2. 文件的样式不发生改变。

2 方案

采用python实现,使用python中的python-docxdocxcompose结合的方式来实现此功能。

优点:

  1. 跨平台,不依赖office中的word组件Word.Application,可以部署在inux环境中。
  2. 底层不依赖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接口调用其他程序是,需设置好调用超时时间,防止无限等待请求结果,导致负载均衡时,大量请求超时而导致的程序整体不再分发请求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,755评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,305评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,138评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,791评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,794评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,631评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,362评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,264评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,724评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,900评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,040评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,742评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,364评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,944评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,060评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,247评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,979评论 2 355