我想使用 C#加载.xls
文件(类型:电子表格)。97-2003
我正在使用 Gembox 库。
当我使用下面的命令时,我遇到了“文件包含损坏的数据。 ”作为错误。
ExcelFile ef = ExcelFile.Load(filepath, XlsxLoadOptions.XlsxDefault);
当我删除 XlsxLoadOptions 参数时,我得到“读取错误:文件不是有效的 OLE2 复合文件。 ”
我是 C# 新手,无法调试问题的根本原因。请帮忙!
我想使用 C#加载.xls
文件(类型:电子表格)。97-2003
我正在使用 Gembox 库。
当我使用下面的命令时,我遇到了“文件包含损坏的数据。 ”作为错误。
ExcelFile ef = ExcelFile.Load(filepath, XlsxLoadOptions.XlsxDefault);
当我删除 XlsxLoadOptions 参数时,我得到“读取错误:文件不是有效的 OLE2 复合文件。 ”
我是 C# 新手,无法调试问题的根本原因。请帮忙!
更新 (2020-03-28)
在较新版本的 GemBox.Spreadsheet 中,ExcelFile.Load(String)
将检查文件的签名以防“.xls”文件。
换句话说,不再需要GetLoadOptions
从下面使用该方法。
此外,还有一种新的重载方法,ExcelFile.Load(Stream)
.
这将始终在提供的流中检查文件的签名。
原来的
这个问题在评论中得到了回答。不幸的是,它在那里不太明显,所以这里是答案以及一些关于它的额外细节。
GemBox.Spreadsheet 提供了很少的Load 重载方法。使用以下内容时:
ExcelFile ef = ExcelFile.Load("C://temp//book.xls");
这将导致以下结果:
ExcelFile ef = ExcelFile.Load("C://temp//book.xls", LoadOptions.XlsDefault);
这与以下内容相同:
ExcelFile ef = ExcelFile.Load("C://temp//book.xls", new XlsLoadOptions());
加载选项指定如何读取输入文件以及使用该ExcelFile.Load(String)
方法时,选项将基于文件的扩展名。
在这种情况下,该文件具有“.xls”扩展名,但是,它不是二进制 XLS 格式 (BIFF8),而是 HTML 格式。这是一个比较常用的技巧,您可以拥有 HTML、CSV 甚至是扩展名为“.xls”的 XLSX 文件,MS Excel 将能够打开它。它将检测正确文件的格式,并会提示用户类似以下消息:
“book.xls”的文件格式和扩展名不匹配。该文件可能已损坏或不安全。除非你相信它的来源,否则不要打开它。还是要打开它?
请注意,此技巧仅适用于“.xls”扩展名,不适用于例如“.xlsx”。不过,我们可以使用类似以下的方法来检测正确的文件格式:
private static LoadOptions GetLoadOptions(string path)
{
string extension = Path.GetExtension(path).ToUpperInvariant();
switch (extension)
{
case ".XLSX":
case ".XLSM":
case ".XLTX":
case ".XLTM":
return LoadOptions.XlsxDefault;
case ".XLS":
case ".XLT":
return GetLoadOptions(path, null);
case ".ODS":
case ".OTS":
return LoadOptions.OdsDefault;
case ".TAB":
case ".TSV":
return new CsvLoadOptions(CsvType.TabDelimited);
case ".CSV":
return LoadOptions.CsvDefault;
default:
return null;
}
}
private static LoadOptions GetLoadOptions(string xlsPath, LoadOptions defaultOptions)
{
byte[] signature = new byte[8];
using (var stream = File.OpenRead(xlsPath))
stream.Read(signature, 0, 8);
byte[] xlsSignature = new byte[] { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 };
if (signature.SequenceEqual(xlsSignature))
return LoadOptions.XlsDefault;
byte[] xlsxSignature = new byte[] { 0x50, 0x4B, 0x03, 0x04 };
if (signature.Take(4).SequenceEqual(xlsxSignature))
return LoadOptions.XlsxDefault;
string firstLine = File.ReadLines(xlsPath)
.First(line => !string.IsNullOrWhiteSpace(line)).TrimStart().ToUpperInvariant();
if (firstLine.StartsWith("<!DOCTYPE") ||
firstLine.StartsWith("<HTML") ||
firstLine.StartsWith("<BODY"))
return LoadOptions.HtmlDefault;
return defaultOptions;
}
这里还有一个关于如何使用它的小演示示例:
string filepath = "C://temp//book.xls";
LoadOptions options = GetLoadOptions(filepath);
if (options == null)
throw new FileFormatException();
ExcelFile ef = ExcelFile.Load(filepath, options);
// ...