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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:55:25