Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

OfficeのCOMオブジェクトを自動で解放してくれるライブラリNetOfficeがすばらしい

.NETからOfficeを扱うのは非常に面倒です。1つでもCOMオブジェクトの解放漏れがあるとプロセスが解放されずに残ってしまうからです。
複数のCOMオブジェクトを確実に解放する - プログラマーな日々
.NETでCOMを扱う際に、複数のCOMオブジェクトを確実に解放する方法を紹介します。 ...

そこで、COMオブジェクトを自動で解放してくれるNetOfficeというライブラリを試してみました。
【C#】【Oracle】【Excel】DBから取得したデータをExcelに貼り付ける。 | 創造的プログラミングと粘土細工
NETOfficeを利用するとComオブジェクト(?)を自動で解放してくれるので、その煩わしさが軽減されます。また、Officeのオブジェクトモデルがクラスで定義されているので、インテリセンスが利く環 ...

検証環境

Visual Studio 2010 SP1、.NET 4、Excel 2007

準備

ライブラリをダウンロードする

NetOffice - MS Office in .NET - Home
.NET Wrapper Assemblies for accessing the following MS Office applications: Office, Excel, Word, Ou ...

Visual Studioを起動し、プロジェクトを作成する
Dllを参照設定する

NetOffice.dllと*Api.dll(今回はExcelを使用するのでExcelApi.dll)を参照設定します。

.NET 4の場合は、ビルドエラーを解決する

こちらのブログを参照してください。
【C#】【Excel】【NetOffice】NetOffice を使って .NET Framework 4で開発するには | 創造的プログラミングと粘土細工
結論をいうと参照に加えたdllの参照設定プロパティに「相互運用機能の埋め込み」というのがあるので、それをTrueからFalseに変えるとうまくコンパイルが通るようになります。

ソース

まるでVBAのような気軽さで、こんなにシンプルにコードを書けます。

using NetOffice.ExcelApi;

namespace ConsoleApplication {
    class Program {
        static void Main(string[] args) {
            Application app = new Application();
            Workbook workbook = app.Workbooks.Add();
            // インデックスが 1 から始まることに注意。
            ((Worksheet) workbook.Worksheets[1]).Cells[1, 1].Value = "test";
            workbook.Close(saveChanges:true, filename:@"D:\Sandbox\test.xlsx");
            app.Quit();
        }
    }
}

検証

実行中

アプリの実行中は、Excelのプロセスが立ち上がっています。

実行後

実行後は、ちゃんとExcelのプロセスが終了しました。

Excelファイル

正しく文字列が出力されています。

感想

すばらしいです。NetOfficeのよいところを挙げてみます。

  • 多くのアプリケーションに対応している(Excel, Word, Outlook, PowerPoint, Access, Project, Visio)
  • Officeの多くのバージョンに対応している(2000, 2002, 2003, 2007, 2010, 2013)
  • .NET Frameworkの多くのバージョンに対応している(2.0以上)
  • Officeのオブジェクトモデルと同一のクラス群が用意されているので、新たに学習する必要がない。
  • PIA(プライマリ相互運用機能アセンブリ)、VSTOに依存していない。