ExcelWriter写多Sheet时第二个覆盖第一个,因未关闭实例或未调用.save();openpyxl设样式无反应,因需在to_excel后、close前操作具体单元格;合并单元格须最后做,否则清空样式;大文件应换xlsxwriter引擎或导出CSV。

用 pandas.ExcelWriter 写多 Sheet 时,为什么第二个 Sheet 总覆盖第一个?
因为没关掉 ExcelWriter 实例,或者重复用了同一个实例但没调用 .save() 就又写新 sheet。pandas 的 ExcelWriter 是流式写入,不显式关闭或保存,底层文件句柄可能被锁住,后续写入行为不可控。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 每个
ExcelWriter实例只用于一次完整写入流程(多个.to_excel(sheet_name=...)),最后必须调用.close()或.save() - 别在循环里反复新建
ExcelWriter写单个 sheet——这是最常见翻车点 - 推荐用
with语句自动管理资源:with pd.ExcelWriter("out.xlsx") as writer: df1.to_excel(writer, sheet_name="数据表1") df2.to_excel(writer, sheet_name="统计表2")
openpyxl 加字体、边框前,为什么 workbook 没反应?
因为 pandas 默认用 openpyxl 引擎写 Excel 时,只写数据,不加载样式对象;你拿到的 writer.book 是个“空壳”工作簿,单元格对象还没被实例化。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 必须在所有
to_excel调用完成、writer.close()之前操作样式 - 样式要作用到具体单元格(如
ws["A1"])或范围(如ws["A1:C10"]),不能只改ws对象本身 - 字体和边框是两个独立对象,得分别构造再赋值:
from openpyxl.styles import Font, Border, Side thin = Side(border_style="thin") ws["A1"].font = Font(name="微软雅黑", size=10) ws["A1"].border = Border(left=thin, right=thin, top=thin, bottom=thin)
合并单元格 + 自动列宽 + 居中对齐,为什么导出后格式错乱?
顺序错了。openpyxl 中,合并单元格(merge_cells)会清除被合并区域内的原有样式;如果先设字体/对齐,再合并,那些样式就丢了。另外,列宽必须在所有数据写入后设置,否则 pandas 可能重置。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 写完所有数据 → 合并单元格 → 设置对齐/字体/边框 → 最后调
column_dimensions设列宽 - 居中对齐不是靠
ws.alignment全局设,而是逐单元格或逐范围设:ws["A1"].alignment = Alignment(horizontal="center", vertical="center") - 自动列宽要自己算:遍历每列,取最长字符串长度+2,再用
ws.column_dimensions["A"].width = 15手动赋值
导出大文件时卡死或内存爆掉,是不是 openpyxl 不行?
不是不行,是用法太重。openpyxl 把整个工作簿加载进内存,写 10 万行 × 50 列的多 sheet 文件,很容易吃光几 GB 内存。pandas 默认用它,但没做任何优化。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 纯数据导出(不需要格式):换
xlsxwriter引擎,速度快、内存低,但不支持读/改已有文件 - 要格式又怕崩:分批写入 + 手动触发
gc.collect(),或改用pyxlsb(二进制格式,体积小、加载快) - 真正大批量场景(>50 万行):放弃 Excel,导出为
.csv或.parquet,再用 Excel 打开(兼容性够用)
ExcelWriter 的生命周期里,漏掉 .close()、顺序颠倒、或试图对未生成的单元格设样式——这三处最容易白忙活半天。



















