
本文详解如何正确使用 pandas 的 `excelwriter` 将多个 dataframe 写入单个 `.xlsx` 文件的多个独立工作表,避免覆盖问题,并提供稳定、可复用的代码实现。
在使用 pandas 导出多个 DataFrame 到 Excel 时,一个常见误区是:在循环中反复创建新的 ExcelWriter 实例并调用 writer.close()(或使用 with 语句),这会导致每次写入都覆盖整个文件,最终仅保留最后一次写入的 Sheet —— 这正是提问者遇到“只生成一个工作表”的根本原因。
关键在于:所有 Sheet 必须在同一个 ExcelWriter 上下文中完成写入,而非每次循环新建一个 writer。而 xlsxwriter 引擎不支持追加模式(mode='a'),因此需改用 openpyxl 引擎,它支持以“追加”方式打开已有文件并添加/替换工作表。
✅ 正确做法如下(推荐简洁健壮版本):
import pandas as pd
import os
# 确保 openpyxl 已安装:pip install openpyxl
with pd.ExcelWriter(save_file.get(), engine="openpyxl", mode="w") as writer:
for i in range(len(dfs)):
dfs[i].to_excel(writer, sheet_name=sn[i], index=False)该方案一次性初始化 writer(mode="w" 表示写入/覆盖),然后在同一上下文内循环写入多个 Sheet,自动分配为独立标签页,无需手动判断文件是否存在,也无需重复打开/关闭文件,性能更优、逻辑更清晰。
一个功能强大、性能卓越的企业建站系统。使用静态网页技术大大减轻了服务器负担、加快网页的显示速度、提高搜索引擎推广效果。本系统的特点自定义模块多样化、速度快、占用服务器资源小、扩展性强,能方便快捷地建立您的企业展示平台。简便高效的管理操作从用户使用的角度考虑,对功能的操作方便性进行了设计改造。使用户管理的工作量减小。网站互动数据可导出Word文档,邮件同步发送功能可将互动信息推送到指定邮箱,加快企业
⚠️ 注意事项:
- engine="openpyxl" 是必须的;xlsxwriter 不支持 mode="a" 或多 Sheet 追加写入;
- sheet_name 长度不能超过 31 字符,且不可包含 : \ / ? * [ ] 等非法字符,建议预处理(如 sn[i][:31].strip());
- 若需兼容已存在文件并动态追加(如分批处理),可改用 mode="a" + if_sheet_exists="replace",但首次写入仍需 mode="w" 创建文件;
- index=False 推荐显式指定,避免冗余索引列;
- save_file.get() 应返回合法路径(含 .xlsx 后缀),否则可能引发引擎异常。
? 扩展建议:
对于更复杂的场景(如自定义格式、冻结窗格、条件格式),可在 openpyxl writer 关闭后,用 openpyxl.load_workbook() 加载文件进行二次编辑;若需高性能大批量导出,也可考虑 xlsxwriter 配合一次性构建字典 {sheet_name: df} 后统一写入(需先收集全部数据)。
总之,核心原则是:一个文件 ↔ 一个 ExcelWriter 实例 ↔ 多次 .to_excel() 调用。遵循此模式,即可稳定、高效地生成多工作表 Excel 报表。









