ソフト関連Trial−No.107
        遅延バインドによるExcel操作用ライブラリーの紹介

トップページへ

 はじめに

VB、C#などの.NET系言語でMicrosoft Excel(以下、Excelと略)を取り扱う際、通常はExcelへの参照設定をして、 事前バインディングの手法でプログラムを作成します。
作者も今まではこの手法でExcelへの入出力を伴うアプリケーションを制作してきました。
この手法は、アプリケーションで使用するExcelのバージョンが指定されている場合には有効に使えますが、 Excelの全バージョンへの対応が要求されるアプリケーションではバージョンの互換性の問題が発生する可能性があります。

Excelのバージョンに影響されないプログラミング方法に、遅延バインディング(実行時バインディング)の手法があります。
この手法には、プログラムの実行速度が事前バインディングの場合よりも遅くなるという問題があります。
また、Option Strinct On でのプログラミングがしにくいために、Option Strinct On が必須であるC#言語で使用する場合には、 Excelを操作する個々のメソッドの命令文作成にある程度の工夫が必要になります。
そこでVB言語を使って、Option Strict Off、遅延バインディングの設定でExcel操作のメソッドを実装したクラスライブラリーを作成しておき、 アプリケーション本体ではこのクラスライブラリーを参照設定して使用するようにしました。
このようにすれば、アプリケーション本体は Option Strinct On の設定でプログラミングすることができます。
今回、Excelを操作する数十種類のメソッドを含んだクラスライブラリー(CKExcelLB.dll)を作成したので、これを公開することにしました。

 [CKExcelLB.dll]の構成

開発環境:Visual Basic 2010(.NET Framework 2.0)
コンパイルオプション:Option Explicit On、Option Strict Off
名前空間:CKExcelLB

含まれるクラス、Enum
[ExcelLB]クラス
 Excel、Workbook(s)、Worksheet(s)、Range、Cell(s)、Row、Columnなどのオブジェクトに関するプロパティ、メソッドを実装したクラスです。
 次の項でこのクラスに含まれる主なプロパティ、メソッドを紹介します。
[CellBorder]クラス
 セルの罫線を扱うクラスです。
[CellLineStyle]Enum
 セル罫線の種類(直線、破線、点線等)設定に使用するEnumです。
[CellBorderIndex]Enum
 セル罫線の場所(セル上辺、下辺等の罫線設置場所)設定に使用するEnumです。
[CellBorderWeight]Enum
 セル罫線の太さの設定に使用するEnumです。

 [ExcelLB]クラスに含まれる主要プロパティ・メソッド

全般
 DisplayAlertsプロパティ
 Visibleプロパティ
 Disposeメソッド:Excelオブジェクトを破棄する
 Quitメソッド:Excelを終了する
 ReleaseObjectメソッド:COMオブジェクトを解放する

Workbook(s)関係
 Workbooksプロパティ
 AddBookメソッド:Workbookを追加する
 CloseBookメソッド:WorkbookをCloseする
 OpenBookメソッド:指定されたファイル名のWorkbookを開く
 Saveメソッド:Workbookを上書き保存する
 SaveAsメソッド:Workbookに名前を付けて保存する

Worksheet(s)関係
 ActiveSheetメソッド:ActiveSheetを返す
 AddSheetメソッド(1オーバーロード):Worksheetを挿入する
 CopySheetメソッド:Worksheetをコピーする
 CountSheetメソッド:Worksheetの枚数を返す
 DeleteSheetメソッド(1オーバーロード):Worksheetを削除する
 GetSheetメソッド(1オーバーロード):Worksheetを取得する
 GetSheetsメソッド:Worksheetsを取得する
 GetSheetNameメソッド:Worksheetの名前を取得する
 MoveSheetメソッド:Worksheetの位置を移動する
 PreviewSheetメソッド:Worksheetのプレビューを表示する
 SetSheetNameメソッド:Worksheetにシート名を設定する
 VisibleSheetメソッド:Worksheetの表示・非表示を設定する

Cell(s)関係
 GetCellメソッド:Cellを取得する
 GetCellsメソッド:Cellsを取得する
 GetCellValueメソッド(1オーバーロード):Cellの値を取得する
 MergeCellsメソッド:セルを結合する
 SetCellValueメソッド(1オーバーロード):Cellに値を設定する

Range関係
 ClearContentsメソッド:Rangeのデータだけをクリアする
 ClearFormatsメソッド:Rangeの書式だけをクリアする
 ClearRange メソッド:Rangeのデータと書式をクリアする
 GetRangeメソッド(2オーバーロード):Rangeを取得する
 GetRangeValueメソッド(1オーバーロード):Rangeの値を取得する
 PutBorderメソッド:Rangeに罫線を引く
 SetNumberFormatLocalメソッド(2オーバーロード):RangeのNumberFormatLocalを設定する
 SetRangeメソッド(2オーバーロード):Rangeに値を設定する
 SetRangeColorメソッド:RangeにColorIndexで色を設定する(Ver 1.1.0で追加)
 SetRangeFormulaメソッド(2オーバーロード):RangeのFormulaを設定する
 SetRangeFormulaR1C1メソッド(2オーバーロード):RangeのFormulaR1C1を設定する

