如何通过 docx 库或 xml 将单元格文本换行在表格中



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

我设法成功地操作了表格的"自动调整"和"适合文本"属性,但它们都没有帮助文本在单元格中的包装。我可以看到我的 Word 文档的 xml 版本中有一个"w:noWrap",无论我做什么我都无法操作和删除它。我相信它负责我表中的单词换行。

例如,在这种情况下,我正在添加一个表。我可以在单元格中容纳文本并将自动调整设置为"true",但终生无法包装文本:

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:noWrap元素的 w:val 属性值的方法,但随后您必须指定属性命名空间的 Clark 名称,这会增加一些额外的麻烦,并且不会真正产生不同的结果,除非出于某种原因您想保留该元素。

最新更新