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
相关产品推荐
相关产品推荐

