またもや前回の続きでApachePOIです。
https://qiita.com/Mk-4000/items/5d52b4b92ed5f8bf23f5
今回の内容
前回はセルタイプごとの取得方法を書いていましたが、
CellType.FORMULA(数式タイプ)
のときのメソッド
getCellFormula()
ではセル内の数式そのものがString型で取得できることがわかりました。
ではその数式の結果が欲しいときは?
と言ったときの対象方。
具体的にどうするか
色々とどうにかできないものか探してこちらの方の記事を参考にしました。
http://shin-kawara.seesaa.net/article/159878953.html
FormulaEvaluatorインターフェイス
と言うものがありました。
これは数式セルを評価する。値にする。といったもので、要は計算後の値にするために色々助けてくれるものです。
また、
CreationHelperインターフェイス
も使用するそうです。
こちらは、具象クラスのインスタンス化を処理するオブジェクト。
感覚的にはPOIのオブジェクトを色々生成してくれるやつと思ってます。
この2つを準備して、
1.WorkbookオブジェクトからCreationHelperを用意(getCreationHelper())
2.CreationHelperを通してFormulaEvaluatorも生成(createFormulaEvaluator())
3.対象cellをFormulaEvaluator.evaluateInCell()を使用して、計算しちゃう
といった流れです。
FormulaEvaluator.evaluateInCell(cell)
引数にセルを入れて引数に含まれるセルの数式を評価、計算してしまいその結果を返すメソッド
これを使えば数式でも計算後の値が取れるそうです。
実装結果
private static String getCellStringValue(Cell cell) {
String retStr;
CellType cellType = cell.getCellType();
switch (cellType) {
case STRING:
retStr = cell.getStringCellValue();
break;
case NUMERIC:
retStr = String.valueOf(cell.getNumericCellValue());
break;
case BOOLEAN:
retStr = String.valueOf(cell.getBooleanCellValue());
break;
case FORMULA:
//関数結果を取得
Workbook wb = cell.getSheet().getWorkbook();
CreationHelper ch = wb.getCreationHelper();
FormulaEvaluator fe = ch.createFormulaEvaluator();
retStr = String.valueOf(getCellStringValue(fe.evaluateInCell(cell)));
break;
case ERROR:
retStr = String.valueOf(cell.getErrorCellValue());
break;
default:
retStr = "";
break;
}
return retStr;
}
1.0
2.0
3.0