Apache POI

仕事でJavaからExcelシートの取得、設定を行う必要があったので、Apache POIについて調べてみました。

 

・ダウンロード

以下よりPOIのjarをダウンロード

http://poi.apache.org/download.html#POI-3.15

バイナリ版を取得

poi-bin-3.16-beta1-20161120.zip

 

・インストール

上記のzipファイルを解凍し、poiフォルダをeclipsejavaプロジェクトにドラッグすると、プロジェクトにコピーされます。

 

コピーされたpoiのライブラリのjarをすべて選んで右クリックし、クラスパスへ追加します。

 

・POIの使い方

 

調査したところ、POIにはHSSFとXSSF があり、Excel形式がxlsの場合はHSSF、xlsx(2007以降)の場合は、XSSFで使い分ける必要があるようです。

 

以前プログラミングしていて、ちょっと面倒だと思ったのは、セルの型を意識したプログラミングをする必要があることでした。

http://www.javadrive.jp/poi/cell/index7.html

 

数式の結果を取得するのは結構大変です。

http://shin-kawara.seesaa.net/article/159878953.html

 

こちらにFormulaEvaluator#evaluateInCell()を使用して、セルの値を計算式の結果を取得するという情報がありました。

上手くいくかと思ったのですが、=CELL("filename",A1)のシート名を取ろうとすると、NotImplementedExceptionでうまく取れません。

http://www.ne.jp/asahi/hishidama/home/tech/apache/poi/cell.html

 

結局以下の情報を参考にするとCELL関数の結果を取得することができました。

http://stackoverflow.com/questions/7608511/java-poi-how-to-read-excel-cell-value-and-not-the-formula-computing-it

 

とりあえず、サンプルソースを参考に動作確認をしてみました。

 

 

Exception in thread "main" org.apache.poi.ss.formula.eval.NotImplementedException: Error evaluating cell '【連携】通信設定'!K9
 at org.apache.poi.ss.formula.WorkbookEvaluator.addExceptionInfo(WorkbookEvaluator.java:386)
 at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:327)
 at org.apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.java:259)
 at org.apache.poi.xssf.usermodel.BaseXSSFFormulaEvaluator.evaluateFormulaCellValue(BaseXSSFFormulaEvaluator.java:65)
 at org.apache.poi.ss.formula.BaseFormulaEvaluator.evaluateInCell(BaseFormulaEvaluator.java:137)
 at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.evaluateInCell(XSSFFormulaEvaluator.java:77)
 at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.evaluateInCell(XSSFFormulaEvaluator.java:36)
 at excel.Sample.main(Sample.java:56)
Caused by: org.apache.poi.ss.formula.eval.NotImplementedFunctionException: CELL
 at org.apache.poi.ss.formula.functions.NotImplementedFunction.evaluate(NotImplementedFunction.java:40)
 at org.apache.poi.ss.formula.OperationEvaluatorFactory.evaluate(OperationEvaluatorFactory.java:132)
 at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateFormula(WorkbookEvaluator.java:550)
 at org.apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.java:317)
 ... 6 more