C# 使用ExcelDataReader时奇怪的XLS文件失败

C# 使用ExcelDataReader时奇怪的XLS文件失败,c#,excel,xls,exceldatareader,C#,Excel,Xls,Exceldatareader,我正在使用第三方软件呈现的XLS电子表格。如果我在文本编辑器中打开该文件,很明显它是作为XLS文件保存的HTML。似乎MS过去允许这种模式,并且最近根据我发现的几篇文章停止在Excel中: 那么,现在来谈谈实际的技术问题。如果我使用CreateReader方法将文件作为流直接发送到ExcelDataReader,则会引发以下错误: 无效的文件签名 另一方面,如果我在Excel中打开它,然后执行另存为并将XLS另存为XLSX,然后将其发送到我的代码中;它进口很好 我倾向于不强制用户执行“另存为”步

我正在使用第三方软件呈现的XLS电子表格。如果我在文本编辑器中打开该文件,很明显它是作为XLS文件保存的HTML。似乎MS过去允许这种模式,并且最近根据我发现的几篇文章停止在Excel中:

那么,现在来谈谈实际的技术问题。如果我使用CreateReader方法将文件作为流直接发送到ExcelDataReader,则会引发以下错误:

无效的文件签名

另一方面,如果我在Excel中打开它,然后执行另存为并将XLS另存为XLSX,然后将其发送到我的代码中;它进口很好

我倾向于不强制用户执行“另存为”步骤。我们都知道,让第三方改变格式不是一个现实的选择

有什么建议或技巧可以让ExcelDataReader发挥作用吗

以下是我在记事本++中打开XLS时看到的屏幕截图请注意XLS扩展:

我倾向于不强制用户执行“另存为”步骤。我们都知道,让第三方改变格式不是一个现实的选择

因此,我建议您在使用ExcelDataReader阅读之前,使用软件包将其保存为受支持的格式,如下所示:

var app = new Microsoft.Office.Interop.Excel.Application();
var workbook = app.Workbooks.Open(htmlFileName);

if (File.Exists(excelFileName))
{
    File.Delete(excelFileName);
}

workbook.SaveAs(
    excelFileName,
    Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault,
    Type.Missing, Type.Missing,  
    false, false,
    Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

workbook.Close();
app.Quit();
app = null;
workbook = null;

using (var stream = File.Open(excelFileName, FileMode.Open, FileAccess.Read))
{
    var reader = ExcelReaderFactory.CreateReader(stream);
    // ...
}

不知道任何关于您的第三方或访问您的XLS文件;我们帮不了你!请提供更多详细信息,如示例XLS文件-HTH;。我想添加一个示例文件,但由于其中的数据,我无法添加实际的文件。和我似乎无法以相同的格式重新保存它。Excel会在我尝试重新保存时随时更改格式。正如我所看到的,您的文件实际上是一个HTML文件,这与我们将其保存为HTML的原始Excel文件相同,我认为ExcelDataReader不支持;。
var app = new Microsoft.Office.Interop.Excel.Application();
var workbook = app.Workbooks.Open(htmlFileName);

if (File.Exists(excelFileName))
{
    File.Delete(excelFileName);
}

workbook.SaveAs(
    excelFileName,
    Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault,
    Type.Missing, Type.Missing,  
    false, false,
    Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

workbook.Close();
app.Quit();
app = null;
workbook = null;

using (var stream = File.Open(excelFileName, FileMode.Open, FileAccess.Read))
{
    var reader = ExcelReaderFactory.CreateReader(stream);
    // ...
}