You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python合并多个docx文件?附文本文件合并代码示例

合并DOCX文件的Python实现方案

一、替代with open的DOCX合并代码

用python-docx处理DOCX文件时,不需要with open语法,而是通过docx.Document类加载和保存文档。对应你原来的文本合并逻辑,改写后的代码如下:

from docx import Document

# 初始化空的目标文档
combined_doc = Document()

files_to_combine = ["file1.docx", "file2.docx", "file3.docx"]  # 你的待合并文件列表

for doc_path in files_to_combine:
    # 加载源文档
    source_doc = Document(doc_path)
    
    # 复制源文档的所有段落到目标文档,同时保留格式
    for para in source_doc.paragraphs:
        new_para = combined_doc.add_paragraph()
        for run in para.runs:
            new_run = new_para.add_run(run.text)
            # 复制文本格式(字体、粗细、斜体等)
            new_run.font.bold = run.font.bold
            new_run.font.italic = run.font.italic
            new_run.font.size = run.font.size
            new_run.font.name = run.font.name
    
    # 每个文档之间添加空行分隔(对应原代码中的换行操作)
    combined_doc.add_paragraph()

# 保存合并后的文档
combined_doc.save("Combined_file.docx")

这个逻辑和你原来的文本合并完全对应:遍历待合并列表,逐个加载文件,将内容复制到目标文档,最终保存结果。

二、关于DOCX文件中的图片复制

python-docx本身不支持直接复制图片(因为图片存储在DOCX的压缩包内部,需要同时处理媒体文件的复制和文档内的引用关系)。基础的段落复制代码会丢失图片,要实现带图片的合并,需要额外处理图片的提取和插入:

简化版的带图片合并代码示例:

from docx import Document
import os
import shutil
from docx.shared import Inches

def extract_images(doc_path, temp_dir):
    # 解压DOCX文件提取内部图片
    os.makedirs(temp_dir, exist_ok=True)
    shutil.unpack_archive(doc_path, temp_dir, "zip")
    media_dir = os.path.join(temp_dir, "word/media")
    images = []
    if os.path.exists(media_dir):
        for img_file in os.listdir(media_dir):
            images.append(os.path.join(media_dir, img_file))
    return images

# 初始化目标文档
combined_doc = Document()
temp_root = "temp_docx_media"

files_to_combine = ["file1.docx", "file2.docx"]

for doc_path in files_to_combine:
    source_doc = Document(doc_path)
    temp_dir = os.path.join(temp_root, os.path.basename(doc_path).split(".")[0])
    # 提取当前文档的图片
    images = extract_images(doc_path, temp_dir)
    
    # 遍历源文档的所有内容元素
    for element in source_doc.element.body:
        if element.tag.endswith("p"):
            para = source_doc.paragraphs[source_doc.element.body.index(element)]
            new_para = combined_doc.add_paragraph()
            for run in para.runs:
                # 检测是否为图片run
                if run._element.xml.find("pic:pic") != -1:
                    # 匹配对应图片并插入
                    img_idx = int(run._element.xml.split("media/image")[-1].split(".")[0]) - 1
                    if img_idx < len(images):
                        combined_doc.add_picture(images[img_idx], width=Inches(4))
                else:
                    # 复制文本内容和格式
                    new_run = new_para.add_run(run.text)
                    new_run.font.bold = run.font.bold
                    new_run.font.italic = run.font.italic
                    new_run.font.size = run.font.size
                    new_run.font.name = run.font.name
        elif element.tag.endswith("tbl"):
            # 处理表格(如需保留表格内容)
            tbl = source_doc.tables[source_doc.element.body.index(element)]
            new_tbl = combined_doc.add_table(tbl.rows.count, tbl.columns.count)
            for i, row in enumerate(tbl.rows):
                for j, cell in enumerate(row.cells):
                    new_tbl.cell(i,j).text = cell.text
    
    combined_doc.add_paragraph()

# 保存合并后的文档
combined_doc.save("Combined_with_images.docx")

# 清理临时文件
shutil.rmtree(temp_root)

注意:这个简化版仅处理基础图片场景,复杂的图文混排(如图片与文本同段落)需要更细致的XML解析优化。

内容的提问来源于stack exchange,提问作者ewr3243

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:10:11