【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をループしてカウンタをゼロにする方法もあります。

コード全体はこちらを御覧ください

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です