在.NET Core API中用ExcelDataReader流读取xls文件报错求助
使用ExcelDataReader读取xls流时出现编码1252不可用异常的解决方法
问题场景
在.NET Core API中通过IFormFile接收文件并转为流,使用ExcelDataReader读取xls文件时,抛出异常:
No data is available for encoding 1252. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.
相关代码如下:
[HttpPost("import")] public async Task<IActionResult> Import(IFormFile formFile) { excelReader.IExcelDataReader reader; if (formFile == null || formFile.Length <= 0) { return Ok("formfile is empty"); } using (var stream = new MemoryStream()) { await formFile.CopyToAsync(stream); reader = ExcelReaderFactory.CreateReader(stream); } }
根本原因
.NET Core 默认未包含完整的Windows编码库(如编码1252),而旧版xls文件的读取依赖该编码,因此触发此异常。另外,代码中CopyToAsync执行后流的指针停在末尾,直接读取会导致无数据,这也是潜在问题。
解决方案
1. 安装编码支持包
通过NuGet安装System.Text.Encoding.CodePages包,该包提供了.NET Core缺失的编码实现。
2. 注册编码提供器
在应用启动时注册编码提供器(只需执行一次,推荐放在Program.cs中):
var builder = WebApplication.CreateBuilder(args); // 注册编码提供器 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // 其他服务配置... var app = builder.Build();
3. 修正流读取位置
在创建ExcelReader前,将MemoryStream的位置重置到开头,确保能读取到文件内容:
[HttpPost("import")] public async Task<IActionResult> Import(IFormFile formFile) { excelReader.IExcelDataReader reader; if (formFile == null || formFile.Length <= 0) { return Ok("formfile is empty"); } using (var stream = new MemoryStream()) { await formFile.CopyToAsync(stream); // 重置流位置到起始处 stream.Position = 0; reader = ExcelReaderFactory.CreateReader(stream); // 后续处理reader逻辑... } }
额外提示
- 编码提供器只需注册一次,放在应用启动逻辑中可以避免重复执行,提升性能。
- 如果使用的是.NET Core 3.1或更早版本,可在
Startup.cs的ConfigureServices方法中添加注册代码。
内容的提问来源于stack exchange,提问作者Niranjan godbole
相关产品推荐
相关产品推荐

