【C#】自作Excel操作クラスのサンプル(COM相互運用。他の選択肢の情報も)

C#

WindowsアプリケーションからExcelファイルを編集する場合の選択肢のひとつとして、COM相互運用を用いたExcelファイルの操作があります。COM相互運用では、Excelの豊富な機能を使える反面、COMの仕組み独特の難しさも存在します。

この記事では、C#でCOM相互運用についての基本情報と、自作のExcel操作クラスを作る際に参考になりそうなサンプルコードを紹介します。

COM相互運用とは

COM(Component Object Model)は、Microsoftが開発した、異なるプログラミング言語で書かれたソフトウェアコンポーネントが連携して動作するためのアーキテクチャです。C#からExcelを操作する際、COM相互運用を通じてExcelのCOMオブジェクトモデルにアクセスします。

COM相互運用の難しさ

COMオブジェクトはマネージドリソースではないため、.NETのガベージコレクタが自動的に管理しません。このため、使用後には明示的にリソースを解放する必要があります。

たとえば、セルに文字列を格納する処理など、VBAではたった1行で済む処理であっても、C#のCOM相互運用で行う場合は何行にも膨れ上がってしまいます。

VBAの場合

worksheet.Cells(1, 1).Value = "Sample"

C#のCOM相互運用の場合

Range cells = worksheet.Cells;    // オブジェクト保持
Range range = cells[1, 1];        // オブジェクト保持
range.Value = "Sample";
Marshal.ReleaseComObject(range);  // オブジェクト解放
Marshal.ReleaseComObject(cells);  // オブジェクト解放

このような不便を避けるために、私はC#のCOM相互運用でExcelを操作する場合は、自作クラスを作り、上記のような面倒な処理を何度も書かなくて良いよう、仕組みを隠ぺいして使うようにしています。

Excel操作クラスのサンプルコード

私が実際に使っているクラスは、ちょっと複雑になってしまっているので、シンプルな機能のみに絞ったクラスを紹介します。自作Excel操作クラスを検討される際の参考にはなるのではないかと思います。

C#+COM相互運用(早期バインディング)

Visual StudioなどのIDEでのオートコンプリートやコード補完機能が利用できるので、開発がし易くなります。ただし、アプリのビルド時にExcelの参照設定をする必要があるため、Excelバージョン依存となります。

C#+COM相互運用(遅延バインディング)

Excelのバージョンに依存しないため、異なる環境でもコードの変更なしに動作する可能性が高まります。COMオブジェクトはdynamic型を使ってアクセスするため、オートコンプリートやコード補完が利用できません。このため、早期バインディングに対して開発の難度が高まります。

WindowsアプリからExcelファイルを操作する他の選択肢

C#+EPPlus

EPPlusは、Open XMLファイル形式(.xlsx)を扱うライブラリです。Excelのインストール不要で動作し、パフォーマンスに優れており、大量のデータの操作も効率的に行えます。COM相互運用と異なり、.NETのガベージコレクタによる自動メモリ管理の恩恵も受けます。なお、EPPlusはVer.5からライセンス方式が変わっています。商用アプリで使用する場合は特に注意しましょう。

Python+OpenPyXL

OpenPyXLも、Open XMLファイル形式(.xlsx)を扱うライブラリです。OpenPyXLを使うことで、Pythonプログラムから.xlsx形式のExcelファイルを直接操作できます。

VBAを使う

ユーザ環境でExcelを立ち上げてExcel VBAのフォームを表示しても良い、という条件であれば、直接Excelアプリを操作できるVBAは強力な選択肢です。

まとめ

この記事では、C#でExcelファイルを操作・編集するアプリを作成するための情報を紹介しました。いろいろ試して、自分に合う方法を見つけてください。

タイトルとURLをコピーしました