Excel 2003 .xls格式硬性限制65536行,无法绕过;必须改用.xlsx格式配合openpyxl或xlsxwriter,单表支持1048576行,并注意API差异与内存优化。

Excel 2003格式(.xls)的65536行限制根本无法绕过
不是代码写得不对,而是.xls文件格式本身硬性限制最多65536行(2¹⁶)。用xlwt或老版本xlrd写入第65537行时,会直接抛出OverflowError: row index (65536) not an int in range(65536)。这个限制在文件层面就锁死了,任何Python库都无权突破。
改用.xlsx格式 + openpyxl或xlsxwriter
现代Excel默认保存为.xlsx(基于Open XML),单表支持1048576行。关键是要彻底弃用.xls相关库:
- 删掉
xlwt(只支持.xls)、xlrd(>=2.0不支持写.xlsx) - 改用
openpyxl(读写.xlsx,支持样式/公式)或xlsxwriter(仅写,速度快,不读取已有文件) - 文件扩展名必须是
.xlsx,不能仍用.xls
示例(openpyxl):
from openpyxl import Workbook<br>wb = Workbook()<br>ws = wb.active<br>for i in range(100000): # 轻松写10万行<br> ws.append([i, f"row_{i}"])<br>wb.save("output.xlsx")写入超10万行时性能和内存要注意
openpyxl默认把整张表加载进内存,100万行可能吃掉500MB+内存;xlsxwriter流式写入更省内存,但不支持读取或修改已有单元格。
立即学习“Python免费学习笔记(深入)”;
- 大批量写入优先选
xlsxwriter:用workbook.add_worksheet()+worksheet.write_row()逐行/逐块写 - 若必须用
openpyxl,开启write_only=True模式:Workbook(write_only=True),此时只能追加(append()),不能随机访问单元格 - 避免在循环里反复调用
ws.cell(row=i, column=j).value = ...,改用ws.append([val1, val2, ...])批量写入
已有代码迁移到xlsx时的常见坑
很多旧脚本用xlwt.Workbook()初始化,直接替换为openpyxl.Workbook()会报错——两者的API完全不同。
-
xlwt的add_sheet()→openpyxl的wb.create_sheet()或wb.active -
xlwt的sheet.write(0,0,"text")→openpyxl的ws.cell(row=1, column=1, value="text")或ws["A1"] = "text" -
xlwt设置字体/颜色需xlwt.Font()等对象 →openpyxl对应Font()、PatternFill(),且必须赋给cell.font等属性
行号列号也从0起始(xlwt)变成1起始(openpyxl),ws.cell(row=1, column=1)才是A1单元格。


















