先日、Excel MVPの伊藤さんがPowerShellからExcelファイルを上書き保存する方法について、ブログで記事を書かれていました。
この記事でも触れられていますが、.NETからExcelを扱う場合(Microsoft.Office.Interop.Excel)には、参照したCOMオブジェクトの解放(ReleaseComObject)漏れがあるとプロセスが残り続ける問題があり、上手く処理するためには面倒な後片付けが必要になります。
(この問題については、Qiitaにあるこちらの記事の解説が分かりやすかったです。)
これに対する一つの解決策として「NetOffice」があり、当ブログでも紹介(下記リンク参照)したことがあるのですが、今回はこのライブラリーをPowerShellから使ってみたいと思います。
下準備
まずはNetOfficeをダウンロードするのですが、Codeplexからダウンロードすることもできるのですが、Excel単品の場合はNuGetからダウンロードした方がお手軽です。
nuget install NetOffice.Excel
NetOfficeでExcelを操作するコード
NetOfficeの準備ができたら、いよいよPowerShellでコードを書いていきます。
[void][Reflection.Assembly]::LoadFile("C:\System\NetOffice\NetOffice.dll") [void][Reflection.Assembly]::LoadFile("C:\System\NetOffice\OfficeApi.dll") [void][Reflection.Assembly]::LoadFile("C:\System\NetOffice\ExcelApi.dll") [void][Reflection.Assembly]::LoadFile("C:\System\NetOffice\VBIDEApi.dll") $xls = New-Object NetOffice.ExcelApi.Application $xls.Visible = $true $wb = $xls.Workbooks.Open("C:\Test\Sample.xlsx") $wb.Worksheets[1].Range("A1").Value = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss") $wb.Save() Start-Sleep -s 10 #この間にタスクマネージャーでプロセス監視 $wb.Close() $xls.Quit() $xls.Dispose()
ブックを開いてセルに日付・時刻を書き込む処理ですが、実にシンプルです。
面倒な後片付けはDisposeメソッドでNetOffice側がやってくれている(たぶんそのはず)ので、自分で処理を書く必要はありません。
おわりに
この記事によるとNetOfficeでも解放漏れが発生するらしいですが、それでも楽にコードを書ける点は魅力的です。
しかもNetOfficeの場合は、Excelに限らずWordやPowerPoint、OutlookやAccessにまで対応しているので、活用できる場面は多いだろうと思います。
もちろん、事前に各Officeアプリケーションがインストールされていることが必須になってしまいますが、非常に便利なライブラリーなので興味がある方は是非触ってみてください。
WordやPowerPointを操作するコードについても記事を書きました。
この記事へのコメントはありません。