使用python-docx复制Docx图表至目标文档后文件损坏问题求助
使用python-docx复制Docx图表至目标文档后文件损坏问题求助
我现在在做一个需求:把一个docx文件里的内容复制并追加到另一个docx文件中,但一碰到图表就出问题了。
我用的是python-docx,但这个库本身不原生支持图表,所以我自己梳理了一套处理流程:
- 从
document.xml中提取图表对应的run的XML内容 - 找到关联的
chart.xml部件以及对应的rId - 将
chart.xml作为新部件添加到目标docx中,获取新的rId - 替换第一步中XML里的旧
rId为新的,再把这段XML追加到目标docx的document.xml里 - 添加
chart.xml关联的其他部件到目标docx,同时更新chart.xml里的所有关联rId
下面是我写的伪代码:
from docx import Document from docx.oxml import parse_xml chart_doc = Document("chart.docx") target_doc = Document("target.docx") for paragraph in chart_doc.paragraphs: new_para = target_doc.add_paragraph() for run in paragraph.runs: run_xml = run.get_xml() chart_rid = extract_rid(run_xml) rel = get_rel_by_id(chart_rid) chart_part = rel.target_part new_part = create_part(chart_part) new_rid = target_doc.relate_to(new_part, rel.reltype) if has_relationships(rel.target_part): rids = add_related_parts(chart_part, target_doc) new_part.blob = replace_rids_in_xml(new_part.content, rids).encode() new_run = parse_xml(run_xml) new_para.append(new_run) target_doc.save("target_modified.docx")
现在遇到的问题是,修改后的docx文件无法用Word打开。我用Open XML Productivity Tool做了验证,工具显示有两个错误,但我觉得这些错误和当前问题无关——因为我拿一个正常包含图表的docx文件去验证,也会弹出同样的错误提示:
- 第一部分错误提示:属性 'http://schemas.openxmlformats.org/officeDocument/2006/relationships:id' 在元素 '<c:chart>' 上声明,但未被使用
- 第二部分错误提示:元素 '<c:chart>' 具有无效的子元素 '<c:title>'。预期可能的元素列表: '<c:autoTitleDeleted, c:plotArea, c:legend, c:plotVisOnly, c:dispBlanksAs, c:showDLblsOverMax, c:extLst>'
我想知道生成的文件到底哪里出了问题,还有我的处理流程中漏掉了哪些关键步骤?麻烦各位帮忙分析一下。
另外,我已经把涉及到的三个docx文件都整理好了,可以用来复现问题。
我知道有一些成熟的商业库支持这个功能,但目前我没办法使用这些工具。
备注:内容来源于stack exchange,提问作者tnhmcm




