ExcelDataReader读取HTML格式xls文件报Invalid file signature错误的解决
问题原因
ExcelDataReader是专门解析真实Excel格式文件(如二进制.xls或OpenXML格式.xlsx)的工具,它会通过校验文件开头的专属签名判断文件合法性。- 你的文件后缀是
.xls,但实际内容是HTML表格,没有Excel文件要求的签名(比如.xls的BOF标记),因此库无法识别,抛出Invalid file signature错误。 - 另外代码中的文件路径
"G:\tmp\abc.xls"存在转义问题:C#字符串里\是转义字符,该路径会解析错误,需改为@"G:\tmp\abc.xls"或"G:\\tmp\\abc.xls"。
解决方法
文件本质是HTML表格,不需要用ExcelDataReader处理,直接解析HTML即可,以下是两种可行方案:
方案一:直接解析HTML表格提取数据
推荐使用HtmlAgilityPack库(可通过NuGet安装):
using HtmlAgilityPack; using System.IO; using System.Linq; // 修正路径转义问题 var filePath = @"G:\tmp\abc.xls"; var htmlDoc = new HtmlDocument(); htmlDoc.Load(filePath); // 获取目标表格节点 var table = htmlDoc.DocumentNode.SelectSingleNode("//table"); if (table == null) return; // 提取表头 var headers = table.SelectNodes(".//th") .Select(th => th.InnerText.Trim()) .ToList(); // 提取数据行 var dataRows = table.SelectNodes(".//tr[td]") .Select(tr => tr.SelectNodes(".//td") .Select(td => td.InnerText.Trim()) .ToList()) .ToList(); // 后续可根据业务需求处理headers和dataRows数据
方案二:(可选)将HTML表格转为真实Excel文件后处理
如果必须用ExcelDataReader读取,可先将HTML表格转为合法Excel文件,再解析。以EPPlus库为例(NuGet安装):
using HtmlAgilityPack; using OfficeOpenXml; using System.IO; using System.Linq; var filePath = @"G:\tmp\abc.xls"; var htmlDoc = new HtmlDocument(); htmlDoc.Load(filePath); var table = htmlDoc.DocumentNode.SelectSingleNode("//table"); using (var ms = new MemoryStream()) { using (var package = new ExcelPackage(ms)) { var worksheet = package.Workbook.Worksheets.Add("ImportedData"); // 将HTML表格导入Excel工作表 worksheet.Cells["A1"].LoadFromHtml(table.OuterHtml); package.Save(); // 重置流位置,用ExcelDataReader读取 ms.Position = 0; var reader = ExcelReaderFactory.CreateReader(ms); // 后续处理Excel数据逻辑 } }
内容的提问来源于stack exchange,提问作者Oleg Sh
相关产品推荐
相关产品推荐