Row関係
 DeleteRowメソッド:行を削除する
 GetRowメソッド:行を取得する(Ver 1.1.0で追加)
 InsertRowメソッド:行を挿入する
 SetRowHeightメソッド(1オーバーロード):行高さを設定する

Column関係
 AutoFitColumnWidthメソッド:列幅を自動調整する
 DeleteColumnメソッド:列を削除する
 GetColumnメソッド:列を取得する(Ver 1.1.0で追加)
 InsertColumnメソッド:列を挿入する
 SetColumnWidthメソッド:列幅を設定する

 [CKExcelLB.dll]の利用例

Visual C# 2010(.NET Framework 2.0)を使った[CKExcelLB.dll]の利用例を紹介します。
Visual C# 2010のプロジェクトを作成して、CKExcelLBへの参照設定を追加してから、Formに以下のイベントプロシージャーを作成します。


    private void btnTest_Click(object sender, EventArgs e)
    {
      var xls = new CKExcelLB.ExcelLB(); // ExcelLBのインスタンス作成 (Excelオブジェクト作成)
      xls.Visible = true;
      var books = xls.Workbooks;
      var book1 = xls.AddBook(books);
      var sheets = xls.GetSheets(book1);
      var sheet1 = xls.GetSheet(sheets, 1);
      
      // B2〜C11セルに書式を設定して、値を代入
      for (int i = 2; i < 12; i++);
      {
        var range1 = xls.GetRange(sheet1, i, 2);      // B2〜B11セル
        xls.SetNumberFormatLocal(range1, "@");       // セルに文字列の書式設定
        xls.SetRange(range1, "00" + i.ToString());     // セルに値を代入
        xls.ReleaseObject(range1);             // COMオブジェクトの解放
        var range2 = xls.GetRange(sheet1, i, 3);      // C2〜C11セル
        xls.SetNumberFormatLocal(range2, "#,##0.00_ ");  // セルに数値の書式設定
        xls.SetRange(range2, 1234.5678 * i);        // セルに数値代入
        xls.ReleaseObject(range2);             // COMオブジェクトの解放
      }
      
      // D列のセルに値を書込み
      xls.SetRange(sheet1, "D2", "文字列の書き込みテスト"); // D2セルへの書込み
      xls.SetRange(sheet1, 3, 4, "「D3」セル");       // D3セルへの書込み
      xls.SetRange(sheet1, "D4:D10", "テスト");        // D4:D10セルへの書込み
      xls.SetRangeFormulaR1C1(sheet1, "D11", "=RC[-1]*2");  // D11セルへの書込み
      
      // B〜D列の幅を自動調整
      xls.AutoFitColumnWidth(sheet1, "B:D");
      
      // C9-D9セルの結合
      xls.MergeCells(sheet1, 9, 3, 9, 4);
      
      // セル範囲"B2:D11"に罫線挿入
      var range3 = xls.GetRange(sheet1, "B2:D11");
      var cb = new CKExcelLB.CellBorder();      // CellBorderオブジェクト
      xls.PutBorder(range3, cb);          // 罫線挿入
      cb = null;
      xls.ReleaseObject(range3);
      
      // 5行目に行を挿入
      xls.InsertRow(sheet1, 5);
      
      // bookの保存
      var savename = Application.StartupPath + @"\Test.xls";
      xls.DisplayAlerts = false;
      xls.SaveAs(book1, savename);         // book1に名前を付けて保存
      
      // COMオブジェクトの解放
      xls.ReleaseObject(sheet1);
      xls.CloseBook(book1);
      xls.ReleaseObject(sheets);
      xls.ReleaseObject(book1);
      xls.ReleaseObject(books);
      xls.DisplayAlerts = true;
      
      xls.Quit();
      xls.Dispose();
    }


上記イベントプロシージャーを Excel2007 がインストールされている環境で実行すると以下のような Excel のシートが作成されます。
ExcelExpl
Excel の他のバージョン(2000、2002、2003、2010)の環境で実行しても、問題のない結果が得られました。

 ダウンロード

ダウンロード
[CKExcelLB.dll] とそのソースコードがダウンロードできます。

 更新情報

 2013/12/18 SaveAsメソッドが、.xlsxファイル、.xlsmファイルに対応できるように改造しました。(Ver 1.2.0)
 2012/12/30 ライブラリーに[SetRangeColor]、[GetRow]、[GetColumn]を追加しました。(Ver 1.1.0)
 2012/05/26 「CKExcelLB」を公開しました。(Ver 1.0.0)

 ダウンロードファイルの利用に際してのご注意

ダウンロードしたファイルの利用は、全て利用される方の責任で行っていただきます。
作者は十分な注意を払って本ファイルを作成していますが、もし万一、本ファイルの内容に誤りがあっても、 また、それによってご使用になるパソコンに問題が発生しても、作者は一切責任を負いません。

 ご質問・ご意見・ご感想

ご質問、ご意見、ご感想、バグ等のご連絡は、 こちらへ

トップページへ