在保留功能的同时替换XML中的字符串

问题描述 投票:0回答:1

嗨,我是新来的,我需要帮助解决问题。

我正在尝试使用python-docx根据模板生成带有数据的Word文档。在大多数情况下,我已经设法解决了一些问题。但是,我的文档具有要满足的某些条件,即只需要在最后一页

中生成某些数据。

事实是,我不知道“最后一页”是什么,这取决于添加到模板中的数据量,因此它可能是1、2或50。Python-docx,像很多其他类似的库一样,例如Reportlab没有功能来指示最后一页是什么(至少没有我发现的页面)。因此,经过大量的谷歌搜索之后,我遇到了类似于可以在模板中实现的Microsoft Word中创建的函数之类的东西:{ IF PAGE=NUMPAGES testVar }

而且我设法做到了,所以testVar仅显示在最后一页。

现在,问题在于,在生成文档之前,我需要通过Python用实际的计算值替换testVar。我以前尝试过:

theFooter = section.footer.tables[0]
theFooter.cell(0,2).text = 1000

(上述功能在模板页脚的表中]

并且用1000替换testVar时,模板中的docx函数也被替换了[[also。因此,现在我陷入了困境,试图找出如何替换testVar without来删除docx函数,以便我的100值显示在最后一页的only上,无论它在哪里。

A crop of the template in question(100值只是一个占位符变量,对应于

testVar)

关于如何精确执行此操作的任何建议?我通过StackOverflow进行了搜索,遇到了一些similar issues,但它们最终与我所需要的有所不同。
python python-3.x xml ms-word python-docx
1个回答
0
投票
经过大量阅读,想必我可能终于找到了解决方案,尽管是间接的。

[根据thisthis(并且我通过dir()进行了验证),每个_element也都具有'text'属性。

所以,我按照这些原则做了一些事情:

theFooter = document.sections[0].footer.tables[0] for run in theFooter.cell(1,3).paragraphs[0].runs: if 'w:instrText' in run._element.xml and 'xml:space="preserve"' in run._element.xml: if (run._element.xml.find("testVar") >= 0): run._element.text= "1000"

并且这似乎成功地用'1000'字符串替换了模板中的'testVar',而不会在生成单词document时影响docx函数,从而导致'1000'被打印在文档的页脚上[[only最后一页。
© www.soinside.com 2019 - 2024. All rights reserved.