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:正しくは,それをコピーした一時ファイル