使用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
相关产品推荐
相关产品推荐

