使用openpyxl写入超6306456行数据至多工作表XLSX的脚本修复请求
修复OpenPyXL写入超1048576行时的"row is over 1048576"错误
你需要写入6306456行数据(1048576*6+15000)到单个Excel文件,要求每个工作表达到1048576行时自动新建工作表,最终生成7个工作表,但现有OpenPyXL脚本运行报错"row is over 1048576"。
原脚本问题分析
- OpenPyXL默认会创建一个名为
Sheet的空白工作表,原代码额外调用create_sheet('Sheet1'),导致最终文件多一个无用空白表 - 工作表切换逻辑有误,当行号刚好达到
1048576*n时,没有及时切换工作表,导致行号超出单表上限 - 工作表命名计算混乱,会出现编号错误的工作表
修复后的脚本
import openpyxl def write_large_excel(): # 创建工作簿,删除默认生成的空白工作表 workbook = openpyxl.Workbook() default_sheet = workbook['Sheet'] workbook.remove(default_sheet) # 单工作表最大行数 max_rows_per_sheet = 1048576 total_rows = 6306456 # 1048576*6+15000 # 初始化当前工作表和表内行号 current_sheet_num = 1 worksheet = workbook.create_sheet(f'Sheet{current_sheet_num}') current_row_in_sheet = 1 for row in range(1, total_rows + 1): # 写入当前行数据 worksheet.cell(row=current_row_in_sheet, column=1).value = row # 每10万行打印一次进度,减少控制台输出压力 if row % 100000 == 0: print(f'{row} of {total_rows} rows written') # 判断是否需要新建工作表 if current_row_in_sheet == max_rows_per_sheet and row < total_rows: current_sheet_num += 1 worksheet = workbook.create_sheet(f'Sheet{current_sheet_num}') current_row_in_sheet = 1 else: current_row_in_sheet += 1 # 保存文件 workbook.save('row_file.xlsx') if __name__ == '__main__': write_large_excel()
修改说明
- 移除OpenPyXL默认创建的空白工作表,避免生成多余文件
- 用
for循环遍历行号,逻辑更直观易维护 - 单独维护
current_row_in_sheet(当前工作表内的行号)和current_sheet_num(当前工作表编号),彻底避免行号计算混乱 - 调整进度打印频率,减少控制台输出负担
- 仅在当前工作表写满且还有剩余数据时才新建工作表,不会生成空表
内容的提问来源于stack exchange,提问作者Stanley1
相关产品推荐
相关产品推荐

