寻求ASP.NET Core 2中无需本地磁盘的Excel上传读取类库
刚好之前我把ASP.NET MVC里的Excel读取功能迁到ASP.NET Core 2的时候,也遇到了和你一样的问题——原来的Excel Data Reader方案行不通,而且绝对不能把文件存本地(毕竟Azure部署的应用这么搞太麻烦)。给你推荐几个亲测好用的类库,完全满足你的需求:
适配ASP.NET Core 2的无本地存储Excel读取类库
1. EPPlus
这是目前.NET生态里最流行的Excel操作库之一,支持直接读取上传的IFormFile流,全程不需要将文件写入本地磁盘。
- 注意:ASP.NET Core 2建议使用EPPlus 4.x版本(MIT许可,免费商用),更高版本的许可有所变更。
- 极简示例代码:
public async Task<IActionResult> UploadExcel(IFormFile file) { if (file == null || file.Length <= 0) return BadRequest("请选择有效的Excel文件"); using (var package = new ExcelPackage(file.OpenReadStream())) { var firstWorksheet = package.Workbook.Worksheets.First(); // 读取单元格示例:获取第一行第一列的文本 var cellValue = firstWorksheet.Cells[1, 1].Text; // 后续业务逻辑... } return Ok("读取完成"); }
2. NPOI
老牌的开源Excel操作库,对.xls(旧版)和.xlsx(新版)格式都有完美支持,同样可以直接操作上传流,无本地存储需求。
- 优势:完全开源免费,无任何许可限制,对老旧Excel文件的兼容性拉满。
- 示例代码:
public async Task<IActionResult> UploadExcel(IFormFile file) { if (file == null || file.Length <= 0) return BadRequest("请选择有效的Excel文件"); using (var stream = file.OpenReadStream()) { IWorkbook workbook; // 根据文件后缀判断使用对应的Workbook if (file.FileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) { workbook = new XSSFWorkbook(stream); } else if (file.FileName.EndsWith(".xls", StringComparison.OrdinalIgnoreCase)) { workbook = new HSSFWorkbook(stream); } else { return BadRequest("仅支持.xls和.xlsx格式的文件"); } var firstSheet = workbook.GetSheetAt(0); // 读取单元格示例:获取第一行第一列的值 var cellValue = firstSheet.GetRow(0)?.GetCell(0)?.StringCellValue; // 后续业务逻辑... } return Ok("读取完成"); }
3. ClosedXML
专注于.xlsx格式的轻量级操作库,API设计简洁直观,同样支持直接从上传流读取数据,不需要本地存储。
- 特点:API上手快,代码可读性高,适合只需要处理新版Excel文件的场景。
- 示例代码:
public async Task<IActionResult> UploadExcel(IFormFile file) { if (file == null || file.Length <= 0) return BadRequest("请选择有效的Excel文件"); using (var stream = file.OpenReadStream()) using (var workbook = new XLWorkbook(stream)) { var firstWorksheet = workbook.Worksheets.First(); // 读取单元格示例:获取第一行第一列的值 var cellValue = firstWorksheet.Cell(1, 1).Value.ToString(); // 后续业务逻辑... } return Ok("读取完成"); }
这些类库都通过IFormFile.OpenReadStream()直接获取上传文件的流进行读取,完全符合你Azure部署应用的需求——不需要依赖本地磁盘,既高效又避免了存储权限问题。
内容的提问来源于stack exchange,提问作者Riz
相关产品推荐
相关产品推荐

