Groovyでテーブルのデータを取得したい(3)

今回は、テーブルのデータを取得してExcelに書き出すサンプルです。
このサンプルを使用するには、WindowsInstaller版のGroovyが必要になります。
そうでないバージョンを使用している場合は、個別にScriptomをインストール&設定が必要です。
わたしはWindowsInstaller版でない方を使用していましたが、WindowsInstaller版に乗り換えました。

import java.text.SimpleDateFormat
import org.codehaus.groovy.scriptom.ActiveXObject
def sql = groovy.sql.Sql.newInstance('jdbc:oracle:thin:@localhost:1521:ORCL','userid','password','oracle.jdbc.driver.OracleDriver')
def xlApp = new ActiveXObject('Excel.Application')
def username = "aoyagi"
def workbook = xlApp.workbooks.Add
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
sql.eachRow("SELECT table_name FROM user_tables WHERE table_name LIKE 'BIZ_AB_%'"){ rs->
    def rows = sql.rows("SELECT * FROM " + rs.table_name +" WHERE create_user_cd ='" + username + "'")
    if( rows.size() > 0 ){
        def worksheet = workbook.worksheets.Add
        worksheet.name = rs.table_name
        def(long rowNumber, long colNumber) = [1,1]  // Groovy 1.6より可能な変数宣言と初期化
        for(r in rows){
            r["CREATE_DATE"] = sdf.format(r["CREATE_DATE"].dateValue())
            r["RECORD_DATE"] = sdf.format(r["RECORD_DATE"].dateValue())
            if(1==rowNumber){
                r.each{ worksheet.Cells(rowNumber,colNumber++).value = it.key }
                rowNumber++
            }
            colNumber = 1
            r.each{ worksheet.Cells(rowNumber,colNumber++).value = it.value }
            rowNumber++
        }
    }
}
xlApp.visible = true

CSVファイルに書き出す方式と比べて、それほどにコードが膨らんでません。
「コードが短くて済むがGroovyの良さ」という訳ではありませんけど。


Excelのワークシートに書き出す部分で、VBAのようにworksheet.cells(i,j)を使用するところが気に入らないのですが、なんとか方法はないものか。。。
イメージ的にはWorksheet.Rangeに配列(ListやMap)を渡すような方法で書き込めれば、気持ちいいのですが。
少し調べてみると、SafeArrayを利用すると出来るようでした。

SafeArray safeArray = new SafeArray(org.codehaus.groovy.scriptom.SafeArray.VARIANT)
safeArray = ["a","b","c"].toArray()
worksheet.Range("A1:C1").Value = safeArray


ただ、配列型でないとSafeArrayが受け取ってくれないので、ひと工夫が必要になります。