エクセルのバージョンはエクセルに聞けばよい

C#でエクセルのバージョンを調べる方法をこれまでまとめてきたが、エクセルのバージョンならエクセルに聞けばよいのでは思いついたので、この方法も記録する。


VSTOを使うとC#からエクセルを起動できる。

エクセルが起動できれば、ApplicationオブジェクトのVersionプロパティなどを使えばバージョン情報をゲットできるはず。

コードを書くと以下のような感じ。

まずusing。VSTOのエクセルオブジェクトを使えるように指定する。sysExcelという別名を定義している。

using sysExcel = Microsoft.Office.Interop.Excel;


メソッドは次の通り。エクセルを起動して、VersionとBuildとNameプロパティをゲットしている。

        /// <summary>
        /// エクセルの製品番号とサービスパック番号をエクセルから得る
        /// </summary>
        static public mmExcelVersion getVersionFromCOM()
        {
            sysExcel.Application xlsApp = new sysExcel.Application();
            var ver = xlsApp.Version;
            var b = xlsApp.Build;
            var name = xlsApp.Name;
            xlsApp.Quit();  // QuitしてもEXCELのプロセスは残る。実行ファイルを終了するとプロセスは消える。

            int m = 0;
            int.TryParse(ver.Split('.').FirstOrDefault(), out m);

            mmExcelVersion v = getVersion(m, b);
            v.ProductName = name;           // Microsoft Excel
            v.ProductVersion = ver;         // 16.0

            return v;
        }

ただ、レジストリから得られる値とはちょっと違う値が得られるので注意。たとえばVersionは「16.0」みたいな短い文字列が得られる。

あと、バージョン番号とビルド番号からバージョン情報を得るコードを抜き出してgetVersionメソッドにまとめた。

        static  mmExcelVersion getVersion(int m, int b)
        {
            mmExcelVersion v = new mmExcelVersion();

            switch (m)
            {
                case 12:
                    v.ExcelProductNumber = 2007;
                    if (b >= 6611) { v.ExcelServicePackNumber = 3; }
                    else if (b >= 6425) { v.ExcelServicePackNumber = 2; }
                    else if (b >= 6214) { v.ExcelServicePackNumber = 1; }
                    break;
                case 14:
                    v.ExcelProductNumber = 2010;
                    if (b >= 7015) { v.ExcelServicePackNumber = 2; }
                    else if (b >= 6029) { v.ExcelServicePackNumber = 1; }
                    break;
                case 15:
                    v.ExcelProductNumber = 2013;
                    if (b >= 4569) { v.ExcelServicePackNumber = 1; }
                    break;
                case 16:
                    v.ExcelProductNumber = 2016;
                    break;
            }

            return v;
        }

バージョン情報のオブジェクトを返す形にしたが、これがよいのか少し悩んでいる。まあ、このクラスでしか使わないのでよいか。



エクセルを起動して調べる方法は簡単でよいのだけど、ひどく遅いという問題がある。3秒くらいかかるので、少し待たされる。普通に使うには、前の記事で作ったレジストリから読み込む手順のメソッドの方がよさそう、、、せっかく作ったのに。



コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。