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; }
以上。