C#からExcelファイルを操作する方法

三連休なんだけど明日は休日出勤です。この週末は自己啓発な週末でRubyの本を読みあさりつつ下記の気になっている手法を試してみました。題して「C#からExcelファイルを読み書きする方法」です。

どうやら方法としてはみなさんマイクロソフトの情報を元にやっていて私もそうなんですが、微妙に環境によって違うみたいですね。ちなみに私の今回試した環境はWindowsXPで開発環境はVisualStudio.NET2003でExcel2002(XP)です。

まず、VS.NETのプロジェクトメニューで参照の追加を行います。COM他部を選択してMicrosoft Excel 10.0 Object Libraryを選択して追加します。これってインストールしているExcelのバージョンに依存するみたいですね。ちょっと汎用性に欠けるかなと思っています。

問題はここからでした。Excelオブジェクトとして展開する場合ブックやシートやセルの概念というか関係をよく理解していないと躓きますし、環境によって与えるパラメータが異なったり(Missing.ValueとかType.Missingとか)、他の方が書いたサンプルではコンパイルエラーになったりと微妙に違います。またExcelオブジェクトのメンバ(??)に_WorkSheetとか最初にアンダーバーがつくものがあったりしてアンダーバーがつかないものもあります。ここのExcelオブジェクトの正確な資料が見たいのですが、今のところ見つけられていません。とりあえず、こうやれば動き的なものはあるんですけどね。ということで自分で書いておきながら私のやった方法を下記に示します。備忘録みたいなものですが。

やっていることはTEST.XLSというExcelファイルを開いて、二つのセル指定の方式でそれぞれセルに書き込みをするというものです。最初困ったことに開いたExcelが閉じられない状態でした。いろいろと調べたところ、生成したオブジェクトはきちんと解放してあげなければいけないようです。下記ソースの終了処理と書いてあるところ以降がその処理になります。

これでとりあえず動くようにはなったけど、やはりきちんと理解したいところはありますね。Excelオブジェクトの資料は探してみます。

// オブジェクトの定義
// Excelアプリケーション
Excel.Application objExcel;
// ワークブック
Excel._Workbook objBook;
// ワークシート
Excel._Worksheet objSheet;
// レンジ
Excel.Range objRange;

private void btnTest_Click(object sender,System.EventArgs e)
{
    string strFileName=null;

    objExcel = new Excel.ApplicationClass();
    objExcel.Visible = true;
    // ファイルの指定

    strFileName="C:\\WORK\\TEST.xls";

    // 指定したファイルをオープン
    objBook = (Excel._Workbook)(objExcel.Workbooks.Open(strFileName,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));

    objSheet = (Excel._Worksheet)objBook.Sheets[1];

    // Range指定する場合
    objRange = objSheet.get_Range("A1",Type.Missing);
  objRange.Value2="Range Test";
    // Cell指定する場合
    objRange = (Excel.Range)objSheet.Cells[2,1];
  // 選択したデータの個数を表示
  objRange.Value2="Cell Test";

   // 終了処理
   // Range
   if (objRange != null) 
   {
System.Runtime.InteropServices.Marshal.ReleaseComObject(objRange);
   }
   // シート
   if (objSheet != null) 
   {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet);
   }
   // ブック
   if (objBook != null) 
   {
System.Runtime.InteropServices.Marshal.ReleaseComObject(objBook);
   }
   // Excel
   if (objExcel != null) 
   {
       try 
       {
           objExcel.Quit();
       } 
       finally 
       {
       System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel);
       }
   }

}

 

コメントを残す