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初心者の方への解説ポイントを箇条書きにするとざっくり以下の通りです

  1. 文字列の結合によるパスの生成にはJoin-Pathを使います

    \が抜けたり2重になったりしてバグる心配がなくなります

  2. Test-Pathでファイルの存在確認をしています

    ちなみに-IsValidパラメータを付けると、ファイルの存在有無とは関係なく、パスとして構文が正しいかどうかを確認できるようになるので、これからファイルを作成するパスの文字列が正しいかどうかを確認するのに使えます

  3. Coyp-Itemでファイルをコピーしています

    サンプルコードではFileSystemのItemを扱っているのでファイルやフォルダが対象になっていますが、Coyp-Itemレジストリーを対象にすればレジストリーキーをコピーすることもできるコマンドレットです

  4. テンプレートファイルなので読み取り専用のプロパティが付いている (かもしれない) と言う事でSet-ItemPropertyでプロパティの変更をしています

    Set-ItemPropertyの扱うItemもCoyp-Itemと同じくFileSystemに限定されません

  5. New-Object -ComObject Excel.ApplicationExcelオブジェクトのインスタンスを作ります

    ここから先は他の言語でExcelを操作するのと同じです

PowerShellのサンプルコードの癖にパイプが1本も出てきませんが、とりあえずこんな事がこんな風にできるよと言う事で、一つ


ちなみにPowerShellを本で勉強したい人はちょっと古い本になりますが【改訂新版】 Windows PowerShell ポケットリファレンスがお勧めです

今やVersion3.0対応と言うのはかなり古いのですが (現時点の最新は5.1)、基礎はこれで学べます (と言うか、私はこれで学びました)

【改訂新版】 Windows PowerShell ポケットリファレンス

【改訂新版】 Windows PowerShell ポケットリファレンス