我一直在使用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 名称,这会增加一些额外的麻烦,并且不会真正产生不同的结果,除非出于某种原因您想保留该元素。