ExcelHelper(scriptom)を利用してExcelファイルの更新をする
Win32OLEよろしく,"workbook.Save()
"とするのかと思ったら違ってた。
ExcelHelperにちょっとした仕掛けがしてあって,このクラス,指定したExcelファイルを一時ファイルにコピーしてから操作する作りになってる。なんで,
new ExcelHelper().process(new File('test.xls')) { workbook -> workbook.Save() }
としても,'test.xls
'が保存されるんじゃなくて,ExcelHelperが勝手に作った一時ファイルを保存することになる。
さらに間の悪いことに,ExcelHelper.process()
は最後に一時ファイルを消しちゃうのだ。
結局,どうすればいいかと言えば,こうする。
new ExcelHelper().create(new File('test.xls'), new File('test.xls')) { workbook -> def worksheet = workbook.Sheets(1) worksheet.Cells(1,1).Value = 'hoge hoge' }
workbook.Save()
とかしない。ExcelHelper.create()
は,処理の最後に第一引数で指定されたExcelファイル*1を保存し,第二引数のファイルにコピーするので,ご覧の通り保存については,なんもしなくていい。
ちなみに,前述のExcelHelper.process()
の実装は,こうなってる。
void process(File inputXL, Closure closure) { create(inputXL, null, closure) }
第一,第二引数に同じ値を与えるのがイケてないと思うので,こんなの作りたくなるのが人情ってモンよ。
ExcelHelper.metaClass.update = {
File updateXls, Closure closure ->
delegate.create(updateXls, updateXls, closure)
}
しかし,こんな具合に俺様API作りまくるってのはどうなんだろ?
ある種,スクリプト言語の醍醐味なんだけど,不吉な臭いも醸すんだよねぇ。:-(
*1:正しくは,それをコピーした一時ファイル