将 xlsxwriter set_row 绑定到最后一列

Bound xlsxwriter set_row to last column

我使用 set_row 将 bg 颜色格式应用于给定“if”条件 (described here) 的 table。它为整行着色,而 table 有 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 循环(对于非常大的数据帧来说不是理想的,但它仍然可以完成工作)。基本上我所做的是遍历行和列直到我想要的点(通常是最后一行或最后一列)并使用工作表的写入方法将格式应用于每个单元格(有关更多信息,请看这里 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()

初始输出:

最终输出: