pandas的to_excel卡在1048576行是因.xlsx单表行数上限为1048576,超限会报错或截断;稳妥解法是用np.array_split拆分dataframe后分sheet写入,或改用csv/parquet格式。

为什么Pandas的to_excel会卡在1048576行?
因为Excel的.xlsx格式单表行数上限就是1048576(2²⁰),Pandas调用openpyxl或xlsxwriter引擎时,写入超过该行数会直接抛出ValueError: Max rows exceeded或静默截断——不是Pandas的bug,是Excel文件规范本身决定的。
拆分DataFrame再分页写入多个Sheet
最稳妥的做法是手动切分数据,每Sheet控制在104万行以内,再用ExcelWriter逐个写入。注意不能简单用df.iloc[i:i+1000000]循环写,否则容易因索引重叠或内存暴涨出错:
- 用
np.array_split(df, ceil(len(df) / 1000000))比切片更安全,避免索引干扰 - 写入时指定
sheet_name=f'Sheet_{i+1}',避免默认名重复导致覆盖 - 务必关闭
ExcelWriter对象(用with语句或显式调用close()),否则文件可能损坏
import numpy as np
from pandas import ExcelWriter
chunks = np.array_split(df, np.ceil(len(df) / 1000000).astype(int))
with ExcelWriter('output.xlsx') as writer:
for i, chunk in enumerate(chunks):
chunk.to_excel(writer, sheet_name=f'Sheet_{i+1}', index=False)
换用csv或parquet替代Excel
如果下游系统支持,直接放弃.xlsx是最省事的解法。CSV无行数限制,df.to_csv()能轻松处理千万级数据;Parquet则更适合分析场景,体积小、读取快:
-
to_csv(..., chunksize=50000)可边生成边写磁盘,避免内存爆掉 -
to_parquet()要求安装pyarrow,但列式存储对数值/时间类型压缩率极高 - 注意CSV不保留格式、公式、多Sheet结构——别指望用Excel双击打开后还能自动套用条件格式
用xlsxwriter启用「优化模式」并禁用日期转换
虽然仍受104万行硬限制,但xlsxwriter引擎在接近上限时更稳定,且可通过参数减少开销:
- 初始化
ExcelWriter时传入engine='xlsxwriter'和options={'strings_to_numbers': False},避免字符串误转数字引发精度丢失 - 禁用日期自动识别:
options={'default_date_format': None},防止大量datetime列拖慢写入 - 不要用
df.style导出——样式会极大增加内存占用,且超出行数限制时优先报错
真正要突破行数限制,只能换格式或拆文件。Excel本身不是大数据载体,硬撑只会让IO变慢、文件易损、协作困难。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











