我在使用 python-docx 生成的文档中遇到错误,特别是如果我包含模板中的表格



我使用python-docx以编程方式将数据插入到新文档中。打开新文件时,我收到以下错误消息。

Word在document_name中发现无法读取的内容。是否要恢复此文档的内容?如果您信任此文档的来源,请单击"是"。

以下是我的代码达到这一点的过程:

  1. 复制一个docx文件,我们将把我们的发现模板称为工作文件夹
  2. 将作为报告文档的另一个docx文件复制到同一工作文件夹
  3. 在我们的调查结果文档中找到要包含在报告中的表格
  4. 在表格中填写一些数据,并将现在完成的表格放入报告文档中
  5. 将报告文档另存为名为generated.docx的新文件

到目前为止我已经明白了什么:

  • 如果我不在表中填写任何信息,就复制它从调查结果模板到报告,我仍然得到了以上内容错误消息
  • 如果我在没有调查结果模板中的表文档都很好,没有错误
  • 源文件没有错误,至少Word在打开结果文档或报告文档时没有抱怨
  • 如果我让Word更正错误,文档中的所有超链接都会断开,链接的文本和链接样式都在那里,但目标不见了,当点击alt+F9后查看文档时,您可以看到{HYPERLINK}也指示了丢失的目标

经过大量的谷歌搜索,找到了一些类似的答案,但这些答案并没有解决问题,我觉得这可能是相关的。调查结果文档中的表包含大量合并的单元格。它只是一个表,而不是我最初认为的嵌套表。

标题有2行深,左边有4个合并单元格用于查找标题,右边有两列,下面有标题和相关数据。然后,表格的主体是每行合并单元格的混合体。有些行将合并所有单元格,而另一些行则合并了3个单元格中的2个。

以下是我用来从调查结果文档中获取表格的代码:

for table in findings_templates.tables:
row = table.rows[0]
for cell in row.cells:
if title.lower() in cell.text.lower():
severity = get_severity_from_template(table)
for item in severity_array:
if severity in item[1]:
anchor = item[0]
# snip
# Insert some data into table here
# snip
addTableAfterParagraph(report_document, table, title)
return True

由于错误是在未经修改的情况下发生的,我们将省略修改代码。以下是将表格插入模板文档的代码:

def addTableAfterParagraph(report_document, table, title):
for para in report_document.paragraphs:
if para.text == title:
p = para._p
p.addnext(table._tbl)

此外,我为表格添加了一些打印行_tbl.xml和我看不出源表和插入到文档中的表有多大区别,只是第一行有几个不同的xmlns标记。

我想要一些故障排除技巧或任何建议。如果需要更多信息,请告诉我。提前感谢!

更新:是源表中的超链接导致了这个问题。我现在正在标记这个问题已经解决,如果我不能弄清楚,可能会提出另一个更具体的问题。

我最终从源文档表中读取数据,然后以编程方式创建自己的表,并在执行任何转换的同时将数据插入其中,例如创建超链接、样式等。

这很痛苦,但最终解决了问题,并为未来提供了灵活性。

相关内容

最新更新