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

How can I check the version of Excel files in C#?

我需要区分所选文件是使用所选 Excel 文件的 Excel 2010 或 Excel 2013 版本创建的,并且服务器上的 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 returns 14.0,适用于 Office 2010。

代码没有问题,你可以用switch case来检测它是什么版本的文件。

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)

对于 .xls 文件,您需要解码 "BIFF" 值,来自 MSDN: How To Determine the Version of a Microsoft Excel Workbook:

Microsoft Excel saves data using structured storage. In particular, it creates a data stream called "Workbook" (previously just "Book") where it saves the contents starting with a BOF (beginning of file) record.

那篇文章中还有一些代码,但我不确定在不侵犯版权的情况下我可以从中提取多少代码。

根据该文章底部的 table,该格式一直使用到 Excel 2002 年。

至于.xlsx文件,你可以使用任何zip文件库打开它,然后打开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 文件 属性 Reader

找到了一个简单的解决方案
var doc = new OleDocumentPropertiesClass();
doc.Open(ExcelFilePath, false, dsoFileOpenOptions.dsoOptionDefault);
string DocFileVersion = doc.SummaryProperties.Version.ToString();

这将 return 版本的 excel 文件的应用程序版本...