redwarrior’s diary

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

NPOIでExcelのセルの値を取得する(関数も対応)

NPOIを使用してExcelを読み込む処理を作成したので、後から見返せるように気づいたことをメモしておく。

確認したバージョン:.NET Framework 4.6、NPOI 2.3.0

Excelのセルの値を取得する場合は、以下のようにまずICellインスタンスを取得する。

//sheetは、ISheetインターフェイスのインスタンス
ICell cell = sheet.GetRow(行番号).GetCell(列番号);

数値や文字列を取得する

ICellインターフェイスで宣言されているプロパティから値を取得することが出来る。セルが空の場合も対応している。

ICellインターフェイス

やりたい事 プロパティ セルが空の場合の返り値
数値を取得する NumericCellValue double型の0
文字列を取得する StringCellValue string型の""(空文字)

関数の結果を取得する

NumericCellValueプロパティや、StringCellValueプロパティは、セルの値が関数の場合、関数を評価した結果を返してくれる。

ICellインターフェイス

やりたい事 プロパティ 関数の場合の返り値
数値を取得する NumericCellValue 関数を評価した結果の数値
文字列を取得する StringCellValue 関数を評価した結果の文字列

関数を評価した結果を取得するのに、IFormulaEvaluatorインターフェイスを使用する方法もある。
Evaluateメソッドに対象セルのICellインスタンスを渡して実行し、CellValueインスタンスを取得する

//workbookは、IWorkbookインターフェイスのインスタンス
IFormulaEvaluator evaluator = workbook.GetCreationHelper().CreateFormulaEvaluator();
//cellは、ICellインターフェイスのインスタンス(値を取得したいセル)
CellValue cellValue = evaluator.Evaluate(cell);

CellValueインスタンスに関数の評価結果が入るので、プロパティから値を取得することが出来る。
セルの値が空の場合は、CellValueインスタンスにnullが入るため、プロパティを参照すると例外が発生する。

CellValueクラス

やりたい事 プロパティ セルが空の場合の返り値
数値を取得する NumberValue NullReferenceExceptionが発生
文字列を取得する StringValue NullReferenceExceptionが発生

CellValueクラスでは、関数の評価結果のデータ型とプロパティが異なっていても例外にはならない。

CellValueクラス

関数を評価した結果 プロパティ 返り値
数値 NumberValue 数値
数値 StringValue null
文字列 NumberValue double型の0
文字列 StringValue 文字列

関数を評価した結果のデータ型が、条件によって変わるセルの値を取得する

ICellインターフェイスのプロパティでは、関数の評価結果とプロパティの型が異なると例外が発生するため使えない。

ICellインターフェイス

関数を評価した結果 プロパティ 返り値
数値 StringCellValue InvalidOperationExceptionが発生
文字列 NumericCellValue InvalidOperationExceptionが発生

関数を評価した結果の型が条件によって変わる場合は、CellValueクラスを使用する。
CellValueクラスのCellTypeプロパティにはデータ型が格納されているため、データ型で分岐して処理が出来る。

//cellValueは、CellValueクラスのインスタンス
var value = string.Empty;
if (cellValue.CellType == CellType.String) {
    value = cellValue.StringValue;
}

以上。