COMオブジェクトを使ってPowerShellでExcelを操作する。

とりあえず、Excelを開いてみる。以下のスクリプトを実行する。

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true

COMオブジェクトの Excel.ApplicationNew-Objectコマンドレット でインスタンス化。

COMオブジェクトは -ComObjectオプション で指定する。

2つ目のコード行で、Visibleプロパティ$true に設定して起動したExcelが見えるようにしている。

操作中のExcelを隠しておいてもいい場合は、この設定は不要。スクリプトの実行テストなどで、動作を確認するためには見えるようにした方が便利。

続けて、以下のコードで、ワークブックを作成する

$book = $excel.Workbooks.Add()

WorkbooksプロパティAddメソッド でワークブックを新規作成。

Excelを開いて、ファイルメニューから新規ワークブックを作成したときと同じような動作となる。これで、Book1のような空のExcelブックが表示される。戻り値が作成したワークブックオブジェクトになる。後でブックを保存するときにこのオブジェクトを使う。

既存のブックを開きたいときは、以下のようにする。

$book = $excel.Workbooks.Open("C:\Test1.xls")

Openメソッド にファイルのフルパスを指定。

続けて、以下のコードで、編集用にシートのオブジェクトを取り出す

$sheet = $excel.Worksheets.Item(1)

Worksheetsプロパティ からシートのコレクションにアクセスできる。ブックの中の複数シートの1つを取り出すにはインデックスを指定する必要があるが、配列のようにアクセスすることはできない。その代わり、Itemプロパティを使ってインデックス指定ができる。インデックスは1から始まるので、1つ目のシートを取り出すには1を指定する。

下記のように、インデックスの代わりにシート名を指定してシートを取得することもできる。

$sheet = $excel.Worksheets.Item("Sheet1")

続けて、以下のコードで、シートのセルに文字列を入力できる

$sheet.Cells.Item(2,3) = "PowerShellで作成"

シートの Cellsプロパティ から特定のセルにアクセスできる。Cellsプロパティ から特定のセルにアクセスする場合も、Itemプロパティ を使って、行と列のインデックスを指定する。形式はItem(行, 列)。インデックスの番号は1から始まる。上記はC2セルを指定している。

逆に、セルの内容をテキストとして取得したい場合は、下記のようにする。

$text1 = $sheet.Cells.Item(2,3).Text

セルの文字列に参照するには Textプロパティ を使う必要がある。Itemプロパティ で取得できるのはセルのオブジェクトのため、文字列だけを取得できない。

続けて、以下のコードで、ブックを名前を付けて保存

$book.SaveAs("C:\Test2.xls")

ワークブックの SaveAsメソッド で名前を付けて保存する。引数にファイルのフルパスを指定する。

既存のファイルの場合に、ブックを上書保存したいときSaveメソッド を実行する。

$book.Save()

Excelを閉じるには、以下のコードを実行する。

$excel.Quit()

画面に表示されているExcelを手で閉じるのと同じ。

ファイルが編集中でまだ保存していないなどの場合は、普通に閉じるボタンを押した時と同様に確認ダイアログが出る。そのため、このコードで必ずファイルを閉じることができるとは限らない。ここで確認ダイアログがでないように、注意してスクリプトを作成する必要がある。

スクリプト

Excelファイルを新規作成

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$book = $excel.Workbooks.Add()
$sheet = $excel.Worksheets.Item(1)
$sheet.Cells.Item(2,3) = "PowerShellで作成"
$book.SaveAs("C:\Test2.xls")
$excel.Quit()

既存のExcelファイルを編集

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$book = $excel.Workbooks.Open("C:\Test1.xls")
$sheet = $excel.Worksheets.Item(1)
$sheet.Cells.Item(2,3) = "PowerShellで編集"
$book.Save()
$excel.Quit()

参照

TechNet | スクリプトセンター | Windows PowerShell を使用して Microsoft Excel を自動化する方法はありますか