如何通过 docx 库或 xml 将单元格文本包装在表格中?
How to wrap cell text in tables via docx library or xml?
我一直在使用 python docx 库和 oxml 自动对我的 word 文档中的 table 进行一些更改。不幸的是,无论我做什么,我都无法将文本包装在 table 单元格中。
我设法成功地操纵了我的 table 的 'autofit' 和 'fit-text' 属性,但没有一个有助于单元格中文本的换行。我可以看到我的 word 文档的 xml 版本中有一个 "w:noWrap",无论我做什么我都无法操作和删除它。我相信它负责我 table.
中的自动换行
例如,在这种情况下,我添加了一个 table。我可以在单元格中调整文本并将自动调整设置为 '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>
的子元素,该元素控制 table 单元格属性。
您应该能够使用 XPath 从 table 单元格元素访问它:
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 名称,这会添加一些额外的大惊小怪并不会真正产生不同的结果,除非出于某种原因你想保留那个元素。
我一直在使用 python docx 库和 oxml 自动对我的 word 文档中的 table 进行一些更改。不幸的是,无论我做什么,我都无法将文本包装在 table 单元格中。
我设法成功地操纵了我的 table 的 'autofit' 和 'fit-text' 属性,但没有一个有助于单元格中文本的换行。我可以看到我的 word 文档的 xml 版本中有一个 "w:noWrap",无论我做什么我都无法操作和删除它。我相信它负责我 table.
中的自动换行例如,在这种情况下,我添加了一个 table。我可以在单元格中调整文本并将自动调整设置为 '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>
的子元素,该元素控制 table 单元格属性。
您应该能够使用 XPath 从 table 单元格元素访问它:
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 名称,这会添加一些额外的大惊小怪并不会真正产生不同的结果,除非出于某种原因你想保留那个元素。