【Powershell】xlsxからcsvへの変換を自動化する
はじめに
Powershellを利用してxlsxファイルをcsvとして抽出するパワープレイをしたのでその時の内容を備忘録程度にまとめておこうかと思います。なお、自動化するとは言ったものの、PowershellからExcelへ接続しているため、Excelがインストールされている必要があります。
環境
- Windows10 Home(Build 1903)
- Powershell 5.1
- Microsoft Excel (Build 12827.20336)
実装
Excelのハンドル取得
Excelを操作するためにまずはハンドルを取得します。
$excel = New-Object -ComObject Excel.Application
Bookのオープン
そしたら、Excelブックを開きます。
$excel.Workbooks.Open("something_excel_book.xlsx")
CSVとして保存
そしたら各シートをcsvとして保存していきます。
for($i = 0;$i -lt $excel.Worksheets.Count; $i++){ $sheet = $excel.Worksheets.Item($($i+1)) $sheet.SaveAs($sheet.Name + ".csv", [Microsoft.Office.Interop.Excel.XlFileFormat]::xlCSV) [void][System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($sheet) }
ここでは、シート数をインデックスとしてループ処理を行っています。また念の為、ループごとにオブジェクトの解放処理を行っています。
Excelの解放
すべての処理を終えたらリソースを解放してあげます。
$excel.Workbooks.Close() $excel.Quit() [void][System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($excel) [void][System.GC]::Collect()
ここでもReleaseComObject
を用いていますが、最終的にGCを明示的に呼び出しているのでもしかしたら必要ないかもしれません。FinalReleaseComObject
に変更しました.両者の違いは、参照カウンタをデクリメントするのか一気にゼロにするのかの違いのようです。参照カウンタが残ったままではExcelのプロセスはゾンビのように存在してしまうので、FinalReleaseComObject
でカウンタを一気にゼロにしちゃいます。なお、ReleaseComObject
をループしてカウンタをゼロにする方法もあります。
コード全体はこちらを御覧ください
最近のコメント