POIを使ってエクセルのデータを読めることはわかったのですが、関数の値や別セルの参照値はどうなんだろう? 実際ある程度の関数や参照は扱えないと使いものにならない。

調べてみると、ある程度のはサポートされているらしい。
  • References: single cell & area, 2D & 3D, relative & absolute
  • Literals: Number, text, boolean, error and array
  • Operators: arithmetic and logical, some region operators
  • Built-in functions: over 350 recognised, 280 evaluatable
  • Add-in functions: 3 from Analysis Toolpack
とりあえず十分のようです。

FormulaEvaluator というクラスが用意されていて、こいつで計算結果なりを取得できるようです。
取得方法はいくつか用意されているのですが、とりあえず一番簡単な

 FormulaEvaluator.evaluateInCell(Cell cell)

を使ってみる。これは引数で指定されたセルが計算式ならその結果でセルを置き換えてしまいます(元の式は式は結果で上書きされる)。
式でないなら何も起こりません。 
 とりあえず、sum()関数と別シートのセルを参照するようなエクセルファイルを作って試してみました。

 31)
50)
	public class Main {
		public static void main(String[] args){
		    try {
		        InputStream file = new FileInputStream("data/hello_poi.xls");
		        Workbook book = new HSSFWorkbook(file);
		        FormulaEvaluator feval = book.getCreationHelper().createFormulaEvaluator();
		        Sheet sheet = book.getSheetAt(0);
		        for(int rowIndex = 0; rowIndex < 4; rowIndex++) {
		            Row row = sheet.getRow(rowIndex);
		            for (int colIndex = 0; colIndex < 2; colIndex++) {
	                    Cell cell = row.getCell(colIndex);
	                    String rawValue = cell.toString();
	                    feval.evaluateInCell(cell);
	                    System.out.printf("row=%d, cell=%d, rawValue=%s, evaluatedValue=%s\n" ,
	                            rowIndex, 
	                            colIndex,
	                            rawValue,
	                            cell);
	                }
		        }
		        file.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
		}
	}
  • row=2, cell=1, rawValue=Sheet2!A1, evaluatedValue=これは別シート
  • row=3, cell=1, rawValue=SUM(D1:D3), evaluatedValue=6.0
ちゃんと式の部分が評価された結果を取得できているようです。
これが出来ないと問題になりそうだったので、いやーよかったよかった、、、。



28)