我如何检查C#中的Excel文件的版本?

我需要区分使用Excel 2010或Excel 2013版本创build的选定文件,所选Excel文件和服务器上的Excel应用程序必须匹配才能继续。

我可以得到服务器的Excel应用程序版本:

xApp = new Microsoft.Office.Interop.Excel.Application(); // getting version of Server's Excel Application string versionName = xApp.Version; int length = versionName.IndexOf('.'); versionName = versionName.Substring(0, length); object missing = Type.Missing; object trueObject = true; xApp.Visible = false; xApp.DisplayAlerts = false; xWorkBook = xApp.Workbooks.Open(ExcelFilePath, missing, trueObject, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing); 

但是,我怎样才能得到打开的Excel文件的Excel版本? 在当前情况下, versionName返回14.0 ,这是用于Office 2010。

对于.xls文件,您需要解码“BIFF”值,从MSDN:如何确定Microsoft Excel工作簿的版本 :

Microsoft Excel使用结构化存储保存数据。 特别是,它创build一个名为“Workbook”(以前只是“Book”)的数据stream,它保存以BOF(文件开始)logging开始的内容。

在那篇文章中还有一些代码,但是我不确定我能在不违反版权的情况下取得多less代码。

根据该文章底部的表格,该格式将用于Excel 2002。

至于.xlsx文件,你可以使用任何压缩文件库来打开它,然后打开docProps\app.xml文件,在里面你会发现这个:

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Properties xmlns=...> .... <AppVersion>15.0300</AppVersion> </Properties> 

这将告诉你保存该特定文件的Excel版本。

另外请注意,Excel将根据文件的内容决定是使用新的存储加载还是旧的存储加载,而不仅仅是在扩展上,因此可以存储扩展名为.xlsx的旧式文件和新式带有.xls扩展名的文件和Excel将仍然打开它,所以你应该。 Excel会给出警告,但是如何处理这个差异取决于你。

OLE File Property Reader发现了一个简单的解决scheme

 var doc = new OleDocumentPropertiesClass(); doc.Open(ExcelFilePath, false, dsoFileOpenOptions.dsoOptionDefault); string DocFileVersion = doc.SummaryProperties.Version.ToString(); 

这将返回版本的Excel文件的应用程序版本…

代码没有错,你可以通过切换大小写来检测它是什么版本的文件。

 Excel 95 (v7.0) Excel 97 (v8.0) Excel 2000 (v9.0) Excel 2002 (v10.0) Excel 2003 (v11.0) Excel 2007 (v12.0) Excel 2010 (v14.0) Excel 2013 (v15.0)