如何验证文件是否是有效的Excel电子表格?

时间:2012-01-17 21:14:42

标签: c# file excel interop

我已经在SO上进行了一些搜索,thisthisthis等等,但没有任何线索,所以我不得不问你们。< / p>

我正在尝试通过Interop打开Excel文件,并且我安装了Office 2007,因此我使用的是Microsoft.Office.Interop.Excel版本14.0

当我尝试打开有效的xls文件时,一切运行正常。

但是如果我尝试通过Interop打开一个无效的文件(如位图或可执行文件),Excel会在没有抱怨或警告的情况下打开它。

如何检测Excel是否加载了无效的工作簿文件,而没有阻止警报?

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

一些代码可以提供帮助: 应用程序创建:

    _app = new Application()
        {
            Visible = false,
            DisplayAlerts = false,     // <-- I don't want to remove this.
            AskToUpdateLinks = false,
        };

工作簿开放:

   _workbooks.Open(filename);
   _workbook = _workbooks.get_Item(1); // 1-based.
   _worksheets = _workbook.Sheets;

编辑: 只是添加1个更多信息:Excel加载无效文件。如果DisplayAlerts设置为true,则会抱怨(打开一个对话框)通知工作簿似乎已损坏,但如果DisplayAlerts设置为false,则会加载文件,如下所示:

Excel Loads Invalid File

2 个答案:

答案 0 :(得分:8)

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

    XlFileFormat.xlTextMac
    XlFileFormat.xlTextMSDOS
    XlFileFormat.xlTextPrinter
    XlFileFormat.xlTextWindows

在此枚举中,Excel包含有效文件(对我有用):

    XlFileFormat.xlExcel12
    XlFileFormat.xlExcel7
    XlFileFormat.xlExcel8
    XlFileFormat.xlExcel9795

所以我最后使用一个简单的“or”来过滤我要导入的文件类型:

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

现在它有效。谢谢你的帮助,你让我朝着正确的方向前进。

答案 1 :(得分:2)

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

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