リフレクションを利用したレイトバインディングで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); } } }