2011/09/21

[groovy] POIでExcelのセルの値を取得してみた

概要

GroovyからApache POIを使用してExcelのデータを読んでみました。
Excel持ってないので、OpenOfficeで作成したExcelデータですが。。。

内容

groovyでPOIを使用してセルのデータを読むコードをこんな感じで書いてみました。
  1. import org.apache.poi.ss.usermodel.Cell;  
  2. import org.apache.poi.ss.usermodel.DateUtil;  
  3. import org.apache.poi.ss.usermodel.Row;  
  4. import org.apache.poi.ss.usermodel.Sheet;  
  5. import org.apache.poi.ss.usermodel.Workbook;  
  6. import org.apache.poi.ss.usermodel.WorkbookFactory;  
  7.   
  8. class POIUtils {  
  9.     static def getCellValue(Sheet sheet, rowNum, colNum) {  
  10.   
  11.         // nullセーフナビゲーションを使用してセルにアクセスする  
  12.         Cell cellObj = sheet?.getRow(rowNum)?.getCell(colNum)  
  13.         switch (cellObj) {  
  14.         case null:  
  15.             ""  
  16.             break;  
  17.         default:  
  18.             switch (cellObj.cellType) {  
  19.             case Cell.CELL_TYPE_NUMERIC:  
  20.                 if (DateUtil.isCellDateFormatted(cellObj)) {  
  21.                     cellObj.getDateCellValue()  
  22.                 } else {  
  23.                     cellObj.getNumericCellValue()  
  24.                 }  
  25.                 break;  
  26.             case Cell.CELL_TYPE_BLANK:  
  27.                 ""  
  28.                 break;  
  29.             case Cell.CELL_TYPE_BOOLEAN:  
  30.                 cellObj.getBooleanCellValue()  
  31.                 break;  
  32.             case Cell.CELL_TYPE_ERROR:  
  33.                 ""  
  34.                 break;  
  35.             case Cell.CELL_TYPE_FORMULA:  
  36.                 cellObj.getCellFormula()  
  37.                 break;  
  38.             case Cell.CELL_TYPE_STRING:  
  39.                 cellObj.getStringCellValue()  
  40.                 break;  
  41.             }  
  42.         }  
  43.     }  
  44. }  

上記を呼び出すソースは以下。
  1. import org.apache.poi.ss.usermodel.Sheet;  
  2. import org.apache.poi.ss.usermodel.Workbook;  
  3. import org.apache.poi.ss.usermodel.WorkbookFactory;  
  4.   
  5. class Startup {  
  6.     static void main(args) {  
  7.   
  8.         // ローンパターンを使用し、ストリーム使用後に安全にクローズする  
  9.         new FileInputStream("./resources/test.xls").withStream {fis ->  
  10.             Sheet sheet = WorkbookFactory.create(fis).getSheetAt(0)  
  11.   
  12.             println(POIUtils.getCellValue(sheet, 00));  
  13.   
  14.             // groovy版のループを使用し、1行目から10行目までのセルの値を書き出す  
  15.             // TODO クロージャ内でfor文が使えない!!!  
  16.             // なぜかorg.codehaus.groovy.control.MultipleCompilationErrorsExceptionが発生。。。  
  17.             for (def i in 0..<10) {  
  18.                 println(i.toString())  
  19.             }  
  20.         }  
  21.     }  
  22. }  
上記ソース上のコメントにも書きましたが、クロージャ内でfor文を書くと org.codehaus.groovy.control.MultipleCompilationErrorsExceptionが発生しました。 なんで???意味不明です。書き方が悪いのかな。 もう少し調査します。 あと、POIUtilsの部分ももっと(?)groovyチックに書きたいです。 徐々に勉強しながらカスタマイズしていこう。 2011/09/22追記 クロージャ内のfor文はうまくいかなかったですが、以下のようにループを書いてやるとうまくいきました。 原因は不明です。
  1. //            for (def i in 0..<10) {  
  2. //                println(i.toString())  
  3. //            }  
  4.             10.times {  
  5.                 println(POIUtils.getCellValue(sheet, it, 0));  
  6.             }  
  7.            for (int i = 0; i < 10; i++) {  
  8.                 println(POIUtils.getCellValue(sheet, i, 0))  
  9.             }  

クロージャ内の制御文は失敗する仕様なのかも知れない。。。
原因分かればまた追記します。

ただ単に構文ミスってようです。
これで動作しました。

2 件のコメント:

  1. 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の方が一番詳しいです

    返信削除
  2. kimukouさん

    >GExcelAPIというnobeansさんという世界的にも有名な開発者の方
    (勿論fumokmmさんと同じJGGUGのスタッフ)
    既にPOIのラッパーがあったんですね。
    サンプル等を見てみると使いやすそうで、すてきな感じですね。

    返信削除