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でやるべきなんだろな。