根据唯一行在xlxswriter中为行添加颜色 python

1 投票
1 回答
31 浏览
提问于 2025-04-12 22:06

我正在使用Python的xlxswriter库生成xlxs文件。我想根据唯一ID的组合生成带有颜色编码的行。下面是我想要的输出结果:

这里输入图片描述

当前逻辑:

fontcolor_indexlist = [data[0] for data in df_Index.select("index").filter(col("Invoice Calculation Date") == f'{InvoiceDate}').collect()]  #Getting index from pyspark dataframe

pandas_df = df_InvoiceDetails.drop("cellformat").toPandas()
 
writer = pd.ExcelWriter(f"/tmp/{DetailsFileName}", engine="xlsxwriter")

cell_format = workbook.add_format({'valign': 'vcenter', 'align': 'center','fg_color': '#D3D3D3'})

if row_num in fontcolor_indexlist:
   worksheet.write(row_num, col_num, value, cell_format)

我尝试了上面的代码,想用更少的代码实现xlxs文件的生成,效果类似于条件格式化。

1 个回答

3

假设你想要让每个 "id" 或块的颜色 交替,我会使用 groupbywrite_row 方法:

# for convenience, i'm using df instead of pandas_df

D_FMT = {"valign": "vcenter", "align": "center"}
C_FMT = {"fg_color": "#D3D3D3"}
H_FMT = {"bold": 1}

SR, SC = 0, 0 # start row/col

with pd.ExcelWriter(f"/tmp/{DetailsFileName}", engine="xlsxwriter") as wr:
    wb = wr.book; ws = wb.add_worksheet("Sheet1")
    
    ws.write_row(SR, SC, df.columns, wb.add_format(H_FMT))

    for n, (_, g)in enumerate(df.groupby("id", sort=False)):
        for idx, row in zip(g.index, g.to_numpy()):
            _fmt = D_FMT if not n%2 else {**D_FMT, **C_FMT}
            ws.write_row(idx+1, SC, row, wb.add_format(_fmt))

在这里输入图片描述

使用的输入:

df = pd.DataFrame(
    {
        "id": [2, 2, 1, 1, 1, 4, 5, 5, 6, 6, 7, 8],
        "No of times": [1, 2, 23, 12, 0, 5, 4, 1, 2, 2, 48, 10],
    }
)

撰写回答