You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动