C# 如何验证文件是否为有效的excel电子表格?

C# 如何验证文件是否为有效的excel电子表格?,c#,file,excel,interop,C#,File,Excel,Interop,我已经在这里做了一些搜索,等等,等等,但是没有线索,所以我不得不问你们 我试图通过Interop打开一个Excel文件,并且安装了Office 2007,因此我使用的是Microsoft.Office.Interop.Excelversion14.0 当我试图打开一个有效的xls文件时,一切正常 但是,如果我试图通过互操作打开一个无效文件(如位图或可执行文件),Excel会毫无怨言或警告地打开它 如何检测Excel加载了无效的工作簿文件,而不使用警报进行阻止 我正试图为我的Excel对象阅读器编

我已经在这里做了一些搜索,等等,等等,但是没有线索,所以我不得不问你们

我试图通过Interop打开一个Excel文件,并且安装了Office 2007,因此我使用的是
Microsoft.Office.Interop.Excel
version
14.0

当我试图打开一个有效的
xls
文件时,一切正常

但是,如果我试图通过互操作打开一个无效文件(如位图或可执行文件),Excel会毫无怨言或警告地打开它

如何检测Excel加载了无效的工作簿文件,而不使用警报进行阻止

我正试图为我的Excel对象阅读器编写一个单元测试。其中一种情况是尝试打开无效文件

一些代码有助于: 应用程序创建:

    _app = new Application()
        {
            Visible = false,
            DisplayAlerts = false,     // <-- I don't want to remove this.
            AskToUpdateLinks = false,
        };
编辑: 只需添加1更多信息:Excel加载无效文件。如果
DisplayAlerts
设置为true,则会抱怨(打开对话框)工作簿似乎已损坏,但如果
DisplayAlerts
设置为false,则会按如下方式加载文件:


您可以在加载文件前后检查工作簿计数。如果两个计数相同,则文件加载失败

int countBefore = _workbooks.get_Count();
_workbooks.Open(filename);
int countAfter = _workbooks.get_Count();
if (countBefore == countAfter) {
    // The file failed to load.
}

我刚刚结束使用另一种方法:Excel工作簿有一个名为
FileFormat
的属性。Excel打开无效文件时,会将文件格式设置为文本的枚举数值之一:

    XlFileFormat.xlTextMac
    XlFileFormat.xlTextMSDOS
    XlFileFormat.xlTextPrinter
    XlFileFormat.xlTextWindows
在此枚举中,Excel包含有效文件(对我而言有效):

因此,我最后使用了一个简单的“
”来过滤我想要导入的文件类型:

    bool validFile = ( f == XlFileFormat.xlExcel12   ) 
                  || ( f == XlFileFormat.xlExcel7    ) 
                  || ( f == XlFileFormat.xlExcel8    ) 
                  || ( f == XlFileFormat.xlExcel9795 );

现在它开始工作了。感谢你们的帮助,你们为我指明了正确的方向。

检查有效文件ext.csv或xls似乎是最简单的方法……加载无效文件时,您可能会看到_app.Ready属性是否变为false。只是想我还没有试过。@DJ KRAZE,在加载文件之前我已经检查了扩展名。但是如果有人更改了文件扩展名并尝试加载.exe,该怎么办?@Tod,刚刚选中:_app.Ready在加载无效文件前后保持
true
。很好!但是数一数总数1,因为它是内存!Excel加载无效文件。但它看起来不像电子表格,因为Excel奇怪地加载了文件的内容。请看编辑。
    XlFileFormat.xlExcel12
    XlFileFormat.xlExcel7
    XlFileFormat.xlExcel8
    XlFileFormat.xlExcel9795
    bool validFile = ( f == XlFileFormat.xlExcel12   ) 
                  || ( f == XlFileFormat.xlExcel7    ) 
                  || ( f == XlFileFormat.xlExcel8    ) 
                  || ( f == XlFileFormat.xlExcel9795 );