检查 .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 不适用于其他平台。