如何validation文件是否是一个有效的Excel电子表格?

我已经在这里做了一些search,在这个 , 这个 ,还有更多,但没有线索,所以我不得不问你们。

我试图通过Interop打开Excel文件,并且安装了Office 2007,所以我使用的是Microsoft.Office.Interop.Excel版本14.0

当我尝试打开一个有效的xls文件,一切运行良好。

但是,如果我尝试通过Interop打开无效文件(如位图或可执行文件),则Excel将打开它而不会发出抱怨或警告。

我如何检测Excel有一个无效的工作簿文件加载,没有阻止与警报?

我正在尝试编写Excel对象读取器的unit testing。 其中一种情况是尝试打开无效文件。

一些代码来帮助:应用程序创build:

  _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加载无效的文件

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

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

在这个枚举中,Excel有有效的文件(对我有用):

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

所以我结束了使用一个简单的“ or ”来过滤我想要导入的文件types:

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

现在它工作。 感谢你们的帮助,你们让我朝着正确的方向前进。

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

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