if ws.max_row + len(rows) > 1048576:
raise ValueError('sheet rows exceed 1048576')
订单导出跑到 40 分钟报 ValueError: row index out of range,文件停在 104 万行,业务说总数是 120 万,剩下的 16 万行没有导出来。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:xlsx 单张工作表最多 1048576 行,openpyxl 写到上限后再加一行就抛异常。导出前没有 count,也没有按上限拆表的逻辑。
「Excel 行数上限」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
处理上按这个顺序:导出前先 count 超过 100 万就拆多个 sheet 或直接给 CSV;分片写文件 每片单独命名 避免单文件过大;在接口上提前提示行数 让用户选时间范围。
确认没问题再收工,120 万行导出拆成两个 sheet,第一个 100 万行第二个 20 万行,两个文件都能正常打开且总条数对得上。
