PowerShellでExcelへ値を格納できます。
ただ、セルに普通に文字列を格納するサンプルはあちこちでよく見かけるのですが、手元で実行してみるとエラーになったり、数式や関数はどうやるんだ?というこということが多々あったので自ら試してみました。
仕様
下記のようなExcelファイルを用意して、PowerShellから様々な値を格納してみます。
- 編集先Excelファイルの格納先:C:\temp\powershell
- ファイル名:Book1.xlsx
- シート名:Sheet1
※要は初期値のExcelファイルをCドライブに近いフォルダに置いた状態です。
ソースコード
ソースコードを以下に示します。
Excelへの様々な値入力を実行しています。
ただし、エラー処理は本筋とは異なるため、このソースコード内では省略しています。
writeExcel.ps1
$excel = New-Object -ComObject Excel.Application
$book = $null
$excel.Visible = $false
$excel.DisplayAlerts = $false
$currentPath = "C:\temp\powershell\Book1.xlsx"
$book = $excel.Workbooks.Open($currentPath)
$sheet = $book.Sheets("Sheet1") # シート名で操作
#$sheet = $book.Sheets(1) # インデックスも可能
# 文字列入力
$cell = $sheet.Cells.Item(1, 1) # Cells(行・列番号)版
$cell.Value = "aaa"
$range = $sheet.Range("A2") # Range版
$range.Value = "bbbb"
#数字入力
$range = $sheet.Range("A3") #入力1
$range.Value = 10
$range = $sheet.Range("B3") #入力2
$range.Value = 8
# 数式入力
$range = $sheet.Range("C3")
$range.Formula = "=A3 + B3"
# 関数入力
$range = $sheet.Range("A4") # 入力1
$range.Value = 2
$range = $sheet.Range("B4") # 入力2
$range.Value = 3
$range = $sheet.Range("C4") # 入力3
$range.Value = 7
$range = $sheet.Range("D4")
$range.Formula = "=AVERAGE(A4:C4)" # 関数
# セル結合した個所への値入力
$sheet.Range("A5:C5").MergeCells = $true # セル結合
$range = $sheet.Range("A5")
$range.Value = "結合セル" #普通に格納できます。
# 複数セル同時入力
$range = $sheet.Range("A6:H7")
$range.Value = "複数"
[void]$book.Save()
[void]$book.Close($false)
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($book)
[void]$excel.Quit()
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
また、ソースコードで試みている各パターンを、ソースコードから抜き出して以下に説明します。
これだけのパターンが動作確認できれば、PowerShellでのExcelファイルへの入力に関しては、困らないかと思います。
文字列
文字列をダブルクォートで囲み、セルへ入力します。
文字列の入力(Cells)
$cell = $sheet.Cells.Item(1, 1)
$cell.Value = "aaa"
文字列の入力(Range)
$range = $sheet.Range("A2")
$range.Value = "bbbb"
以降はRangeのみ記述しますが、Cellsで記述しても同じです。
数字
そのまま数字をセルへ入力しています。
$range = $sheet.Range("A3")
$range.Value = 10
$range = $sheet.Range("B3")
$range.Value = 8
数式
先頭にイコールを付加して、数式をセルへ入力しています。
先頭にイコールを付加しないとただの文字列になってしまいます。
$range = $sheet.Range("C3")
$range.Formula = "=A3 + B3"
関数
関数をセルへ入力しています。
こちらも数式と同様で、先頭にイコールを入力を付加することに注意です。
$range = $sheet.Range("D4")
$range.Formula = "=AVERAGE(A4:C4)"
セル結合の箇所
特別な操作は不要で、結合セルの最初のセルに格納でよいです。
$range = $sheet.Range("A5")
$range.Value = "結合セル"
複数セル同時入力
複数セルにまとめて入力します。
$range = $sheet.Range("A6:H7")
$range.Value = "複数"
テスト実行
下記の通りps1ファイルとしてソースコードを保存しておきます。
それから右クリックメニューで「PowerShellで実行」をします。
実行すると、各値が下記の通り格納されていることが確認できました。
C3のセルには「=A3+B3」の計算式が格納されており、計算結果が表示されていることが確認できました。
また、D4セルには「=AVERAGE(A4:C4)」の関数によって、A4セルからC4セルの平均値が表示されています。
結合セルも値が格納され、複数セルに「複数」の文字列が一括で格納されています。
参考情報
環境
下記の環境で実行しております。
No. | 環境 | バージョン |
---|---|---|
1 | OS | Windows10 |
2 | PowerShell | 5.1 |
以上です。