エクセルの実行ファイルのパスをゲットする

エクセルの実行ファイルのパスをゲットする手順。マイクロソフトのサポート情報に手順が載っているので、それを参考にする。

レジストリの他の場所にもパスはあるのだけど、サポート情報に載っているのが安心なので、そのまま実装してみる。

サポート情報はこちらのページ:
Office アプリケーションのパスを調べる方法

このページではクラスIDからパスを得るという手順が説明してあって、C#のアプリからエクセルを起動したときに動くエクセルのパスが得られるということで、大変好都合。

まずusingから。レジストリを参照するので、以下のusingを書く。

  1. using Microsoft.Win32;

メソッドの本体はこちら。

  1.         /// <summary>
  2.         /// エクセルの実行ファイルのパスを得る
  3.         ///
  4.         /// 参考:https://support.microsoft.com/ja-jp/help/240794/how-to-determine-the-path-for-an-office-application
  5.         /// </summary>
  6.         /// <returns></returns>
  7.         static string getExcelAppFilePath()
  8.         {
  9.             string clsid = "";
  10.             string path = "";
  11.  
  12.             RegistryKey key = Registry.LocalMachine.OpenSubKey(@"Software\Classes\Excel.Application\CLSID");
  13.             if (key != null)
  14.             {
  15.                 clsid = key.GetValue("").ToString();
  16.                 key.Close();
  17.             }
  18.  
  19.             if (clsid != "")
  20.             {
  21.                 string p = string.Format(@"Software\Classes\CLSID\{0}\LocalServer32", clsid);
  22.                 key = Registry.LocalMachine.OpenSubKey(p);
  23.                 if (key != null)
  24.                 {
  25.                     path = key.GetValue("").ToString();
  26.                     path = path.Replace(" /automation", "");    // オプションが付いていたら削除する
  27.                     key.Close();
  28.                 }
  29.             }
  30.  
  31.             if (path == "")
  32.             {
  33.                 throw new ApplicationException("エクセルの実行ファイルのパスが見つかりませんでした。");
  34.             }
  35.  
  36.             return path;
  37.         }
  38.  

上のメソッドでは、パスを得たら、「/automation」というオプションが付いていたので削除している。以下のようなパスが得られる。

C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE

#うーむ、ソースコードを貼り付けたときに行の最初にある空白が無駄だなあ。いちいち手で消すのも面倒だし、勝手に消えてくれないものかしら。

コメント

このブログの人気の投稿

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