我有一个 Word 文档,其标题中有一个空的 1 x 3 表格(或具有任何尺寸的表格)。 我希望能够使用 python-docx 库操作表格的单元格。该文档的语言是波斯语,自然所有波斯语文本都必须从右到左开始。代码如下:
from docx import Document
document = Document("test.docx")
c = document.sections[0].header.tables[0].rows[0].cells[0]
c.text = "سلام"
document.save("output.docx")
问题是无论我使用什么样的技巧来改变文本方向,我都无法让它发挥作用。我尝试过使用
WD_TABLE_DIRECTION.RTL
标志来更改表格的方向,或使用 run.font.rtl = True
更改运行方向,甚至使用特殊的 unicode 字符(例如 u'\u202B'
和 u'\u202C'
)来更改方向,但是没有成功。
我什至尝试更改与标头相关的 xml,但老实说,这超出了我的能力范围,不幸的是,我的所有尝试都失败了。
我在深夜写下这个问题,我无法表达我现在对我的母语的仇恨程度。因此,任何帮助将不胜感激。
如果您使用 python.docx 设置
_Cell.text
,那么首先会删除所有单元格内容,然后在单元格中设置一个新段落,其中包含一个包含该文本的新文本运行。但是用于使段落文本方向从右到左的 bidi
区域设置是段落属性的一部分,在删除单元格内容时会被删除。新创建的段落将是默认段落,没有bidi
区域设置。
因此,而不是
c.text = "سلام"
,您应该尝试在单元格中找到第一个段落 - 总是应该有一个 - 并清除该段落。然后获取找到的段落的段落属性并检查它是否设置了w:bidi
。如果没有,请设置它。然后向段落添加新的文本运行,从段落属性复制可能现有的运行属性或创建新的运行属性并将 w:rtl
设置为该运行属性。终于定了run.text = "سلام"
.
完整示例:
from docx import Document
from copy import copy
from docx.oxml import OxmlElement
document = Document('test_in.docx')
cell = document.sections[0].header.tables[0].rows[0].cells[0]
#c.text = "سلام"
paragraph = cell.paragraphs[0]
paragraph.clear()
ct_ppr = paragraph.paragraph_format._element.pPr
ct_ppr_has_bidi = len(ct_ppr.xpath("./w:bidi")) > 0
if not ct_ppr_has_bidi:
ct_bidi = OxmlElement("w:bidi")
ct_ppr.append(ct_bidi)
run = paragraph.add_run()
ct_ppr_has_rPr = len(ct_ppr.xpath("./w:rPr")) > 0
if ct_ppr_has_rPr:
ct_rpr = copy(ct_ppr.xpath("./w:rPr")[0])
else:
ct_rpr = OxmlElement("w:rPr")
ct_rtl = OxmlElement("w:rtl")
ct_rpr.append(ct_rtl)
run._element.append(ct_rpr)
run.text = "سلام"
document.save('output.docx')