多人协作撰写方案、分章节编写报告、各部门分别提交材料——这些场景下,最终往往需要把若干份独立的 word 文档整合成一个完整文件。如果靠手工复制粘贴,不仅要在多个窗口间反复切换,还容易丢失页眉页脚、页码、分栏这类页面级设置,合并后再逐项修复反而更费时间。
用 python 自动化合并的价值就在于此:它可以把"复制内容"升级为"搬运结构",让每个文档原有的节设置、样式体系一并被保留下来。同时,脚本化之后还能轻松扩展到批量场景,比如把一个文件夹里的十几份文档按文件名顺序合并成一份。
本文以 spire.doc 为例,介绍几种常用的 word 文档合并方式,包括最简单的整文插入、保留节结构的克隆合并、保持源文档格式的合并,以及把内容合并到同一页的做法。
环境准备
开始前,先通过 pip 安装 spire.doc:
pip install spire.doc
安装完成后,在脚本顶部引入命名空间。本文的示例全部基于 document 对象展开,通过它加载文档、访问节集合与正文元素,最后输出合并结果。
from spire.doc import * from spire.doc.common import *
用 inserttextfromfile 快速合并
如果只关心正文内容、对页面设置没有特殊要求,最省事的方式是 inserttextfromfile() 方法。它接受一个文件路径,让库自动识别文档格式,并把其中的内容插入到当前文档的末尾。整个过程只需一次调用,适合快速拼接草稿或纯文本性质的材料。
from spire.doc import * from spire.doc.common import * inputfile1 = "./data/sample.docx" inputfile2 = "./data/sampleb_1.docx" outputfile = "simpleinsertfile.docx" # 加载作为主体的 word 文档 doc = document() doc.loadfromfile(inputfile1) # 将另一个文档的内容插入进来 doc.inserttextfromfile(inputfile2, fileformat.auto) # 保存结果 doc.savetofile(outputfile, fileformat.docx2013) doc.close()
第二个参数 fileformat.auto 表示由库自动判断待插入文件的格式,因此无论是 .doc 还是 .docx 都能正常处理,省去了事先判断类型的麻烦。需要注意的是,这种方式以"内容"为单位合并,第二个文档的节属性、页面方向等设置不会作为独立的节带入结果文档,而是按当前文档的排版规则重新排布。
按节克隆保留原有排版
当被合并的文档各自有不同的页面设置时——比如一份是纵向 a4、另一份是横向表格页——就需要以"节"为单位搬运。word 中的节(section)是页面级格式的基本单位,页边距、纸张方向、页眉页脚都挂在节上。通过克隆节并加入目标文档的节集合,可以让这些设置原样保留。
from spire.doc import *
from spire.doc.common import *
inputfile1 = "./data/sample.docx"
inputfile2 = "./data/sampleb_1.docx"
outputfile = "merge.docx"
# 加载目标文档
document = document()
document.loadfromfile(inputfile1, fileformat.docx)
# 加载待合并的文档
documentmerge = document()
documentmerge.loadfromfile(inputfile2, fileformat.docx)
# 逐节克隆并追加到目标文档
for i in range(documentmerge.sections.count):
sec = documentmerge.sections.get_item(i)
document.sections.add(sec.clone())
# 保存结果
document.savetofile(outputfile, fileformat.docx)
document.close()
documentmerge.close()
这里的关键是 sec.clone():直接把另一个文档的节对象加进来会引发归属冲突,克隆则生成一份独立的副本,可以安全地加入目标文档。sections.add() 会把新节追加到末尾,因此合并后的顺序就是循环遍历的顺序。
这种方式下,每个节都保留了自己的页面设置,合并结果中横向页和纵向页可以共存,页眉页脚也各自独立,非常适合拼接结构差异较大的正式文档。
合并时保持源文档格式
按节克隆虽然保留了页面设置,但样式层面仍可能出现偏差:如果两份文档定义了同名的样式(比如都叫"正文"但字体不同),合并后目标文档的样式定义可能覆盖源文档的设定,导致段落外观发生变化。遇到这种情况,可以在合并前开启 keepsameformat 属性。
from spire.doc import *
from spire.doc.common import *
inputfile1 = "./data/sample.docx"
inputfile2 = "./data/sampleb_1.docx"
outputfile = "keepsameformat.docx"
# 加载源文档与目标文档
srcdoc = document()
srcdoc.loadfromfile(inputfile1)
destdoc = document()
destdoc.loadfromfile(inputfile2)
# 让源文档在合并时保持自身格式
srcdoc.keepsameformat = true
# 将源文档的节复制到目标文档
for i in range(srcdoc.sections.count):
section = srcdoc.sections.get_item(i)
destdoc.sections.add(section.clone())
# 保存结果
destdoc.savetofile(outputfile, fileformat.docx2013)
srcdoc.close()
destdoc.close()
keepsameformat 需要设置在源文档对象上,它的作用是告诉库:在把内容搬过去时,连同样式定义一起携带,而不是改投目标文档的样式体系。这个属性必须在执行克隆操作之前设置才会生效。
如果合并后仍发现个别段落的字体不对,通常是因为两份文档使用了同名的样式但定义不同。这种情况下除了开启 keepsameformat,也可以在源文档中重命名冲突样式,从根源上避免覆盖。
合并到同一页
前面几种方式都会带来节与节之间的分隔,内容默认从新的一页开始。但有时我们希望两份文档的内容连续排布,中间不产生分页——比如把一段补充说明直接续在正文后面。这种情况下需要绕过节,直接在正文元素层面搬运内容。
from spire.doc import *
from spire.doc.common import *
inputfile1 = "./data/insert.docx"
inputfile2 = "./data/tableofcontent.docx"
outputfile = "mergedocsonsamepage.docx"
# 加载源文档与目标文档
document = document()
document.loadfromfile(inputfile1)
destinationdocument = document()
destinationdocument.loadfromfile(inputfile2)
# 遍历源文档的节,再遍历节正文中的每个对象
for i in range(document.sections.count):
section = document.sections.get_item(i)
for j in range(section.body.childobjects.count):
obj = section.body.childobjects.get_item(j)
# 逐个克隆到目标文档第一节的正文中
destinationdocument.sections[0].body.childobjects.add(obj.clone())
# 保存结果
destinationdocument.savetofile(outputfile, fileformat.docx)
document.close()
destinationdocument.close()
这段代码用两层循环深入到了 body.childobjects,也就是段落、表格、图片这些具体的正文元素。由于没有新建节,所有内容都被放进目标文档的第一节,因而会自然地连续排列,不会因为节的分隔而另起一页。与之相对,前面按节克隆的方式每加一个节通常就会带来分页效果。
实用技巧
批量合并整个文件夹
把按节克隆的写法包装一下,配合 os 模块就能把一个文件夹里的文档按名称顺序合并成一份。下面的示例先对文件名排序,再依次追加,保证合并顺序可预期。
import os
from spire.doc import *
from spire.doc.common import *
input_dir = "./data/chapters"
outputfile = "merged.docx"
# 按文件名排序,确保合并顺序稳定
files = sorted([f for f in os.listdir(input_dir) if f.lower().endswith(".docx")])
# 以第一份文档作为合并的基座
merged = document()
merged.loadfromfile(os.path.join(input_dir, files[0]))
# 依次把其余文档的节追加进来
for name in files[1:]:
doc = document()
doc.loadfromfile(os.path.join(input_dir, name))
for i in range(doc.sections.count):
merged.sections.add(doc.sections.get_item(i).clone())
doc.close()
merged.savetofile(outputfile, fileformat.docx2013)
merged.close()
先用 sorted() 排序很重要,因为 os.listdir() 返回的顺序取决于文件系统,并不保证按名称排列。以第一份文档作为基座、其余依次追加的写法,也能自然地保留首份文档的样式与页面设置作为整篇的基准。
合并方式的选用建议
四种方式各有适用场景,可以按需选择:只拼接内容、不在意页面设置时用 inserttextfromfile(),代码最少;需要保留各自的纸张方向、页边距、页眉页脚时按节克隆;两份文档样式体系不同、担心格式被覆盖时开启 keepsameformat;希望内容连续排布、中间不分页时则下沉到 childobjects 层面搬运。
另外提醒一点:合并后如果文档里出现了多余的分页符,通常是因为源文档最后一节恰好以分页结束。这时可以先在源文档中删除末尾的空段落,再执行合并,输出会更加干净。
小结
本文介绍了使用 python 合并 word 文档的四种做法:
inserttextfromfile()— 一行调用完成内容插入,fileformat.auto自动识别格式,适合快速拼接- 按节克隆 — 通过
sections.add(sec.clone())保留各文档独立的页面设置与页眉页脚 keepsameformat = true— 设置在源文档上,避免同名样式被目标文档覆盖childobjects层面搬运 — 绕过节结构,让内容连续排布而不产生分页
再配合 os 模块与 sorted() 做批量处理,就能把多份分散的文档稳定地整合成一份。实际使用时,建议先明确"要不要保留各自的页面设置"和"要不要连续排版"这两个问题,据此选择对应方式,合并效率与输出质量都会更有保障。
到此这篇关于python快速合并word文档的完整指南的文章就介绍到这了,更多相关python合并word内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论