python - 将 xlsxwriter set_row 绑定到最后一列
问题描述
我set_row
用来将 bg 颜色格式应用于给定“if”条件的表格(在此处描述)。当表格有 15 列时,它为整行着色,所以我想出了一个条件格式的演练(对 SO 表示敬意):
(max_row, max_col) = df.shape
format1 = workbook.add_format({"bg_color": "#FFFFFF"})
format2 = workbook.add_format({"bg_color": "#E4DFEC"})
tmp_format = format1
tmp_val = 0
for i in range(0, max_row):
if df.loc[i]["chain_id"] != tmp_val:
tmp_format = format2 if tmp_format == format1 else format1
tmp_val = df.loc[i]["chain_id"]
worksheet.conditional_format(
i + 1,
0,
i + 1,
max_col - 1,
{
"type": "formula",
"criteria": '=$A1<>"mustbeabetterway"',
"format": tmp_format,
},
)
它不仅超级不雅,而且还创建了数千个导致 Excel 工作簿滞后的条件格式。
必须有更好的方法来为列索引之间的行着色。
解决方案
关于如何格式化文件有一些不同的方法,我一直在使用 for 循环(对于非常大的数据帧并不理想,但它仍然可以完成工作)。基本上我所做的是遍历行和列,直到我想要的点(通常是最后一行或最后一列)并使用工作表的 write 方法将格式应用于每个单元格(有关更多信息,请查看此处https: //xlsxwriter.readthedocs.io/worksheet.html#worksheet-write )。除非您想用特定颜色突出显示不同的值,否则您不需要条件格式。
import pandas as pd
df = pd.DataFrame({'Column A': [1,2,3,4],
'Column B': ['a','b','c','d'],
'Column C': ['A','B','C','D']})
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', index=False)
workbook = writer.book
worksheet = writer.sheets['Sheet1']
# Define your formats
format_red = workbook.add_format({'bg_color': '#FFC7CE'})
format_yellow = workbook.add_format({'bg_color': '#FFEB9C', 'italic': True})
format_green = workbook.add_format({'bg_color': '#C6EFCE', 'bold': True})
# Format the entire first column until the dataframe'w last cell
for row in range(0, df.shape[0]):
worksheet.write(row+1, 0, df.iloc[row,0], format_red)
# Format the entire row from 2nd column until the dataframe's last column
for col in range(1, df.shape[1]):
worksheet.write(2, col, df.iloc[1,col], format_green)
# Format the entire row from 1st column until the dataframe's last column
for col in range(0, df.shape[1]):
worksheet.write(4, col, df.iloc[3,col], format_yellow)
writer.save()
初始输出:
最终输出: