如何将多个DataFrame写入Excel文件的不同工作表中

12次阅读

如何将多个DataFrame写入Excel文件的不同工作表中

本文详解如何使用pandasexcelwriter(配合openpyxl引擎)将多个dataframe分别写入同一excel文件的多个独立工作表,避免数据覆盖,并提供完整可运行代码与关键注意事项。

在实际数据分析与报表生成场景中,常需将来自不同模块或程序的多个DataFrame汇总到一个Excel工作簿中,每个DataFrame对应一个独立工作表(如“Sheet1”、“Sheet2”等)。但若直接多次调用pd.ExcelWriter且未正确配置模式与引擎,极易导致前序写入被覆盖——这正是原始问题的核心痛点。

根本原因在于:默认的xlsxwriter引擎不支持追加(append)模式,而mode=’a’仅对openpyxl有效。因此,第一步必须明确指定引擎并确保依赖已安装:

pip install openpyxl

✅ 正确做法是:统一使用openpyxl作为引擎,以追加模式(mode=’a’)打开文件,并为每个程序分配唯一的工作表名。例如,4个程序分别写入 ‘ProgramA’、’ProgramB’、’ProgramC’、’Programd’ 四个sheet:

import pandas as pd  # 假设 df_list 是当前程序生成的多个DataFrame列表 df_list = [df_a, df_b, df_c]  # 示例:3个DataFrame sheet_name = "ProgramA"  # 每个程序使用固定且互不冲突的sheet名 output_path = r"Y:HedgeFundReconJAronOutputJAronOutput.xlsx"  with pd.ExcelWriter(     output_path,     engine='openpyxl',     mode='a',                    # 关键:追加模式,不覆盖整个文件     if_sheet_exists='replace',   # 若同名sheet已存在,则替换(安全兜底)     datetime_format='mm/dd/yy' ) as writer:     row_pos = 1     for df in df_list:         df.to_excel(writer, sheet_name=sheet_name, startrow=row_pos, index=False)         row_pos += len(df) + 2  # 留2行空隙,便于阅读

? 关键要点说明

  • mode=’a’:仅openpyxl支持,表示“打开现有文件并追加内容”,不会清空其他sheet;
  • if_sheet_exists=’replace’:当同名sheet已存在时自动替换(避免ValueError: Sheet ‘XXX’ already exists),也可设为’overlay’实现叠加写入(需手动控制startrow);
  • 工作表名必须唯一:4个程序务必使用不同sheet_name(如’JAron’、’Bloomberg’、’Refinitiv’、’internal’),否则后写入的会覆盖先写入的;
  • 避免并发写入:若多个程序同时运行并写入同一文件,可能引发IO异常或数据损坏。建议通过文件锁、时间戳命名或集中调度机制规避;
  • 路径中的反斜杠需用原始字符串r”…”或双反斜杠\转义,防止转义字符错误。

? 进阶提示:若需动态创建sheet名(如按日期或程序ID),可结合datetime.now().strftime(“%Y%m%d_%H%M”)生成唯一标识;若需校验sheet是否存在再决定操作逻辑,可通过writer.book.sheetnames获取当前所有sheet列表。

综上,只要统一使用openpyxl引擎 + mode=’a’ + 唯一sheet名,即可稳健、高效地实现多程序协同输出至单个Excel多工作表的目标。

text=ZqhQzanResources