ExcelをCSVにしてからいじる

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に対応していないようで。