to_excel表头/数据错位或丢失,根本原因是默认不写入索引,且对多级列、空值、混合类型处理“太安静”;需显式设index=True、合理处理MultiIndex、注意NaN显示异常。

to_excel 写入 Excel 时为什么表头/数据错位或丢失?
根本原因是 to_excel 默认不写入索引,且对多级列、空值、混合类型处理“太安静”——不报错,但结果不符合预期。
- 如果 DataFrame 有自定义
index(比如字符串索引),又没显式设index=True,那索引列就彻底消失 - 含
NaN的列若 dtype 是object,Excel 里可能显示为空白或0(尤其用openpyxl引擎时) - 多级列(
MultiIndex)必须搭配index=False或手动调整startcol,否则会挤占第一列导致错位 - 示例:想保留行号和列名,就得写
df.to_excel("out.xlsx", index=True, header=True)
如何用 openpyxl 在 to_excel 后设置单元格格式?
to_excel 本身不支持格式控制,必须借助 openpyxl 的工作簿对象二次操作——不能边写边设,得“先写再改”。
- 必须指定引擎:
engine="openpyxl",否则ExcelWriter返回的是只读对象 - 用
with pd.ExcelWriter(..., engine="openpyxl") as writer:获取writer.book和writer.sheets["Sheet1"] - 格式设置要等
to_excel执行完再做,否则工作表还没生成,会报KeyError: 'Sheet1' - 常见操作:加粗表头
ws['A1'].font = Font(bold=True),设置列宽ws.column_dimensions['B'].width = 15
to_excel 导出大量数据慢、内存爆掉怎么办?
直接调 to_excel 对百万行以上数据是高危操作:它把全部数据加载进内存,再交给 openpyxl 或 xlsxwriter 渲染,中间无缓冲。
- 优先考虑分块导出:
chunksize=50000配合循环写入(注意startrow累加,避免覆盖) -
xlsxwriter引擎比openpyxl更省内存,适合纯写入场景(不读取已有文件) - 避免在导出前做
df.style.format(...).to_excel(...)——Styler会复制整个 DataFrame,内存翻倍 - 导出前删掉无用列:
df[["col_a", "col_b"]].to_excel(...),别留着几十个未用字段占内存
中文列名/内容乱码或显示为方框?
不是编码问题,是字体缺失。Excel 默认用 Calibri,Windows 上不认 SimSun,Mac 上不认 Microsoft YaHei,结果就是□□□。
立即学习“Python免费学习笔记(深入)”;
-
openpyxl可以设默认字体:from openpyxl.styles import Font; writer.book.font = Font(name="Microsoft YaHei") - 更稳妥的方式:用
xlsxwriter引擎,它支持全局字体配置:pd.ExcelWriter("out.xlsx", engine="xlsxwriter", options={"strings_to_numbers": True, "default_font": "SimSun"}) - 注意:字体名必须和系统实际安装名称一致,
SimSun≠宋体,Microsoft YaHei≠微软雅黑 - 如果用
openpyxl设置单个单元格字体,记得同时设alignment和border,否则部分格式可能被忽略
openpyxl 写,有人用 xlsxwriter 读,连自动换行开关都不同步。



















