在.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
相关产品推荐
相关产品推荐

