檢查 .NET 中安裝的 Excel 的內部版本

更新頁 :
頁面創建日期 :

操作環境

Visual Studio的
  • Visual Studio 2022 中
。網
  • .NET 6.0
窗戶
  • 窗戶11
勝過
  • Microsoft 365

先決條件

窗戶
  • 其中一個版本
勝過
  • 其中一個版本

關於內部版本

這一次,您可以通過程式設計方式查看 Excel 的內部版本,但截至 2023 年 5 月 7 日,Excel 2016 及更高版本的內部版本與 16.0 相比沒有變化。 因此,無法再通過其內部版本識別 Excel 2016、2019、2021 和 Microsoft 265。 但是,由於內部版本沒有改變,優點是只要沒有新版本出來,從2016年開始就可以共同使用Excel庫。

關於操作程式

您可以使用以下代碼找出 Excel 的內部版本: 由於它是一種方法,因此可以將其按原樣引入您自己的程式。 GetInstallExcelVersion 如果調用該方法,版本將以數位形式返回。

/// <summary>
/// インストールされている Excel の内部バージョンを取得します。
/// </summary>
/// <returns>インストールされている Excel の内部バージョン。正常に取得できなかった場合は 0 を返します。</returns>
static decimal GetInstallExcelVersion()
{
  // Excel.Application の Type を取得
  var type = Type.GetTypeFromProgID("Excel.Application");
  if (type == null)
  {
    // Excel がインストールされていない
    return 0;
  }

  object? application = null;
  try
  {
    // Excel.Application のインスタンスを生成します
    application = Activator.CreateInstance(type);
    if (application == null)
    {
      // Excel.Application の生成に失敗
      return 0;
    }

    // バージョンを取得
    var ver = application.GetType().InvokeMember("Version", System.Reflection.BindingFlags.GetProperty, null, application, null);
    if (ver == null)
    {
      return 0;
    }

    // 文字列を数値に変換します
    decimal version;
    if (!decimal.TryParse(ver.ToString(), out version))
    {
      return 0;
    }
    return version;
  }
  finally
  {
    // 生成した Excel のリソースを解放します
    if (application != null)
    {
      System.Runtime.InteropServices.Marshal.ReleaseComObject(application);
    }
  }
}

程序的簡單說明是使用該方法Excel.Application獲取程式ID的Type.GetTypeFromProgID類型, Activator.CreateInstance該方法創建 Excel.Application 的實例。 Excel.Application不生成的直接實例的原因是通過直接引用 Excel 庫來避免依賴該庫的版本。 通過這樣做,您將能夠看到最新版本。

然後,您可以引用Version生成的application實例中的屬性並獲取版本。 檢索的版本是 Excel 內部的版本。 例如,Excel 2010 為 14.0,Excel 2013 為 15.0,Excel 2016 及更高版本為 16.0。

請注意,此過程與實際啟動 Excel 沒有什麼不同,因此如果不調用該方法並Excel.Application釋放,System.Runtime.InteropServices.Marshal.ReleaseComObject則 Excel 進程將保留。

順便說一句,這段代碼已經在 .NET 6 上進行了測試,但我認為它可以在 .NET Framework 中以大致相同的方式使用。 它適用於 .NET,但 Type.GetTypeFromProgID 請記住,這些方法和方法是僅限 Windows 的代碼, System.Runtime.InteropServices.Marshal.ReleaseComObject 不適用於其他平臺。