ようこそ。睡眠不足なプログラマのチラ裏です。

リフレクションを利用したレイトバインディングでExcelファイルを開く

VB.NETだとCreatObject関数を使って、暗黙の遅延バインディングを利用することによって、
お手軽に実現できる出来るExcelの操作も、C#で実現するとなると、ちょっと面倒くさいことになります。
事前バインディングでも実装することもできるが、事前バインディングだと
Excelのバージョン違いを吸収することができないので、なにかとウマクナイ。
できればExcelバージョンに依存しないように、遅延バインディング*1実現したいところです。


そんなときは、.NET FCLの中からActivatorやらReflectionやらを使いましょう。
以下のサンプルはただExcelファイルを開くだけのプログラムです。

using System;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            // Excelファイルのパス
            string xlsPath = @"C:\teeestoooo.xls";

            // Excelのクラスのタイプとインスタンスを取得する 
            //Excel.Application xlsApplication = new Excel.Application();
            object xlsApp = CreateObject("Excel.Application");
             
            //ワークブックコレクションオブジェクト
            //Excel.Workbooks xlsBools = xlsApplication.Workbooks;
             object xlsBooks = xlsApp.GetType().InvokeMember("Workbooks",BindingFlags.GetProperty, null, xlsApp, null);

             //Excelファイルのオープン
             //xlsBools.Open(xlsPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             //                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             //                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             //                Type.Missing, Type.Missing);
             object xlsBook = xlsBooks.GetType().InvokeMember(
                                   "Open", BindingFlags.InvokeMethod, null,
                                   xlsBooks, new object[] { 
                                                               xlsPath
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing
                                                             , Type.Missing 
                                                             });

             // Excelファイルの表示
             //xlsApplication.Visible = true; 
             xlsApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, xlsApp, new object[] { true });

        }

        /// <summary>
        /// COMオブジェクトへの参照を作成および取得します
        /// </summary>
        /// <param name="progId">作成するオブジェクトのプログラムID</param>
        /// <param name="serverName">
        /// オブジェクトが作成されるネットワークサーバー名
        /// </param>
        /// <returns>作成されたCOMオブジェクト</returns>
        public static object CreateObject(string progId, string serverName)
        {
            Type t;
            if (serverName == null || serverName.Length == 0)
                t = Type.GetTypeFromProgID(progId);
            else
                t = Type.GetTypeFromProgID(progId, serverName, true);
            return Activator.CreateInstance(t);
        }

        /// <summary>
        /// COMオブジェクトへの参照を作成および取得します
        /// </summary>
        /// <param name="progId">作成するオブジェクトのプログラムID</param>
        /// <returns>作成されたCOMオブジェクト</returns>
        public static object CreateObject(string progId)
        {
            return CreateObject(progId, null);
        }
    }
}

*1:レイトバインディングだとか実行時バインディングとも言う