使用 ExcelDataReader 时奇怪的 XLS 文件失败
Weird XLS file failing when using ExcelDataReader
我正在使用从第三方软件呈现的 XLS 电子表格。如果我在文本编辑器中打开该文件,很明显它已 HTML 保存为 XLS 文件。似乎 MS 曾经允许这种模式,并且最近根据我发现的几篇文章在 Excel 中停止了:
- Office Forum: XLS file will not open in Excel 2016, only gray view
- UserVoice: HTML formatted files (with an XLS extension) no longer opened – Welcome to Excel’s Suggestion Box!
所以,现在是实际的技术问题。如果我使用 CreateReader
方法将文件(作为流)直接发送到 ExcelDataReader,则会抛出此错误:
"Invalid file signature."
IExcelDataReader excelReader;
excelReader = ExcelReaderFactory.CreateReader(stream);
如果另一方面,我在 Excel 中打开它并执行 "Save As" 并将 XLS 保存为 XLSX,然后将其发送到我的代码中;它导入正常。
我的偏好是不要强迫我的用户执行 "Save As" 步骤。让第三方改变他们的格式是不现实的选择(众所周知)。
有什么建议或技巧可以使 ExcelDataReader 正常工作吗?
这是我在 Notepad++ 中打开 XLS 时看到的屏幕截图(注意 xls 扩展名):
My preference would be to not force my user to do the "Save As" step. And getting the third-party to change their format is not a realistic option (as we all know).
因此,我建议您使用 Microsoft.Office.Interop.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);
// ...
}
我正在使用从第三方软件呈现的 XLS 电子表格。如果我在文本编辑器中打开该文件,很明显它已 HTML 保存为 XLS 文件。似乎 MS 曾经允许这种模式,并且最近根据我发现的几篇文章在 Excel 中停止了:
- Office Forum: XLS file will not open in Excel 2016, only gray view
- UserVoice: HTML formatted files (with an XLS extension) no longer opened – Welcome to Excel’s Suggestion Box!
所以,现在是实际的技术问题。如果我使用 CreateReader
方法将文件(作为流)直接发送到 ExcelDataReader,则会抛出此错误:
"Invalid file signature."
IExcelDataReader excelReader;
excelReader = ExcelReaderFactory.CreateReader(stream);
如果另一方面,我在 Excel 中打开它并执行 "Save As" 并将 XLS 保存为 XLSX,然后将其发送到我的代码中;它导入正常。
我的偏好是不要强迫我的用户执行 "Save As" 步骤。让第三方改变他们的格式是不现实的选择(众所周知)。
有什么建议或技巧可以使 ExcelDataReader 正常工作吗?
这是我在 Notepad++ 中打开 XLS 时看到的屏幕截图(注意 xls 扩展名):
My preference would be to not force my user to do the "Save As" step. And getting the third-party to change their format is not a realistic option (as we all know).
因此,我建议您使用 Microsoft.Office.Interop.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);
// ...
}