You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决多个Pandas DataFrame导出Excel仅首列标题着色问题

问题原因分析

你的代码存在两个核心问题:

  1. 表头行号固定为0:第二个及后续DataFrame的表头并非从第0行开始,而是从当前的row位置开始,但你始终向第0行写入格式,导致后续表头样式未生效。
  2. 重复创建格式对象:每次循环都重新创建header_format,属于冗余操作,影响代码效率。
修复后的代码
import pandas as pd
import numpy as np

# 示例数据框
df = pd.DataFrame(np.random.randn(15).reshape(5, 3))

# 为df添加背景渐变样式
styled_df = (df.style
             .background_gradient(subset=[0, 1],
                                  low=0, high=0.5,
                                  cmap="YlGnBu"))

df2 = pd.DataFrame({'feature 1' : ['cat 1', 'cat 2', 'cat 3', 'cat 4'], 
                    'feature 2' : [400, 300, 200, 100],
                    'feature 3' : [400, 300, 200, 100], 
                    'feature 4' : [400, 300, 200, 100]})

def multiple_dfs(df_list, sheets, file_name, spaces):
    writer = pd.ExcelWriter(file_name, engine='xlsxwriter')
    row = 0
    workbook = writer.book
    # 只创建一次表头格式,避免冗余
    header_format = workbook.add_format({
        'bold': True,
        'text_wrap': True,
        'fg_color': '#D7E4BC',
        'border': 1
    })
    worksheet = writer.sheets[sheets] if sheets in writer.sheets else workbook.add_worksheet(sheets)
    
    for dataframe in df_list:
        # 处理Styler对象,确保正确获取列名和写入
        if isinstance(dataframe, pd.io.formats.style.Styler):
            dataframe.to_excel(writer, sheet_name=sheets, startrow=row, startcol=0)
            df_columns = dataframe.data.columns
            data_len = len(dataframe.data.index)
        else:
            dataframe.to_excel(writer, sheet_name=sheets, startrow=row, startcol=0)
            df_columns = dataframe.columns
            data_len = len(dataframe.index)
        
        # 写入当前DataFrame的表头样式,行号为当前的row
        for col_num, value in enumerate(df_columns):
            # 列号+1是因为默认写入了索引列,表头从第1列开始
            worksheet.write(row, col_num + 1, value, header_format)
        
        # 更新下一个DataFrame的起始行
        row = row + data_len + spaces + 2
    
    writer.close()  # 用close替代save,更规范

dfs = [styled_df, df2]
multiple_dfs(dfs, 'Sheet1', 'output.xlsx', 1)
关键修改点说明
  • 动态表头行号:将worksheet.write(0, ...)改为worksheet.write(row, ...),确保每个DataFrame的表头样式写入到正确的行位置。
  • 统一格式创建:将header_format的创建移到循环外,只初始化一次。
  • 兼容Styler对象:增加对Styler类型的判断,正确获取原DataFrame的列名和行数,避免因对象类型差异导致的错误。
  • 规范文件关闭:使用writer.close()替代writer.save(),符合pandas的最新推荐写法。

内容的提问来源于stack exchange,提问作者be_real

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:04:57