FormulaEvaluator
CellインターフェースやXSSFCellクラスにはセルに設定された計算式を文字列で返す「getCellFormula()」メソッドが用意されています。このメソッドは計算式の結果ではなく、計算式自体を文字列で返します(例:AVERAGE(A5:A30))。
一方、プログラムでセルに設定されている計算式の結果を取得するためには「FormulaEvaluatorインターフェース」や「XSSFFormulaEvaluatorクラス」を利用します。「FormulaEvaluatorインターフェース」を利用した例をサンプルプログラム(EvaluatorSample)で確認してみましょう。
import java.io.IOException;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class EvaluatorSample {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Workbook wb = new XSSFWorkbook("timesheet.xlsx ");
Sheet sheet = wb.getSheetAt(0);
// (1) FormularEvaluatorを生成
CreationHelper crateHelper = wb.getCreationHelper();
FormulaEvaluator evaluator = crateHelper.createFormulaEvaluator();
// (2) 計算式をセットしたセルを参照
CellReference cellReference = new CellReference("J3");
Row row = sheet.getRow(cellReference.getRow());
Cell cell = row.getCell(cellReference.getCol());
// (3) 計算式をコンソールに出力
if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
System.out.println("数式: " + cell.getCellFormula());
// (4) 計算式の結果を取得しコンソールに出力
CellValue cellValue = evaluator.evaluate(cell);
System.out.print("数式の結果: ");
switch (cellValue.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.println(cellValue.getBooleanValue());
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.println(cellValue.getNumberValue());
break;
case Cell.CELL_TYPE_STRING:
System.out.println(cellValue.getStringValue());
break;
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_ERROR:
break;
}
}
}
}
- ソース3 -(1)
- ソース3 -(2)
- ソース3 -(3)
- ソース3 -(4)
ワークブックオブジェクトからCrationHelperインターフェースを取得し、CrationHelperのメソッドを利用してFormulaEvaluatorを生成します。
本連載の初回でサンプルプログラムを利用して出力したファイル「timesheet.xlsx」のセル「J3」をCellReferenceクラスで参照し、セルオブジェクトを取得します。
取得したセルオブジェクトが計算式であれば、計算式を文字列で取得し、コンソールに出力しています。
FormulaEvaluatorのevaluateメソッドを利用して、CellValueオブジェクトを取得しています。CellValueオブジェクトは、計算式が設定されているセルへの参照はありませんが、計算式の結果値を持つValue Objectです。Cellオブジェクトと類似した方法で値を取得できます。
FormulaEvaluatorにはサンプルで利用したメソッド「evaluate」以外に「evaluateFormulaCell」と「evaluateInCell」メソッドも用意されています。それぞれの特徴を表にまとめます。
| メソッド | 特徴 |
| CellValue evaluate(Cell c) | 評価したセルに影響を与えることなく、計算式の結果をCellValueというValue Objectの形で戻します。 |
| int evaluateFormulaCell(Cell c) | 評価したセルが計算式の場合、計算式情報を維持しつつ、表示用に計算式の結果値も保持するようになります。セルが計算式でない場合はセルに変化はありません。戻り値は計算式の結果値の型に応じた整数です。 |
| Cell evaluateInCell(Cell c) | 評価したセルが計算式の場合、計算式情報を計算式の結果値と入替ます。セルが計算式でない場合はセルに変化はありません。戻り値は計算式の結果値を保持しているセルオブジェクトです。 |
ちなみにソース1で「Monthly_Deposit」と名前の定義をした計算式をevaluateしてみた結果は「Complex name formulas not supported yet」という実行時例外の結果になりました。ある程度の複雑な計算式になるとまだサポートされていないようです。

