概要
GroovyからApache POIを使用してExcelのデータを読んでみました。Excel持ってないので、OpenOfficeで作成したExcelデータですが。。。
内容
groovyでPOIを使用してセルのデータを読むコードをこんな感じで書いてみました。import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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.ss.usermodel.WorkbookFactory;
class POIUtils {
static def getCellValue(Sheet sheet, rowNum, colNum) {
// nullセーフナビゲーションを使用してセルにアクセスする
Cell cellObj = sheet?.getRow(rowNum)?.getCell(colNum)
switch (cellObj) {
case null:
""
break;
default:
switch (cellObj.cellType) {
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cellObj)) {
cellObj.getDateCellValue()
} else {
cellObj.getNumericCellValue()
}
break;
case Cell.CELL_TYPE_BLANK:
""
break;
case Cell.CELL_TYPE_BOOLEAN:
cellObj.getBooleanCellValue()
break;
case Cell.CELL_TYPE_ERROR:
""
break;
case Cell.CELL_TYPE_FORMULA:
cellObj.getCellFormula()
break;
case Cell.CELL_TYPE_STRING:
cellObj.getStringCellValue()
break;
}
}
}
}
上記を呼び出すソースは以下。
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
class Startup {
static void main(args) {
// ローンパターンを使用し、ストリーム使用後に安全にクローズする
new FileInputStream("./resources/test.xls").withStream {fis ->
Sheet sheet = WorkbookFactory.create(fis).getSheetAt(0)
println(POIUtils.getCellValue(sheet, 0, 0));
// groovy版のループを使用し、1行目から10行目までのセルの値を書き出す
// TODO クロージャ内でfor文が使えない!!!
// なぜかorg.codehaus.groovy.control.MultipleCompilationErrorsExceptionが発生。。。
for (def i in 0..<10) {
println(i.toString())
}
}
}
}
上記ソース上のコメントにも書きましたが、クロージャ内でfor文を書くと
org.codehaus.groovy.control.MultipleCompilationErrorsExceptionが発生しました。
なんで???意味不明です。書き方が悪いのかな。
もう少し調査します。
あと、POIUtilsの部分ももっと(?)groovyチックに書きたいです。
徐々に勉強しながらカスタマイズしていこう。
2011/09/22追記
クロージャ内のfor文はうまくいかなかったですが、以下のようにループを書いてやるとうまくいきました。
原因は不明です。
// for (def i in 0..<10) {
// println(i.toString())
// }
10.times {
println(POIUtils.getCellValue(sheet, it, 0));
}
for (int i = 0; i < 10; i++) {
println(POIUtils.getCellValue(sheet, i, 0))
}
クロージャ内の制御文は失敗する仕様なのかも知れない。。。
原因分かればまた追記します。
ただ単に構文ミスってようです。
これで動作しました。
GExcelAPIというnobeansさんという世界的にも有名な開発者の方
返信削除(勿論fumokmmさんと同じJGGUGのスタッフ)
が作られたGroovyのpoiのラッパーが既にありますので
そちらを使われると大分楽になります。
http://d.hatena.ne.jp/nobeans/20101216/1292513322
自分が試した例等は
https://gist.github.com/1216787
https://gist.github.com/1221382
あたり
あともう少し勉強を進めていくと
SwingBuilderというSwingのラッパー辺りを触ると楽しくなると思います
<kiy0takaさんというJGGUGの方が一番詳しいです
kimukouさん
返信削除>GExcelAPIというnobeansさんという世界的にも有名な開発者の方
(勿論fumokmmさんと同じJGGUGのスタッフ)
既にPOIのラッパーがあったんですね。
サンプル等を見てみると使いやすそうで、すてきな感じですね。