.NET でインストールされている Excel の内部バージョンを確認する
動作確認環境
- Visual Studio
-
- Visual Studio 2022
- .NET
-
- .NET 6.0
- Windows
-
- Windows 11
- Excel
-
- Microsoft 365
動作必須環境
- Windows
-
- いずれかのバージョン
- Excel
-
- いずれかのバージョン
内部バージョンについて
今回プログラムで Excel の内部バージョンを調べることができるのですが、2023/05/07 時点で Excel 2016 以降は内部バージョンが 16.0 から変わっていません。 そのため Excel 2016, 2019, 2021, Microsoft 265 を内部バージョンで識別することは出来なくなっています。 ですが、内部バージョンが変わっていないのでメリットとしては新しいバージョンが出ない限りは Excel のライブラリは 2016 以降共通で使用することが出来ます。
動作プログラムについて
以下のコードでインストールされている 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);
}
}
}
プログラムを簡単に解説すると、Type.GetTypeFromProgID
メソッドを使用して Excel.Application
プログラム ID のタイプを取得し、
Activator.CreateInstance
メソッドで Excel.Application
のインスタンスを生成します。
直接 Excel.Application
のインスタンスを生成しないのは、直接参照することによって Excel ライブラリのバージョンに依存してしまうことを回避するためです。
この方法をとることにより、最新のバージョンを参照することができるようになります。
あとは生成された application
インスタンスから Version
プロパティを参照しバージョンを取得することができます。
取得されるバージョンは Excel が内部に持つバージョンです。例えば、Excel 2010 は 14.0、Excel 2013 は 15.0、Excel 2016 以降は 16.0 となります。
この処理は実際に Excel を起動しているのと変わらないので System.Runtime.InteropServices.Marshal.ReleaseComObject
メソッドを呼んで Excel.Application
を解放しないと Excel のプロセスが残るので注意して下さい。
ちなみにこのコードは .NET 6 で動作確認していますが、ほぼ同じ形で .NET Framework でも使用できると思います。
.NET で動作しますが Type.GetTypeFromProgID
メソッドや System.Runtime.InteropServices.Marshal.ReleaseComObject
メソッドは Windows 専用のコードなので他のプラットフォームでは動作しないことに注意してください。