pd.excelwriter是写入多sheet excel的唯一可靠方式,必须用with上下文管理器,指定engine(openpyxl支持读写、xlsxwriter仅写),避免覆盖、损坏及命名冲突,sheet名需合法且不重复。

用 pd.ExcelWriter 是唯一可靠方式
直接调用 to_excel() 多次会覆盖文件,必须用 pd.ExcelWriter 上下文管理器。它底层封装了 openpyxl 或 xlsxwriter,负责维护工作簿状态和 Sheet 间隔离。
常见错误是忘记 with 语句或提前 close,导致部分 Sheet 写入失败或文件损坏。写入顺序不影响 Sheet 位置,但 Sheet 名重复会报 ValueError: Sheet 'xxx' already exists。
- 必须指定引擎:默认
openpyxl支持读写,xlsxwriter只支持写且不兼容已存在的 Excel 文件 - Sheet 名不能含
:、\、/、?、*、[、],长度上限 31 字符 - 如果要追加 Sheet 到已有文件,只能用
openpyxl引擎,并设置if_sheet_exists='new'(pandas ≥ 1.4.0)
写入多个 Sheet 的最小可行代码
核心就是把每个 DataFrame 传给 to_excel() 的 sheet_name 参数,并复用同一个 ExcelWriter 实例。
import pandas as pd
<p>df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'X': [5, 6], 'Y': [7, 8]})</p><p>with pd.ExcelWriter('output.xlsx', engine='openpyxl') as writer:
df1.to_excel(writer, sheet_name='Data1', index=False)
df2.to_excel(writer, sheet_name='Data2', index=False)</p><h1>文件自动保存并关闭</h1>
注意:index=False 避免写入行号;若不加,第一列会是索引列,容易被误认为业务字段。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
写入时控制格式或样式?别指望 to_excel()
to_excel() 本身不支持单元格颜色、字体、冻结窗格等。真要加样式,得用引擎原生 API:
- 用
openpyxl:获取writer.book和writer.sheets['SheetName'],再调用 openpyxl 方法 - 用
xlsxwriter:通过writer.book.add_format()定义格式,再在to_excel()中传header_format等参数(仅限表头) - 复杂样式(如条件格式、图表)建议导出后用 openpyxl 单独处理,而非硬塞进写入流程
大文件写入慢?检查引擎和索引
写入 10 万行以上数据时,xlsxwriter 通常比 openpyxl 快 2–3 倍,但无法读取/修改已有文件;openpyxl 内存占用更高,尤其开启 write_only=True(需手动构造行)可缓解。
真正拖慢的往往是隐式操作:
- DataFrame 有重复列名 → 写入时自动改名(如
A.1),触发额外校验 - 列中混有 list/dict 类型 → 被转成字符串,序列化开销大
- 未设
index=False且索引是 datetime → 格式化耗时显著上升
写入前用 df.dtypes 和 df.applymap(type)(小数据)或 df.iloc[:5].applymap(type)(大数据)快速排查异常类型。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










