我正在使用带有docx的python 2.7,我想根据条件更改表格中单元格的背景和文本颜色。
我找不到任何关于单格格式化的有用资源
有什么建议吗?
编辑1
我的代码
style_footer = "DarkList"
style_red = "ColorfulList"
style_yellow = "LightShading"
style_green = "MediumShading2-Accent6"
style_transperent = "TableNormal"
for a,rec in enumerate(data):
#V headinh se piše prvo polje iz table heada
document.add_heading(rec['tableHead'][0][0], level=1)
image_path = imageFolder + "\\" + slike[a]
document.add_picture(image_path, height=Inches(3.5))
#y += 28
#worksheet.insert_image( y, 1,imageFolder + "/" + slike[a])
for i, head in enumerate(rec['tableHead']):
table = document.add_table(rows=1, cols = len(head))
hdr_cells = table.rows[0].cells
for a in range(0,len(head)):
hdr_cells[a].text = head[a]
for a,body in enumerate(rec['tableData']):
row_cells = table.add_row().cells
for a in range(0,len(body)):
if body[a]['style'] == 'footer':
stil = style_footer
elif body[a]['style'] == 'red':
stil = style_red
elif body[a]['style'] == 'yellow':
stil = style_yellow
elif body[a]['style'] == 'green':
stil = style_green
else:
stil = style_transperent
row_cells[a].add_paragraph(body[a]['value'], stil)
document.save(wordDoc)
所有细胞仍然相同。
答案 0 :(得分:7)
如果要为表格中的特定单元格填充颜色,可以使用下面的代码。 例如,假设您需要使用RGB颜色1F5C8B填充表格第一行中的第一个单元格:
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)
现在,如果您还要使用相同颜色填充第一行中的第二个单元格,则应创建一个新元素 否则,如果您使用与上面相同的元素,填充将继续,并将从第一个单元格中消失...
shading_elm_2 = parse_xml(r'<w:shd {} w:fill="1F5C8B"/>'.format(nsdecls('w')))
table.rows[0].cells[1]._tc.get_or_add_tcPr().append(shading_elm_2)
......等等其他细胞。
来源:https://groups.google.com/forum/#!topic/python-docx/-c3OrRHA3qo
答案 1 :(得分:4)
我们发现,如果你使用cell.add_paragraph(&#39; sometext&#39;,style_object),它将保留现有的空段落并添加一个带有样式的附加段落,这是不理想的。 / p>
你想要做的是:
# replace the entire content of cell with new text paragraph
cell.text = 'some text'
# assign new style to the first paragraph
cell.paragraphs[0].style = style_object
请注意,样式应用于段落而不是单元格,这对于背景颜色来说并不理想(因为如果你有一些填充,它就不会填充输入单元格。我没有&#t; t找到了解决方法(除非您希望每个单元格都有背景颜色,您可以将样式应用于table.style)。
另外,请确保定义了样式。你可以检查
styles = documents.styles
for s in styles:
print s.name
查看您拥有的所有样式。您可以定义新样式,也可以加载具有预定义样式的模板文档。
答案 2 :(得分:3)
看起来您不需要使用cell.text = "Something"
方法,而是需要使用具有已定义样式的cell.add_paragraph("SomeText", a_style)
- 可能是以下方法之一:
完整列表here。
如果使用“默认”模板文档 - 否则您必须创建自己的模板文档。
答案 3 :(得分:1)
使用Nikos Tavoularis的解决方案,我们必须为每个单元创建一个新元素。 我创建了一个实现此目的的功能。适用于Python版本3.5.6和python-docx版本0.8.10
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
def set_table_header_bg_color(table.rows[row_ix].cell):
"""
set background shading for Header Rows
"""
tblCell = cell._tc
tblCellProperties = tc.get_or_add_tcPr()
clShading = OxmlElement('w:shd')
clShading.set(qn('w:fill'), "00519E") #Hex of Dark Blue Shade {R:0x00, G:0x51, B:0x9E}
tblCellProperties.append(clShading)
return cell
"""
End of set_table_header_bg_color Function
"""
# main function
"""
..
..
..
1. Load Document
..
2. Access the required section
..
3. Load the required Table
..
4. Traverse to the cell by accessing the rows object
..
"""
for each_row in table.rows :
for each_cell in each_row.cells:
if each_cell.value satisfies a condition:
set_table_header_bg_color(each_cell)
"""
5. Continue execution
"""
答案 4 :(得分:0)
根据Nikos Tavoularis的回答,我只是更改了shading_elm_1声明,就好像您在循环中包含单元格颜色一样,例如,事情可能会变得混乱。
因此,我的建议是:
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
table.rows[0].cells[0]._tc.get_or_add_tcPr().append(parse_xml(r'<w:shd {} w:fill="1F5C8B"/>'.format(nsdecls('w'))))
答案 5 :(得分:0)
如果您要循环浏览单元格,请使用:
def color_row(row=0):
'make row of cells background colored, defaults to column header row'
row = t.rows[row]
for cell in row.cells:
shading_elm_2 = parse_xml(r'<w:shd {} w:fill="1F5C8B"/>'.format(nsdecls('w')))
cell._tc.get_or_add_tcPr().append(shading_elm_2)
运行该函数为第二行中的单元格着色
color_row(2)