SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

最新POIでOffice Open XML形式のExcelファイルを操作

「Usermodel API」を利用したExcelの計算式・図形操作

最新POIでOffice Open XML形式のExcelファイルを操作 第3回

FormulaEvaluator

 CellインターフェースやXSSFCellクラスにはセルに設定された計算式を文字列で返す「getCellFormula()」メソッドが用意されています。このメソッドは計算式の結果ではなく、計算式自体を文字列で返します(例:AVERAGE(A5:A30))。

 一方、プログラムでセルに設定されている計算式の結果を取得するためには「FormulaEvaluatorインターフェース」や「XSSFFormulaEvaluatorクラス」を利用します。「FormulaEvaluatorインターフェース」を利用した例をサンプルプログラム(EvaluatorSample)で確認してみましょう。

EvaluatorSampleの実行結果
EvaluatorSampleの実行結果
ソース3
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)
  •  ワークブックオブジェクトからCrationHelperインターフェースを取得し、CrationHelperのメソッドを利用してFormulaEvaluatorを生成します。

  • ソース3 -(2)
  •  本連載の初回でサンプルプログラムを利用して出力したファイル「timesheet.xlsx」のセル「J3」をCellReferenceクラスで参照し、セルオブジェクトを取得します。

  • ソース3 -(3)
  •  取得したセルオブジェクトが計算式であれば、計算式を文字列で取得し、コンソールに出力しています。

  • ソース3 -(4)
  •  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」という実行時例外の結果になりました。ある程度の複雑な計算式になるとまだサポートされていないようです。

次のページ
図形

この記事は参考になりましたか?

最新POIでOffice Open XML形式のExcelファイルを操作連載記事一覧

もっと読む

この記事の著者

土田 将人(ツチダ マサト)

株式会社ビーブレイクシステムズにて業務システムのパッケージソフト(MA-EYES)の製品開発に従事。英語や会計等、システム開発以外のスキルを活かして官公庁やメーカ系のシステム開発で活躍中。少し前に、パッケージソフトMA-EYESの開発を通して「POI」を知り尽くし、勢い余って本稿の執筆に至る。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4971 2010/03/30 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー