.NET Core Web API异步读取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

