ScriptomでExcelに画像を貼付ける -その2-

ちょっとだけ実用的にしてみた。とあるディレクトリ(c:\temp)にある、template.xlsというExcelブックをひな形にして、さらにその中のtemplateシートをひな形にして(ややこしいな)、そのシートのB:3位置にそのディレクトリにあるPNGファイルを75%のサイズで貼付ける。
画像1枚貼付けるごとにシートを替えるので、貼付けた画像分だけシートができる(シートの数って最大いくつ?)。最後に、result.xlsって名前で保存しておしまい。

import org.codehaus.groovy.scriptom.*
import org.codehaus.groovy.scriptom.tlb.office.*
import org.codehaus.groovy.scriptom.tlb.office.excel.*

Scriptom.inApartment {
  def dir = new File("c:/temp")
  def xlApp = new ActiveXObject('Excel.Application')
  xlApp.with {
    visible = false
    displayAlerts = false
    automationSecurity = MsoAutomationSecurity.msoAutomationSecurityForceDisable
    alertBeforeOverwriting = false
    askToUpdateLinks = false
    featureInstall = MsoFeatureInstall.msoFeatureInstallNone
  }

  def workbook = xlApp.workbooks.open("${dir.path}/template.xls")
  def anchor = workbook.sheets(1)

  def idx = 1
  dir.eachFileMatch(~/.*\.png$/) { image ->
    workbook.worksheets("template").copy(anchor)
    workbook.worksheets("template (2)").with {
      name = "新しいシート_${idx++}"
      range("B3").select()
      pictures.insert(image.path).shapeRange.with {
        select()
        scaleWidth(0.75, MsoTriState.msoTrue, MsoScaleFrom.msoScaleFromTopLeft)
        scaleHeight(0.75, MsoTriState.msoTrue, MsoScaleFrom.msoScaleFromTopLeft)
      }
    }
  }
  workbook.saveAs("${dir.path}/result.xls")
  workbook.close()
  xlApp.visible = true
  xlApp.quit()
}


あとは、用途に応じて書換えればいいか。それはそうと、ExcelHelper版作ってみたらExcelのプロセスが大量に残ってエラい目にあった。先のスクリプトでは、最後にExcelを可視化して手動でExcelを終了させてんだけど、もっとスマートなやり方はないものか...。
#ActiveXObject.safeRelease()なんて、それっぽいAPIはあるんだけどね。


(追記) xlApp.quit()で死んでくれた。行儀良くするなら、try-catch-finallyで囲ってfinallyでやるべきなんだろな。