如何使用EPPlus流式写入大Excel文件并定期刷新输出?
处理百万行Excel数据的流式写入方案
ExcelPackage(即EPPlus库的核心类)没有原生的流式写入API,它的设计逻辑是在内存中构建完整的Excel文档对象模型,必须等待所有内容添加完成后才能一次性保存到磁盘,因此你代码中尝试的“分批刷入磁盘”操作无法实现。
方案1:使用支持流式写入的NPOI SXSSFWorkbook
NPOI库中的SXSSFWorkbook是专门为大数据量Excel生成设计的流式实现——它会将超出内存阈值的行自动写入临时文件,仅保留最近的指定行数在内存中,完美适配分批写入场景,内存占用极低。
示例代码:
using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using System.IO; // 初始化SXSSFWorkbook,设置内存中保留的行数(此处设为10000,超出部分自动刷入临时文件) using var workbook = new SXSSFWorkbook(10000); var sheet = workbook.CreateSheet("Widgets"); // 写入表头 var headerRow = sheet.CreateRow(0); headerRow.CreateCell(0).SetCellValue("ID"); headerRow.CreateCell(1).SetCellValue("Name"); // 根据你的数据结构补充其他表头列 int rowIndex = 1; foreach (var widgetChunk in widgets.Chunk(10_000)) { foreach (var widget in widgetChunk) { var row = sheet.CreateRow(rowIndex++); row.CreateCell(0).SetCellValue(widget.Id); row.CreateCell(1).SetCellValue(widget.Name); // 填充其他单元格数据 } // SXSSF会自动处理内存溢出的行写入,无需手动调用刷新 } // 最终将完整文档写入磁盘 using var fs = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write); workbook.Write(fs); // 清理SXSSF生成的临时文件 ((SXSSFWorkbook)workbook).Dispose();
方案2:EPPlus分工作表折中方案
如果必须使用EPPlus,可以通过拆分多个工作表的方式控制单个工作表的内存占用,每个工作表写入固定行数(比如10万行),避免单个工作表数据量过大导致内存飙升。
示例代码:
using (var excelStream = File.Open(outputFilePath, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) using (var excelPackage = new ExcelPackage(excelStream)) { int sheetCounter = 1; int currentRow = 1; // 创建第一个工作表并写入表头 ExcelWorksheet sheet = excelPackage.Workbook.Worksheets.Add($"Widgets_{sheetCounter}"); sheet.Cells[1, 1].Value = "ID"; sheet.Cells[1, 2].Value = "Name"; foreach (var widgetChunk in widgets.Chunk(10_000)) { foreach (var widget in widgetChunk) { sheet.Cells[currentRow + 1, 1].Value = widget.Id; sheet.Cells[currentRow + 1, 2].Value = widget.Name; currentRow++; // 当当前工作表行数接近上限时,新建工作表 if (currentRow >= 100000) { sheetCounter++; sheet = excelPackage.Workbook.Worksheets.Add($"Widgets_{sheetCounter}"); // 重置表头 sheet.Cells[1, 1].Value = "ID"; sheet.Cells[1, 2].Value = "Name"; currentRow = 1; } } } excelPackage.Save(); }
方案对比
- NPOI SXSSF:内存占用极低,真正实现流式写入,适合百万级甚至更大数据量,是最优解。
- EPPlus分表:内存占用仍高于流式方案,但无需切换技术栈,适合对EPPlus有依赖的场景。
内容的提问来源于stack exchange,提问作者Jon Sagara
相关产品推荐
相关产品推荐

