如何从头创建和使用新元素,以便在 Word 文档表中为单元格添加底纹



我在python中使用docx在Word文档中创建表格。该代码使用 Excel 电子表格作为输入,并根据信息量为 Word 文档创建表格。生成表后,我需要填写单元格的子集,但我想将其构建到代码本身中。

我发现我可以使用此代码来定位特定的单元格:python docx设置表单元格背景和文本颜色

from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
shading_elm_1 = parse_xml(r'<w:shd {} w:fill="1F5C8B"/>'.format(nsdecls('w')))
table.rows[0].cells[0]._tc.get_or_add_tcPr().append(shading_elm_1)

不幸的是,使用此方法需要一个新元素。单元格的数量和位置可以通过代码定义,但我不知道先验会有多少个单元格,也不知道它们的位置。因此,我的问题是双重的:

  1. 是否有一种方法可用于使用 for 循环或其他方法创建新元素?

  2. 有没有调用这些元素的方法?

因此,例如,如果我的 excel 输入指示我需要 100 个元素,我可以编写创建这些元素的东西,然后,我将如何使用可以调用这些元素的代码(...使用shading_elm_1然后使用shading_elm_2等等...

我认为关键是将设置单元格背景着色操作封装在一个函数中,然后为每个需要它的单元格调用该函数。你的问题中没有足够的信息让我确切地说出它会是什么样子,这就是我要求澄清的原因。但这样的事情可能会给出要点:

from docx.oxml import parse_xml
from docx.oxml.ns import nsdecls
def shade_cell(cell, fill):
"""Add a background `fill` to `cell`.
`fill` is a 6-character str hexadecimal representation of the desired
fill color, like "AF6342".
"""
shd = parse_xml(r'<w:shd {0} w:fill="{1}"/>'.format(nsdecls('w'), fill))
cell._tc.get_or_add_tcPr().append(shd)

然后在其他地方:

for i, row in enumerate(table.rows):
for j, cell in enumerate(row.cells):
if cell_needs_shading(i, j):
shade_cell(cell, "1F5C8B")

您需要根据决策标准自行提供cell_needs_shading(row, col)

请注意,通常,WordprocessingML(Word 的 XML 词汇表(中的 XML 元素具有规定的顺序。因此,您不能总是将一个(如<w:shd>(添加到另一个(在这种情况下w:tcPr(的末尾并让事情正常工作。如果它有效,很好,但是如果您遇到修复错误,请首先查看。

最新更新