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

.NET Core Web API异步读取XLSX流的适配库咨询

推荐适配.NET Core的异步流式读取XLSX文件的类库

问题背景

我基于.NET Core开发了一个Web API,通过流读取大型文件。此前仅支持CSV文件,一直使用CsvHelper(一款高性能且功能完善的库,在此强烈推荐)实现读取,现有代码如下:

using (var reader = new StreamReader(stream)) 
{ 
    using (var csvParser = new CsvParser(reader)) 
    { 
        IList<string> row = await csvParser.ReadAsync(); 
        // continue reading and working with the file 
    } 
}

如今需要新增对XLSX文件的支持,希望沿用异步读取的方式,避免将整个文件加载到内存中。我尝试了NPOI和EPPlus.Core,但未找到异步处理流的方法,这两个库似乎需要先将整个流加载到内存才能处理。请问有适配.NET Core的相关类库推荐吗?


推荐方案及实现示例

1. EPPlus 5+

其实EPPlus从版本5开始已经原生支持异步流式读取XLSX文件了,你之前用到的EPPlus.Core是旧分支,现在官方已经直接维护.NET Core版本,无需再依赖第三方分支。它允许直接从流创建ExcelPackage,并提供了异步行读取方法,完全不需要将整个文件加载到内存。

示例代码:

using (var package = new ExcelPackage(stream))
{
    var worksheet = package.Workbook.Worksheets.First();
    // 从第2行开始异步读取(假设第1行为表头)
    for (int row = 2; row <= worksheet.Dimension.End.Row; row++)
    {
        var cellRange = worksheet.Cells[row, 1, row, worksheet.Dimension.End.Column];
        var rowCells = await cellRange.LoadFromCellsAsync();
        
        // 处理当前行数据
        foreach (var cell in rowCells)
        {
            string cellValue = cell.Text;
            // 你的业务逻辑处理
        }
    }
}

注意:EPPlus 5+采用Polyform Noncommercial License,商业用途需要购买授权。

2. ClosedXML

ClosedXML是一款流行的开源Excel操作库,新版本中已经添加了异步流式读取支持,完美适配.NET Core,API设计直观,且不会加载整个文件到内存。

示例代码:

using (var workbook = new XLWorkbook(stream, XLEventTracking.Disabled))
{
    var worksheet = workbook.Worksheets.First();
    // 异步遍历所有有效行
    await foreach (var row in worksheet.RowsUsed().AsAsyncEnumerable())
    {
        var rowValues = row.Cells().Select(cell => cell.Value.ToString() ?? string.Empty).ToList();
        // 处理行数据逻辑
    }
}

ClosedXML采用MIT协议,商业场景也可免费使用。

3. ExcelDataReader

ExcelDataReader是一款轻量级的Excel读取专用库,支持XLS和XLSX格式,原生支持流式读取,异步方法完善,处理大型文件时内存占用极低,完全符合你的需求。

示例代码:

using (var reader = ExcelReaderFactory.CreateReader(stream))
{
    // 异步切换工作表
    while (await reader.ReadAsync())
    {
        // 异步读取每一行数据
        while (await reader.ReadRowAsync())
        {
            var rowValues = new List<string>();
            for (int i = 0; i < reader.FieldCount; i++)
            {
                rowValues.Add(reader.GetValue(i)?.ToString() ?? string.Empty);
            }
            // 处理当前行数据
        }
    }
}

ExcelDataReader采用MIT协议,免费开源,适配所有.NET Core版本。


总结

如果需要无商业限制的选择,ClosedXML或ExcelDataReader都是绝佳选项;如果已经熟悉EPPlus的API,升级到EPPlus 5+就能快速实现异步流式读取。这些库都能和你之前用CsvHelper的异步流式风格保持一致,避免将整个大文件加载到内存中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:07:38