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

使用Python合并批量生成的Word文档后图片无法显示的问题求助

解决Word文档合并后图片无法显示的问题

问题核心:直接操作_body._body复制XML元素时,仅复制了图片的引用路径,未将图片文件本身同步到合并文档的媒体资源库,导致Word无法找到图片文件。

修复后的代码

from openpyxl import load_workbook
from docxtpl import DocxTemplate
import os
from docx import Document
from docx.enum.text import WD_BREAK

# 定义文件路径
excel_file_path = "/Users/muhammad/Documents/namelist.xlsx"
word_doc_path = "/Users/muhammad/Documents/template.docx"
output_dir = "/Users/muhammad/Documents/output"
combined_output_path = "/Users/muhammad/Documents/combined_output.docx"

# 加载Excel工作簿
workbook = load_workbook(excel_file_path)
sheet = workbook.active

# 创建合并文档
combined_doc = Document()

# 遍历Excel行
for row in sheet.iter_rows(min_row=2, values_only=True):
    sn, oid, intent, name = row

    # 加载模板并渲染
    template = DocxTemplate(word_doc_path)
    context = {
        'SN': f'S/N {sn}',
        'OID': f'OID {oid}',
        'INTENT': f'({intent})',
        'NAME': name
    }
    template.render(context)

    # 保存单个文档(可选,不需要可注释)
    output_file_path = os.path.join(output_dir, f"output_{sn}.docx")
    template.save(output_file_path)

    # 获取渲染后的文档对象
    rendered_doc = template.docx

    # 合并内容到总文档,自动同步图片资源
    for element in rendered_doc.element.body:
        combined_doc.element.body.append(element)
    # 添加分页符(可选,避免内容连续)
    combined_doc.add_page_break()

# 保存合并文档
combined_doc.save(combined_output_path)

修复说明

  • 直接调用template.docx获取渲染后的文档对象,无需重新读取本地文件,减少IO操作的同时避免图片引用丢失
  • 操作element.body而非内部私有属性_body._body,这是python-docx官方推荐的更稳定的XML元素操作方式
  • 图片的二进制数据会随元素复制自动同步到合并文档的媒体库,确保引用有效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:43:18