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

EPPlus v6.2.3如何处理超1048576行数据并自动新增工作表

EPPlus v6.2.3 大数据量自动拆分工作表实现

当交易报表数据量超过Excel单工作表最大行数(1048576行)时,直接用EPPlus加载整表会触发“索引越界”错误。以下是修改原代码实现自动分表的方案:

核心思路

  • 定义Excel单工作表最大行数常量(1048576)
  • 计算从起始单元格开始,每个工作表可容纳的最大数据行数
  • 根据总数据行数计算需要拆分的工作表数量
  • 循环为每个工作表截取对应的数据片段,加载并设置样式

修改后的完整代码

public static ExcelPackage ExportToExcel(ExcelPackage excelPackage, DataTable dataTable, ExcelCellAddress startCellAddress)
{
    // Excel单工作表最大行数
    const int maxRowPerSheet = 1048576;
    // 每个工作表可容纳的数据行数(从起始行到工作表最大行)
    int maxDataRowsPerSheet = maxRowPerSheet - startCellAddress.Row + 1;
    // 总数据行数
    int totalDataRows = dataTable.Rows.Count;
    // 计算需要的工作表数量,向上取整确保数据全容纳
    int sheetCount = (int)Math.Ceiling((double)totalDataRows / maxDataRowsPerSheet);

    for (int i = 0; i < sheetCount; i++)
    {
        // 获取或创建工作表:第一个复用已有表,后续新增命名表
        ExcelWorksheet ws;
        if (i == 0)
        {
            ws = excelPackage.Workbook.Worksheets[0];
        }
        else
        {
            ws = excelPackage.Workbook.Worksheets.Add($"报表_{i + 1}");
        }

        // 计算当前工作表要加载的数据起止索引(DataTable行索引)
        int startDataIndex = i * maxDataRowsPerSheet;
        int endDataIndex = Math.Min((i + 1) * maxDataRowsPerSheet - 1, totalDataRows - 1);
        // 截取对应数据生成子表
        DataTable subTable = dataTable.Clone();
        for (int j = startDataIndex; j <= endDataIndex; j++)
        {
            subTable.ImportRow(dataTable.Rows[j]);
        }

        // 加载子表到当前工作表
        ws.Cells[startCellAddress.Address].LoadFromDataTable(subTable, false);

        // 计算最终列字母
        string finalColLetter = string.Empty;
        string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int colCharsetLen = colCharset.Length;

        if (dataTable.Columns.Count > colCharsetLen)
        {
            finalColLetter = colCharset.Substring((dataTable.Columns.Count - 1) / colCharsetLen - 1, 1);
        }
        finalColLetter += colCharset.Substring((dataTable.Columns.Count - 1) % colCharsetLen, 1);

        // 计算当前工作表的单元格范围并设置样式
        int finalRow = startCellAddress.Row + subTable.Rows.Count - 1;
        string cellRange = $"{startCellAddress.Address}:{finalColLetter}{finalRow}";
        ExcelRange range = ws.Cells[cellRange];
        SetNormalCellStyle(range);
    }

    return excelPackage;
}

关键代码说明

  • 分表逻辑:用Math.Ceiling向上取整计算工作表数量,保证所有数据都能被分配到对应工作表
  • 子表截取:通过Clone创建结构一致的空表,再用ImportRow复制指定行,避免破坏原DataTable数据
  • 工作表管理:优先复用已有工作表,后续自动新增带序号的工作表,保持命名清晰
  • 范围计算:每个工作表单独计算数据加载后的单元格范围,确保样式设置覆盖所有数据行

内容的提问来源于stack exchange,提问作者Shazia Tabassum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:45:31