批量合并格式不确定的Word文档

本文介绍了如何使用Python批量合并不同格式的Word文档,包括doc和docx。作者首先创建一个空Word文档,然后遍历每个要合并的文件,复制并粘贴到新文档中,并在每个文件之间插入分页符以解决图片错位问题。为保留原始格式,文章建议以第一个文件为基准,确保合并后的文档样式一致。最终的解决方案成功解决了图片位置问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

📢作者: 小小明-代码实体

📢博客主页:https://blog.csdn.net/as604049322

📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!

📢本文链接:https://xxmdmst.blog.csdn.net/article/details/129409456

需求:有几百个Word文档,同时存在doc和docx格式,要合并到一个文件中。

对于该问题,python最简单的方法是调用宏复制粘贴去实现。我的思路:

先创建一个word空文档,复制每个要合并的文档,在空文档中新增一个空段落,然后在刚才新增的段落上粘贴当前遍历到的Word,循环完毕后保存文件。

最终完整代码为:

"""
小小明的代码
CSDN主页:https://blog.csdn.net/as604049322
"""
__author__ = '小小明'
__time__ = '2023/3/8'

from glob import glob
from win32com import client as win32
import os


def combine_word(src_dir, result):
    word = win32.Dispatch("Word.Application")
    word.Visible = True
    rDoc = word.Documents.Add()
    # 将此属性设置为false可在代码运行时抑制提示和警报消息;当消息需要响应时,Excel将选择默认响应。
    word.DisplayAlerts = False
    # 关闭屏幕更新,可视模式下将无法看到执行情况,需要看的时候重新设置为True即可
    word.ScreenUpdating = False
    for file in glob(f"{src_dir}/[!~]*.doc*"):
        filepath = os.path.abspath(file)
        print(filepath)
        wdDoc = None
        try:
            wdDoc = word.Documents.Open(filepath)
            # Range(start,end)根据起始和结束位置获取文档对象,不传入获取整个文档
            wdDoc.Range().Copy()
            # 粘贴前先插入一个段落
            new_p = rDoc.Paragraphs.Add()
            # 将结果文档粘贴到新段落中
            new_p.Range.Paste()
        finally:
            if wdDoc is not None:
                wdDoc.Close()
    word.ScreenUpdating = True
    rDoc.SaveAs(os.path.abspath(result))
    rDoc.Close()
    word.Quit()


if __name__ == '__main__':
    src_dir = "word合并"
    result = "word合并.docx"
    combine_word(src_dir, result)

最终以下文件都合并到了一个文件中:

image-20230308185932785

不过上述代码经过测试发现了一点图片错位的问题:

image-20230309132213104

另外我发现Word自带的功能也可以完成Word文档合并的需求:

image-20230309132246846

通过程序在循环中调用上述方法,居然会出现相同的问题,但写死代码调用就没有这个问题。

为了解决该问题,我的考虑是,每次插入一个文件后,插入一个分页符。

再进一步考虑,如果我们总是新建文件,就可能丢失了页边距等格式,为了解决该问题,我们可以考虑将第一个文件作为基准文件,这样就能保证拥有第一个文件的基准样式。

最终代码为:

"""
小小明的代码
CSDN主页:https://blog.csdn.net/as604049322
"""
__author__ = '小小明'
__time__ = '2023/3/9'

from glob import glob

from tqdm import tqdm
from win32com import client as win32
import os


def combine_word(src_dir, result, ScreenUpdating=False):
    files = glob(f"{src_dir}/[!~]*.doc*")
    if len(files) == 0:
        print("未找到Word文档")
        return
    word = win32.Dispatch("Word.Application")
    word.Visible = True
    rDoc = None
    qbar = tqdm(files)
    word.ScreenUpdating = ScreenUpdating
    for file in qbar:
        filepath = os.path.abspath(file)
        qbar.set_description(os.path.basename(filepath))
        if rDoc is None:
            rDoc = word.Documents.Open(filepath)
            new_p = rDoc.Paragraphs.Add()
        else:
            new_p = rDoc.Paragraphs.Add()
            new_p.Range.InsertFile(filepath)
        new_p.Range.InsertBreak()
    # 删除文末空白行
    while True:
        p = rDoc.Paragraphs(rDoc.Paragraphs.Count)
        if p.Range.Text.strip() == "":
            p.Range.Delete()
        else:
            break
    word.ScreenUpdating = True
    rDoc.SaveAs(os.path.abspath(result))
    rDoc.Close()
    word.Quit()


if __name__ == '__main__':
    src_dir = "word合并"
    result = "word合并.docx"
    combine_word(src_dir, result)

再次运行:

image-20230309135409016

可以看到结果图片保持了原有的相对位置。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小明-代码实体

喜欢,就关注;爱,就打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值