ushidayの日記

主に「IBMi」のメモに・・・

GroovyでExcelの操作その3

前回の「GroovyでExcelの操作その2」の記事で、nobusueさんに「Apache POIもあるよ」と、コメントを頂きました。
せっかく教えて頂いたので、こちらを参考に、POIで同じ事をやってみました。
■実行環境

  1. Groovy Version: 1.6.3
  2. JVM: 1.6.0_12
  3. PC OS: Windows XP SP3
  4. Apache POI: 3.2
  5. OS/400: V5R4M0
  6. JDBCドライバー:AS/400付属のjt400.jar

■インストール

  1. Apache POIをダウンロードします。
    • サイトを選んで、”release/bin/poi-bin-3.2-FINAL-20081019.zip ”から取得します
  2. poi-bin-3.2-FINAL-20081019.zipを解凍します。
  3. 解凍したディレクトリの”poi-3.2-FINAL-20081019.jar”と”poi-contrib-3.2-FINAL-20081019.jar”と”poi-scratchpad-3.2-FINAL-20081019.jar”「USER_HOME/.groovy/lib」にコピーします。
  4. jt400.jarは、前回と同じ「USER_HOME/.groovy/lib」のを使います。

■使ってみて
使ってみるとPOIの方が、やっぱりJavaな感じで(と言うかJavaその物か...)Cellから値を取得する時に、セルのタイプによって使い分ける”get〜CellValue()”メソッドが特徴的です。あとCellを扱う指標が、scriptomとは違い0からになります。scriptomは、Cellインデックスも1からですし、記述自体がVBA的な印象です。
自分は、JavaVBAどちらも得意ではないので、どっちも新鮮な感じがします。
VBAライクなscriptomは、マクロの記録で作成したVBAコードを使って、ドキュメントを読むのを少しサボることが出来きそうです。
POIは100%Javaなので、環境に左右されず使える...
つまり ”IBM i(※以下AS/400)” でも使える。やっぱり全てJavaで完結している方が良いかも。:-)

こうすれば、全てがAS/400上だけで解決する。定型業務でAS/400上のデータベースの情報を「どうしてもExcelで見たいよ」何て事を言うユーザーさんにはイイかも。また逆の下から上も出来ますし。
別にGroovyでなくて、Javaでも良いんですがぁ...(-_-;)ゞ。そこはあえて触れず。

/* マスター作成 
*/

import groovy.sql.Sql
import org.apache.poi.hssf.usermodel.*
import org.apache.poi.poifs.filesystem.POIFSFileSystem

/**
* データ追加処理
**/
def addTable = { def params ->
	driverClassName = "com.ibm.as400.access.AS400JDBCDriver"
	username = "USHIDA"
	password = "********"
	url = "jdbc:as400://192.168.x.xxx/GRAILSTEST"

	sql = Sql.newInstance(url, username,
	                     password, driverClassName)
	//レコード追加 
	def code = params.code
	def kana = params.kana
	def name = params.name
	def hireDate = params.hireDate

	def stmt

	stmt = "insert into EMPLOYEE" 
	stmt += " (CODE"
	stmt += " ,KANA"
	stmt += " ,NAME"
	stmt += " ,HIREDATE)"
	stmt += " values (${code},'${kana}','${name}',${hireDate})"
	println stmt
	sql.execute(stmt)
}

/**
* Excel操作
**/
String fileName = new File(".").getAbsoluteFile().getParent() + "/社員一覧.xls"
File file = new File(fileName)
FileInputStream input = null
BufferedInputStream binput = null
POIFSFileSystem poifs = null

try {
	// ファイル読み込み
	input = new FileInputStream(file)
	binput = new BufferedInputStream(input)
	poifs = new POIFSFileSystem(binput)
	HSSFWorkbook workbook = new HSSFWorkbook(poifs)		//ブック 
	HSSFSheet sheet = workbook.getSheet("Sheet1")		//シート 
	// 最大行 
	int rowMax = sheet.getLastRowNum() -1
	// DB2へ追加
	def params = [:]
	for(ix in 3..rowMax){
		HSSFRow row = sheet.getRow(ix)
		if (row == null) continue
		params.code = row.getCell(1).getNumericCellValue() as int
		params.kana = row.getCell(2).getRichStringCellValue().getString()
		params.name = row.getCell(3).getRichStringCellValue().getString()
		params.hireDate = new java.text.SimpleDateFormat("yyyyMMdd").format( row.getCell(4).getDateCellValue())
		println params
		addTable(params)

	}
} catch (FileNotFoundException e) {
	e.printStackTrace()
} catch (IOException e) {
	e.printStackTrace()
} finally {
	try {
		binput.close()
	} catch (IOException e) {
		e.printStackTrace()
	}
}