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が受け取ってくれないので、ひと工夫が必要になります。