如何解决多个Pandas DataFrame导出Excel仅首列标题着色问题
问题原因分析
你的代码存在两个核心问题:
- 表头行号固定为0:第二个及后续DataFrame的表头并非从第0行开始,而是从当前的
row位置开始,但你始终向第0行写入格式,导致后续表头样式未生效。 - 重复创建格式对象:每次循环都重新创建
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
相关产品推荐
相关产品推荐

