ExcelDataReader读取XLS文件报Invalid File Signature错误求助
解决ExcelDataReader读取XLS时的Invalid file signature问题
可能的原因及修复方案
文件损坏或签名异常
即便之前能正常读取,文件也可能在传输、存储过程中损坏,或是被其他工具修改后签名发生变化。可以试试:- 用Excel重新打开该XLS文件,另存为新的XLS格式后再读取
- 用十六进制编辑器查看文件开头字节,正常XLS(BIFF格式)的起始签名应为
0x09 0x08 0x10 0x00 0x00 0x06 0x05 0x00,确认是否符合
版本兼容性问题
3.6.0版本对部分旧版XLS文件的支持可能存在缺陷,尝试降级到3.5.0版本,或升级至最新稳定版(注意同步更新ExcelDataReader.DataSet包)流读取位置异常
打开流后可能因操作导致位置偏移,需重置到起始位置再创建阅读器,修改代码如下:using (var stream = File.Open(path, FileMode.Open, FileAccess.Read)) { stream.Position = 0; // 新增该行重置流位置 using (var reader = ExcelReaderFactory.CreateReader(stream)) { // 后续逻辑不变 } }明确指定阅读器类型
放弃自动检测,针对XLS文件强制使用二进制阅读器,避免格式识别错误:using (var reader = ExcelReaderFactory.CreateBinaryReader(stream))注意:此操作需确保文件确实是BIFF格式的XLS,而非后缀名改为XLS的XLSX文件
文件权限或锁定问题
若异常出现在File.Open行,大概率是文件被其他进程锁定(比如Excel未关闭),或是程序无读取权限:- 确认文件未被办公软件或其他进程占用
- 检查程序是否拥有文件所在目录的读取权限
调整后的完整代码示例
private static List<string[]> GetExcelRecords(string path, bool hasHeaders) { var records = new List<string[]>(); using (var stream = File.Open(path, FileMode.Open, FileAccess.Read)) { stream.Position = 0; // 根据扩展名明确选择阅读器类型 var extension = Path.GetExtension(path).ToLowerInvariant(); using (var reader = extension == ".xls" ? ExcelReaderFactory.CreateBinaryReader(stream) : ExcelReaderFactory.CreateOpenXmlReader(stream)) { var sheetFile = reader.AsDataSet().Tables[0]; for (int i = 0; i < sheetFile.Rows.Count; i++) { var record = sheetFile.Rows[i]; if (hasHeaders) { hasHeaders = false; continue; } var row = record.ItemArray.Select(o => o.ToString()).ToArray(); records.Add(row); } } } return records; }
内容的提问来源于stack exchange,提问作者user16889986
相关产品推荐
相关产品推荐

