我一直在使用python docx库和oxml来自动对我的Word文档中的表进行一些更改。不幸的是,无论我做什么,我都无法将文本包装在表格单元格中。
我设法成功地操纵了表格的'autofit'和'fit-text'属性,但是没有一个有助于文本在单元格中的包装。我可以看到在Word文档的xml版本中有一个“ w:noWrap”,无论我做什么我都无法操纵和删除它。我相信这是造成我桌子上的自动换行的原因。
例如,在这种情况下,我要添加一个表。我可以在单元格中插入文本,并将autofit设置为'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')
我将不胜感激。
答案 0 :(得分:0)
<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名称,这会增加一些额外的内容。大惊小怪,并不会真正产生不同的结果,除非出于某种原因您想保留该元素。