Windows PowerShellでExcelファイルを編集する
最近PowerShell推しの木俣です
今回はもう少し具体的にこんな便利なことが出来ると言う例として日報のExcleファイルを自分のMyDocument配下に所定の名前でコピーして日付欄と名前欄を更新すると言う、別に毎回手でやっても大した作業ではないけれど地味に面倒な作業をWindows PowerShellで書いてみます
あくまでサンプルなので「日報がExcelファイルってどうなのよ」というご意見には耳をふさぎます
「Excelファイル弄るならVBAでいいじゃん」という意見にはセキュリティ上xlsmが使えないという設定と言う事にしますし「セキュリティ上の理由ならVBAにデジタル署名すべき」と言う意見は聞こえないことにします
なお、この記事はWindows PowerShellでこんな便利なことが出来るよ、という例の提示が主目的で、PowerShellの文法などについては説明しませんので、PowerShellそのものについての勉強は各自で教本を買うなり、別なweb siteを読むなりしてください
で、上記の日報のExcelファイルをコピー、更新するサンプルコードですが、例えばこんな感じに書けます
# コピー元のテンプレートのパス [String] $TempleFilePath = '\\nas\Template\日報テンプレート.xlsx'; # コピー先パス [String] $NewFilePath = Join-Path -Path ([Environment]::GetFolderPath('MyDocument')) -ChildPath ([DateTime]::Now.ToString('yyyyMMdd') + '_日報.xlsx'); # コピー先パスの存在確認 If(Test-Path -Path $NewFilePath){ Write-Host "$NewFilePath が既に存在します。" -ForegroundColor Red -BackgroundColor Black; Exit; } # ファイルのコピーと、読み取り専用属性を無効に設定 Copy-Item -Path $TempleFilePath -Destination $NewFilePath; Set-ItemProperty -Path $NewFilePath -Name IsReadOnly -Value $false; # Excelオブジェクトの作成と操作 Try{ [__ComObject] $Excel = New-Object -ComObject Excel.Application; Try{ [MarshalByRefObject] $Book = $Excel.Workbooks.Open($NewFilePath); [String] $SheetName = '日報'; [String] $UserName = '木俣 ロバート久' # B1セルに日付を設定 $Book.Worksheets.Item($SheetName).Cells.Item(1,2) = [DateTime]::Now.ToString('yyyy/MM/dd'); # D1セルに名前を設定 $Book.Worksheets.Item($SheetName).Cells.Item(1,4) = $UserName; }Finally{ $Book.Close($true); } }Finally{ $Excel.Quit(); } Exit;
PowerShellの文法については説明しませんが、その上でPowerShell初心者の方への解説ポイントを箇条書きにするとざっくり以下の通りです
文字列の結合によるパスの生成には
Join-Path
を使います\
が抜けたり2重になったりしてバグる心配がなくなりますTest-Path
でファイルの存在確認をしていますちなみに
-IsValid
パラメータを付けると、ファイルの存在有無とは関係なく、パスとして構文が正しいかどうかを確認できるようになるので、これからファイルを作成するパスの文字列が正しいかどうかを確認するのに使えますCoyp-Item
でファイルをコピーしていますサンプルコードではFileSystemのItemを扱っているのでファイルやフォルダが対象になっていますが、
Coyp-Item
はレジストリーを対象にすればレジストリーキーをコピーすることもできるコマンドレットですテンプレートファイルなので読み取り専用のプロパティが付いている (かもしれない) と言う事で
Set-ItemProperty
でプロパティの変更をしていますSet-ItemProperty
の扱うItemもCoyp-Item
と同じくFileSystemに限定されませんNew-Object -ComObject Excel.Application
でExcelオブジェクトのインスタンスを作りますここから先は他の言語でExcelを操作するのと同じです
PowerShellのサンプルコードの癖にパイプが1本も出てきませんが、とりあえずこんな事がこんな風にできるよと言う事で、一つ
ちなみにPowerShellを本で勉強したい人はちょっと古い本になりますが【改訂新版】 Windows PowerShell ポケットリファレンスがお勧めです
今やVersion3.0対応と言うのはかなり古いのですが (現時点の最新は5.1)、基礎はこれで学べます (と言うか、私はこれで学びました)
【改訂新版】 Windows PowerShell ポケットリファレンス
- 作者: 牟田口大介
- 出版社/メーカー: 技術評論社
- 発売日: 2013/02/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る