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

在.NET中使用ClosedXML读取Excel遇FileFormatException错误求助

问题原因与解决方案

ClosedXML不支持旧版二进制格式的.xls文件(Excel 97-2003版本),它仅兼容Office Open XML标准的.xlsx/.xlsm/.xltx等格式。你的Excel2.xls属于真正的二进制xls文件,而Excel1.xls大概率是后缀被错误修改为.xls的xlsx文件——这就是为什么修改后缀后前者仍无法读取的核心原因。

验证文件真实格式

不要仅依赖文件后缀判断,可通过以下方式确认:

  • 用记事本打开文件:开头为PK则是xlsx格式(本质是压缩包);开头为D0 CF 11 E0则是二进制xls格式。
  • 代码判断文件头:
    using (var reader = new BinaryReader(file.OpenReadStream()))
    {
        var headerBytes = reader.ReadBytes(4);
        bool isXlsxFormat = headerBytes[0] == 0x50 && headerBytes[1] == 0x4B; // PK 标识
        bool isXlsBinaryFormat = headerBytes[0] == 0xD0 && headerBytes[1] == 0xCF 
                                 && headerBytes[2] == 0x11 && headerBytes[3] == 0xE0;
    }
    

针对性解决办法

1. 处理二进制.xls文件

替换为支持该格式的类库,推荐使用ExcelDataReader或NPOI。以下是ExcelDataReader的实现示例:
首先安装NuGet包:ExcelDataReader 和 ExcelDataReader.DataSet

private List<Dictionary<string, object>> ReadExcelData(IFormFile file)
{
    var dataList = new List<Dictionary<string, object>>();
    using (var stream = file.OpenReadStream())
    {
        // 注册编码提供器,解决旧xls文件的编码问题
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
        
        using (var excelReader = ExcelReaderFactory.CreateReader(stream))
        {
            var dataSet = excelReader.AsDataSet(new ExcelDataSetConfiguration()
            {
                ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
                {
                    UseHeaderRow = true // 以第一行作为列名
                }
            });

            var targetTable = dataSet.Tables[0];
            foreach (DataRow row in targetTable.Rows)
            {
                var rowDict = new Dictionary<string, object>();
                foreach (DataColumn column in targetTable.Columns)
                {
                    rowDict[column.ColumnName] = row[column];
                }
                dataList.Add(rowDict);
            }
        }
    }
    return dataList;
}

2. 处理后缀错误的xlsx文件

直接将文件后缀修正为.xlsx,即可继续使用ClosedXML读取;若无法修改后缀,也可尝试强制指定格式(不推荐,优先修正后缀)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:33:08