我有一个简单的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专家。有没有人有想法?
答案 0 :(得分:0)
最好的办法是探索实际的XML以查看您尝试修改的内容。 OpenXML Schema非常复杂,Word在编辑过程中会做各种各样的事情,你可能没想到。 _tc.getchildren()[0]
只是得到孩子时排在第一位的内容,并且我不确定它是否已无条件准备接受tcPr
元素<w:shd>
元素。此外,如果那里已经有w:shd
元素,您需要更新它,而不是添加新元素。
我建议使用opc-diag浏览您正在使用的.docx包的document.xml部分。如果您从文档中删除其他内容,将更容易找到您之后的位。
如果您发布了那里发现的XML,我可以帮助您确定要做的事情。