redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

C#でExcelファイルを扱うライブラリごとのファイルクローズ方法(EPPlus、NPOI)

C#ASP.NET MVC)でExcelファイルを扱う方法を調べていて、EPPlusが良さそうだったので簡単なプログラムを作成して動作を確認した。しばらく経って実際に使用する時になって、ファイル形式が .xls であることが判明。

EPPlusでは .xls のファイルは読み込めないため、NPOIについての調べ始めたところ、NPOIのサンプルがコンソールアプリケーションばかりでファイルストリームのクローズについてあまり書かれていなかったので、EPPlusと並べて記録しておきます。

EPPlus

EPPlusでは以下のように実装していました。dataは、コントローラのアクションメソッドで受け取ったHttpPostedFileBaseクラスのインスタンスです。ExcelPackageがIDisposableインターフェイスを実装しているのでスマートに書けます。

using (ExcelPackage inputFile = new ExcelPackage(data.InputStream))
{
    ExcelWorksheet sheet = inputFile.Workbook.Worksheets["Sheet1"];
    // ...以下何らかの処理
}

NPOI

NPOIも、WorkbookFactoryクラスのCreateメソッドや、HSSFWorkbookクラスのコンストラクタ等でストリームを受け取ることが出来るのですが、メソッドの戻り値であるIWorkbookがIDisposableインターフェイスを実装していないので、usingを使用することが出来ません。
さらに調べていくと、NPOIのGitHubリポジトリのexamplesフォルダに似たようなサンプルがあったので、その方法を使用します。

IWorkbook book;
using (Stream fs = data.InputStream)
{
    book = WorkbookFactory.Create(fs);
}
ISheet sheet = book.GetSheet("Sheet1");
// ...以下何らかの処理

以上です。