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無しだと、実行環境によって文字化けしたりしなかったりする。