python - 如何通过 docx 库或 xml 将单元格文本包装在表格中?

标签 python xml docx python-docx

我一直在使用 python docx 库和 oxml 来自动对我的 word 文档中的表格进行一些更改。不幸的是,无论我做什么,我都无法将文本包装在表格单元格中。

我成功地操纵了表格的“autofit”和“fit-text”属性,但没有一个有助于单元格中文本的换行。我可以看到在我的 word 文档的 xml 版本中有一个“w:noWrap”,无论我做什么我都无法操作和删除它。我相信它是我表格中的自动换行的原因。

例如,在这种情况下,我要添加一个表格。我可以在单元格中调整文本并将自动调整设置为“真”,但我终生无法将文本换行:

from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

doc = Document()
table = doc.add_table(5,5)
table.autofit = True # Does Autofit but not wrapping

tc = table.cell(0,0)._tc     # As a test, fit text to cell 0,0
tcPr = tc.get_or_add_tcPr()

tcFitText = OxmlElement('w:tcFitText')
tcFitText.set(qn('w:val'),"true")
tcPr.append(tcFitText)      #Does fitting but no wrapping

doc.save('demo.docx')

如果有任何帮助或提示,我将不胜感激。

最佳答案

<w:noWrap>元素似乎是 <w:tcPr> 的子元素,控制表格单元格属性的元素。

您应该能够使用 XPath 从表格单元格元素访问它:

tc = table.cell(0, 0)._tc
noWraps = tc.xpath(".//w:noWrap")

noWraps这里的变量将是一个包含零个或多个 <w:noWrap> 的列表元素,在你的情况下可能是一个。

删除它可能是最简单的方法,您可以这样完成:

if noWraps:  # ---skip following code if list is empty---
    noWrap = noWraps[0]
    noWrap.getparent().remove(noWrap)

您还可以采用设置 w:val 的值的方法w:noWrap 的属性元素,但随后您必须指定属性命名空间的 Clark 名称,这会增加一些额外的麻烦并且不会真正产生不同的结果,除非出于某种原因您想要保留该元素。

关于python - 如何通过 docx 库或 xml 将单元格文本包装在表格中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222047/

相关文章:

python - 用于时间序列预测的最佳激活函数是什么

javascript - JavaScript 中的管道 createElement 和appendChild

c# - 向 XMl 添加节点

python - 如何将列表中的元素连接到 Python 中的一个变量中?

python - 从 numpy 数组中删除条目

c# - OpenXml Word 脚注

.net - DOCX 文件中合并域的异常 XML 表示法。

java - 来自 Java 的邮件合并

python - 重要的包和模块与 py2exe 不兼容?

java - 解析包含 XML 的字符串后,XML 文档为 null