You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:25:51