Python Docx设置表格单元格背景颜色

4
为了设置表格中单元格的背景颜色,我使用以下代码:
doc.add_paragraph('')
t1 = doc.add_table(rows=7, cols=2)
t1.style = 'TableGrid'
for row in range(7):
    cell = t1.cell(row, 0)
    cell._tc.get_or_add_tcPr().append(shading_elm_green)

唯一的问题是结果如下:

enter image description here

但我希望所有单元格都有背景色。为什么这不能设置所有单元格?而且当我创建许多表格时,所有单元格都是透明的,只有最后一个表格的最后一个单元格被设置了。
我做错了什么?请帮我找到解决方案,我已经寻找多天了!
2个回答

4
你需要为每个单元格创建一个新的 shading_elm_green 元素。在你现有的代码中,每次分配它时,你只是将它从一个单元格移到另一个单元格。这就是为什么它最终出现在最后的原因。 lxml API 在这方面有点反直觉(直到你考虑一下自己该如何做 :)。例如,当你将一个现有元素作为另一个元素的子元素进行分配,例如使用 .append()lxml 将该元素 移动 以成为该其他元素的子元素。如果你将其附加到另一个元素上,它就会移动到那里。被分配的元素不会自动“克隆”或类似于此的操作。它只能存在一个地方,而那个地方就是你最后“放置”它的地方。
你没有展示你的元素创建代码,但无论它是什么,请将其插入到倒数第二行,事情就会按照你的预期工作。

非常感谢你,scanny。在我尝试了成千上万个选项之后,这个选项从未出现过! - A I

0
给那些想了解的人举个例子。

from docx import Document
from docx.shared import Inches
from docx.enum.table import WD_ALIGN_VERTICAL
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.style import WD_STYLE
from docx.dml.color import ColorFormat
from docx.enum.dml import MSO_COLOR_TYPE
from docx.enum.text import WD_COLOR_INDEX
from docx.enum.text import WD_COLOR
from docx.shared import Pt
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml

document = Document()


document.add_heading('Document Title', 0)

table = document.add_table(1, 11)
table.style = 'Table Grid'
table.cell(0,1).merge(table.cell(0,4))
table.cell(0,6).merge(table.cell(0,7))
table.cell(0,9).merge(table.cell(0,10))

table.cell(0, 0).paragraphs[0].add_run("Name").bold = True
table.cell(0, 5).paragraphs[0].add_run("Offset").bold = True

table.cell(0, 1).paragraphs[0].add_run("5566")
table.cell(0, 6).paragraphs[0].add_run("never die")
table.cell(0, 9).paragraphs[0].add_run("1")
for i in range(11):
    table.cell(0, i).paragraphs[0].alignment  = WD_ALIGN_VERTICAL.CENTER

    shading_elm = parse_xml(r'<w:shd {} w:fill="D9D9D9"/>'.format(nsdecls('w')))
    #shading must create every time
    table.cell(0, i)._tc.get_or_add_tcPr().append(shading_elm)



document.add_page_break()

document.save('demo2.docx')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接