使用python-docx的词表格单元格背景颜色

时间:2015-06-29 16:50:31

标签: python xml ms-word python-docx

我有一个简单的word文档,其中包含一个包含一行和两列的表(换句话说,就是两个单元格)。第一个单元格的背景颜色是红色,另一个是黑色。我想使用python-docx将两者都改为白色。

我尝试了几种方法,但最有希望的方法如下。它修改了底层的xml。

import docx
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml

# Set a cell background (shading) color to RGB D9D9D9. 
shading_elm = parse_xml(r'<w:shd {} w:fill="FFFFFF"/>'.format(nsdecls('w')))

doc = docx.Document('assets/tabletest.docx')
table = doc.tables[0]

cell = table.cell(0,0)
testchild = cell._tc.getchildren()[0]
testchild.append(shading_elm)

doc.save('assets/tabletest2.docx')

上面的代码将第一个单元格修改为白色,将第二个单元格修改为黑色。我尝试通过在doc.save

之前添加以下代码来修改第二个单元格
cell2 = table.cell(0,1)
testchild2 = cell2._tc.getchildren()[0]
testchild2.append(shading_elm)

现在的问题是,第一个细胞仍然是红色,第二个细胞现在是白色。它似乎只是在修改最后一个单元格。

我肯定错过了一些东西,但我不是xml专家。有没有人有想法?

1 个答案:

答案 0 :(得分:0)

最好的办法是探索实际的XML以查看您尝试修改的内容。 OpenXML Schema非常复杂,Word在编辑过程中会做各种各样的事情,你可能没想到。 _tc.getchildren()[0]只是得到孩子时排在第一位的内容,并且我不确定它是否已无条件准备接受tcPr元素<w:shd>元素。此外,如果那里已经有w:shd元素,您需要更新它,而不是添加新元素。

我建议使用opc-diag浏览您正在使用的.docx包的document.xml部分。如果您从文档中删除其他内容,将更容易找到您之后的位。

如果您发布了那里发现的XML,我可以帮助您确定要做的事情。