PowerShell で Excle オートメーションの足場

PowerShell で Excle 操作する場合の足場は以下のようになる。

Set-Location (Split-Path $MyInvocation.MyCommand.Path -parent)

$book = $null
$excel = $null
try {

    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false
    $excel.DisplayAlerts = $false
    $excel.ScreenUpdating = $false
    $excel.EnableEvents = $false

    $wb = $excel.Workbooks.Add()
    $sheet = $wb.Sheets(1)

    $sheet.Name = "example"
    $sheet.Cells.Item(1, 1) = 2
    $sheet.Cells.Item(1, 2) = 6

    $wb.SaveAs("$(Get-Location)/example.xlsx")

} catch {

    Write-Host "Error" -ForegroundColor Red
    Write-Output $_

} finally {

    if ($null -ne $wb) {
        $wb.Close($false)
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb) | Out-Null
    }

    if ($null -ne $excel) {
        $excel.Quit()
        [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null
        [gc]::Collect()
        [gc]::WaitForPendingFinalizers()
        Remove-Variable excel -ErrorAction SilentlyContinue
    }
}

最初に Excel を起動して設定。

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$excel.DisplayAlerts = $false
$excel.ScreenUpdating = $false
$excel.EnableEvents = $false
  • excel.Visible でExcelを非表示
  • excel.DisplayAlerts でメッセージを非表示(上書き確認ダイアログなど抑止。注意して使う必要)
  • excel.ScreenUpdating で画面描画停止
  • excel.EnableEvents でイベント停止(マクロの自動実行など)

ワークブック追加してシート選択。

$wb = $excel.Workbooks.Add()
$sheet = $wb.Sheets(1)
$sheet.Name = "example"

あとはセルに対して操作して以下のようにしてワークブックを保存。

$wb.SaveAs("$(Get-Location)/example.xlsx")

そのままだと、Excel のプロセスが残るので finally で後処理。


スクリプトに日本語などを含む場合は、UTF-8 の BOM 付きで保存する。BOM無しだと、実行環境によって文字化けしたりしなかったりする。