PowerShell で Excel 操作するのは簡単じゃないんだね
以下のような COM 経由で Excel 操作するときって、簡単にできないんですね~、残念。
っていうのは、Excel 2019 なんですけど、関連変数全て!に対して、ReleaseComObject()
しないとプロセスが解放されないとか、、、Excel の値を読みたいだけなのにプロセス周りとか面倒見たくないよダンカン!;つД`)っていうのと、書いたら書いたで、①すぐにプロセス解放される場合と、②されない場合と、③1分くらい徐々に使用メモリが減っていってから消えた場合とで、3パターン見せてくれました。解放命令書いたのに②と③て・・・もうダンカン!
命令が信用できないので、ちょっと PowerShell + COM&Excel は(自分的には)そっとしておこうかな~なんて思ったりしました。
集計.xlsx
A | B |
---|---|
1 | 4 |
2 | 5 |
3 | 6 |
test.ps1
using namespace System.IO using namespace System.Text using namespace System.Runtime.InteropServices # 現在のディレクトリ $currentDirectory = Split-Path $MyInvocation.MyCommand.Path #$file = $args[0] $file = [Path]::Combine($currentDirectory, "集計.xlsx") $excel = New-Object Object $book = New-Object Object $sheet = New-Object Object try { $excel = New-Object -ComObject Excel.Application $excel.Visible = $False $book = $excel.Workbooks.Open($file) $sheet = $book.Worksheets.Item(1) $line = 1 Write-Host $sheet.Cells.Item($line, 1).Text $line++ Write-Host $sheet.Cells.Item($line, 1).Text $line++ Write-Host $sheet.Cells.Item($line, 1).Text $line = 1 Write-Host $sheet.Cells.Item($line, 2).Text $line++ Write-Host $sheet.Cells.Item($line, 2).Text $line++ Write-Host $sheet.Cells.Item($line, 2).Text } finally { $excel.Quit() [Marshal]::ReleaseComObject($sheet) [Marshal]::ReleaseComObject($book) [Marshal]::FinalReleaseComObject($excel) }
出力結果
1 2 3 4 5 6 0 0 0
[Marshal]::ReleaseComObject($sheet) | Out-Null
って書けば、6の次の0の3つは出なくなりますね、確か。やはり NuGet で OSS な Excel ライブラリに頼るしかない系です。もしくはもう VBA で Excel 操作した方が楽かもしれないorz。本当は Excel を開いて Excel に転記してを繰り返したかったのですが、いやはやなかなか難しいです候。