唯一靠谱方式是用pd.excelwriter统一管理多sheet写入,避免重复创建实例导致覆盖或permissionerror;必须用with语句确保资源释放,sheet名需合法唯一,推荐openpyxl引擎以支持读写与样式控制。

用 pd.ExcelWriter 是唯一靠谱的批量导出方式
直接对每个 DataFrame 调用 to_excel() 会覆盖文件,或抛出 PermissionError(Windows 下尤其常见)。必须用 pd.ExcelWriter 管理同一个 Excel 文件的多个 sheet。它底层封装了 openpyxl 或 xlsxwriter,支持写入多页、格式控制和追加模式。
注意:不要在循环里反复新建 ExcelWriter 实例;必须一次性打开、写入所有 sheet、最后统一 close()。
ExcelWriter 的引擎选 openpyxl 还是 xlsxwriter?
默认引擎是 xlsxwriter,但它不支持读/改已有 Excel 文件(比如不能“追加 sheet 到已存在文件”),且无法处理带样式的单元格合并等高级操作;openpyxl 支持读写、样式、公式、合并单元格,更适合需要后续编辑或复杂格式的场景。
显式指定更稳妥:
with pd.ExcelWriter("output.xlsx", engine="openpyxl") as writer:
df1.to_excel(writer, sheet_name="数据1", index=False)
df2.to_excel(writer, sheet_name="数据2", index=False)
如果没装 openpyxl,会报 ModuleNotFoundError: No module named 'openpyxl',此时要先 pip install openpyxl。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
sheet_name 重复、过长、含非法字符怎么办
Excel 的 sheet 名有硬限制:最多 31 字符、不能含 / ? * [ ]、不能全空格、不能重名。Pandas 不会自动修正,直接报错 XlsxWriterException: Invalid Excel worksheet name 或静默截断(openpyxl 会报错)。
- 用正则清理:
re.sub(r'[\/?*[]]', '_', name) - 截断+去尾空格:
name[:31].strip() - 检测重名:维护一个
set记录已用名,冲突时加后缀如"data_1"
别依赖用户输入的原始字段名直接当 sheet_name,尤其从数据库表名、文件名生成时。
导出大量 DataFrame 时内存和性能怎么控
ExcelWriter 会把整个工作簿缓存在内存中,写完才刷盘。如果 DataFrame 总行数超百万、列数多、含长文本,容易 OOM 或卡死。
- 优先用
index=False,避免多一列无意义索引 - 导出前用
df.select_dtypes(include=["number"])过滤掉非数值列(如日志文本),或用df.astype(str).applymap(lambda x: x[:1000])截断超长字符串 - 分批写入:把大
DataFrame拆成若干 chunk,用pd.concat(..., ignore_index=True)合并后再写,比逐 chunk 写入更快
真正的大数据量(千万级行)别硬塞 Excel —— 它不是数据库,导出后打不开或 Excel 自动删数据都是常见结果。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










