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

在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:50:25