2011/09/29

[groovy] Grailsを試してみた

ちょっと(かなり?)古い記事を参考にGrailsを試してみました。
http://d.hatena.ne.jp/mottsnite/20090822/1250950657

Grailsを使うと簡単にアプリができるんですね。。。
過去に苦労して携わった開発は何だったんだろうと思うぐらい驚きました。

2011/09/27

[groovy] GExcelAPIを使ってExcelのデータを取得してみた

概要

kimukouさんに教えて頂いた、nobeansさんが開発されたGExcelAPIを使用してExcelのデータを取得してみました。

内容

nobeansさんが作成したサンプルほぼそのままですが、以下コード例です。
import org.jggug.kobo.gexcelapi.GExcel
@GrabResolver(name="kobo-maven-repo", root="https://github.com/kobo/maven-repo/raw/master/release")
@Grab("org.jggug.kobo:gexcelapi:0.2")

class GExcelApiTest {

    void load(String fileName) {

        // Excelファイルを読込む
        def book = GExcel.open(fileName)

        // シートを取得する
        def sheet = book[0]
//        def sheet = book["Sheet1"] // シート名でも取得可能

        // セルの値を取得する
        println sheet.A1.value
        println sheet.A2.value

        println "-"*20
        def dump = { cell -> println "${cell.label}: ${cell.value} - ${cell.cellType}" }
        sheet.A_.each{ cell -> dump cell }
        println "-"*20
        sheet.B_.each{ cell -> dump cell }
        println "-"*20
        sheet._1.each{ cell -> dump cell }
        println "-"*20
        sheet._2.each{ cell -> dump cell }
        println "-"*20
        sheet.A1_B6.each{ row -> row.each { cell -> dump cell } }
    }
}
実行結果
123.0
水曜日
--------------------
A1: 123.0 - 0
A2: 水曜日 - 1
A3: true - 4
A4: 40808.0 - 0
A5:   - 1
A6: 1+1 - 2
--------------------
B1: null - 3
B2: null - 3
B3: null - 3
B4: null - 3
B5: null - 3
B6: null - 3
--------------------
A1: 123.0 - 0
B1: null - 3
C1: null - 3
D1: null - 3
--------------------
A2: 水曜日 - 1
B2: null - 3
--------------------
A1: 123.0 - 0
B1: null - 3
A2: 水曜日 - 1
B2: null - 3
A3: true - 4
B3: null - 3
A4: 40808.0 - 0
B4: null - 3
A5:   - 1
B5: null - 3
A6: 1+1 - 2
B6: null - 3
様々なイテレーターが用意されており、簡単にセルの値を取得することができました。

cell.valueで簡単にセルの値を取れます。
POIでやると、セルタイプに沿ったメソッドを実行して値を取らなきゃいけなかったり、
煩雑な部分が多かったですが、こちらは非常にシンプルで使いやすいです。

Excelデータの中身をさらしてはいませんが、実行結果のA4セルには日付を設定しています。
日付を出力して欲しかったのですが、数値が表示されました。
日付が取得できなかったのは少し残念ですが、非常に強力かつ便利なAPIなので今後も使っていきたいです。

これを使って、Excelから情報をDTOに格納し、テンプレートエンジンを使ってソースコードを自動生成するようなスクリプトでも書いてみようと思います。

2011/09/21

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

概要

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))
            }

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

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

2011/09/16

[groovy] groovyの勉強開始

最近ある問題を解決するために、色々調査していたらこの言語に出会った。
勉強を始めると面白い。

もっと深く勉強したいので、以下を購入してみた。
早く届かないかなぁ。



しばらくは、groovyを中心にブログを書こうと思う。

2011/09/15

[Java] Swing:JTableのセルにComboBoxを設定する方法

概要

JTableのセルにComboBoxを設定する方法を調査したので、説明します。

内容

以下のようにテーブル列のセルエディターに対して、生成済のコンボボックスを引数としたDefaultCellEditorを設定してあげれば、テーブルのセルにコンボボックスを設定することができます。
jTable1.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(cmb_cell1));

これがお手軽で簡単です。
その他の方法としては、CellEdirotを実装したクラスを独自実装し、やる方法があります。

2011/09/13

[Java] swing:jtableのセルをチェックボックスに変更する方法

概要

NetBeansを使えばJTableのセルを簡単にチェックボックスに変更できます。

内容

セルの型をBooleanに変えれば、表示がチェックボックスに変わります。
Booleanにしたら、内部的にエディター、レンダラーがJCheckBoxに変わるのかな。

2011/09/11

[Java] Velocityのログを無効化する方法について

概要

Velocityを使用すると、「velocity.log」というのが勝手に作成されます。
それを作成しないようにする方法について説明します。

内容

以下のようにVelocityの初期処理前にログを設定しないようプロパティを設定すればよいです。
        Velocity.setProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS, "org.apache.velocity.runtime.log.NullLogSystem");
        Velocity.init();

[Java] javaからgroovyスクリプトを実行する方法

概要

Javaプログラムからgroovyスクリプトを実行する方法について説明します。

内容

groovyスクリプトを実行するためには、以下のライブラリをビルドパスに追加します。
・groovy-1.8.2.jar
・commons-cli-1.2.jar
・antlr-2.7.7.jar
・asm-3.2.jar

そして、以下のようにプログラムを作成すれば、groovyスクリプトを実行できます。
        // GroovyScriptエンジンを生成する
        GroovyScriptEngine engine = new GroovyScriptEngine(".");

        // スクリプトにパラメータをBindする
        Binding binding = new Binding();
        binding.setProperty("formula", dto);

        // スクリプトを実行する
        engine.run("test.groovy", binding);

上記の例では、カレントディレクトリにある「test.groovy」を実行しています。

[Java] Velocityを使用してファイルを作成する方法

概要

Velocityというテンプレートエンジンを使用して、ファイルを作成する方法について説明します。

内容

以下の手順でテンプレートエンジンからファイルを作成することができます。
1.テンプレートエンジンを初期化する
2.テンプレートに渡すパラメータを設定する
3.テンプレートのマージ結果をStringWriterに設定する

以下サンプルコードです。
private File createGroovyScript(FormulaDTO dto) throws Exception {

        File file = File.createTempFile("priceCalc", ".groovy", new File("."));

        // Velocityテンプレートエンジンを初期化する
        Velocity.init();

        // テンプレートに渡すパラメータを設定する
        VelocityContext context = new VelocityContext();
        context.put("formula", dto);

        // テンプレートのマージ結果をStringWriterに設定する
        StringWriter sw = new StringWriter();
        Template template = Velocity.getTemplate("/template/template_groovy.vm", "UTF-8");
        template.merge(context,sw);

        // 結果を一時ファイルに設定する
        FileWriter writer = new FileWriter(file);
        writer.write(sw.toString());
        writer.close();

        return file;
    }

template_groovy.vm
import jp.co.technos.common.dto.FormulaDTO;

def calculate(FormulaDTO data) {
    data.setResult(${formula.formula})
}

FormulaDTO data = (FormulaDTO) formula
calculate(data)