Excelで作成した表のデータを、けっこう複雑に処理する場合には(特に複数ブック使う場合)、いったんCSVファイルとして保存して、PowerShellでプログラミングすると楽だった、というメモ。自分、マクロとか使えないので。てか、CSVなら、PowerShellでしょう。ちなみに、PowerShellで、直接Excelをいじくることもできるようだが、APIがよくわからないので、やめた(へたれ)。
で、次のコードみたいにすると、そこそこ自動化できる。ま、ExcelファイルをCSV形式で保存するのは、手動で行えばよいのだが。
[string] $global:TOOL_HOME = ( Convert-Path (Join-Path $MyInvocation.MyCommand.Definition ..)) Function local:__xls_save_as_csv([string] $__xls_file_name) <# .SYNOPSIS ExcelファイルをCSVファイルとして保存する .DESCRIPTION スクリプトと同一ディレクトリに存在するExcelファイルを読み込み、 各シートを、CSVファイルとして保存する。 .PARAMETER __xls_file_name Excelファイルのファイル名 #> { # アプリケーションオブジェクトを作成する。 $__xls = New-Object -ComObject Excel.Application $__xls.visible = $false # ブックをオープンする。 $__book = $__xls.Workbooks.Open( (Join-Path $TOOL_HOME $__xls_file_name), 0, $True) # シートを、次のファイル名のCSVファイルとして保存する。 # <Excelのファイル名(拡張子を除く)>_<シート名>.csv foreach ($__sheet in $__book.sheets){ $__csv_file_name = $__xls_file_name.TrimEnd(".xls") ` + "_" ` + $__sheet.name ` + ".csv" $__book.Worksheets.Item($__sheet.name).SaveAs( (Join-Path $TOOL_HOME ($__csv_file_name)), 6) } $__book.Close(); Remove-Variable __book, __sheet $__xls.Quit() Remove-Variable __xls [GC]::Collect() } # # main # __xls_save_as_csv("target.xls") # CSVファイルを読み込み(タイトル行を除く)、オブジェクトに変換する。 # オブジェクトを、カラム1、カラム2の昇順にソートする。 $__csv_file = (Get-Content -Path (Join-Path $TOOL_HOME "target_Sheet1.csv")) $csv_objects = $__csv_file[1..$__csv_file.Length] ` | ConvertFrom-Csv ` | Sort-Object -property "カラム1", "カラム2" foreach ($__rec in $csv_objects) { # TODO ここに処理を記述する。 $__rec.カラム1 + $__rec.カラム2 + $__rec.カラム3 }
しかし、コードがハイライトされていないって、読みにくいなぁ。。はてな記法の「スーパーpre記法」は、PowerShellに対応していないようで。