PowerShellでExcelPackagePlusを使う
PowerShellでxlsxファイルを扱うに当たり、Microsoft製のClosedXmlを使ってみました。
ところがClosedXMLはPasswordをかけることはできても開くことはできないという情報をみつけました。
How to open a protected Excel File with ClosedXML?(答えは「開けない」)
https://stackoverflow.com/questions/54874591/how-to-open-a-protected-excel-file-with-
closedxml
ClosedXMLに進むのをやめてPassword付きファイルが開けるExcelPackagePlusを試してみることにしました。
ClosedXMLの情報を求めてここに来てしまった方はこちらをご覧ください
目次
ライブラリの入手
基本的にはNugetから入手すればいいと思います。コマンドラインがNuget Galleryの上の方に書かれています。
EPPlus -Nuget Gallery
例えばこんな感じ
1 |
Install-Package EPPlus -Version 5.1.0 |
Install-Packageを使ってもいいんですが「proxyを通じて社外アクセスしてる環境ではコケる」ことが多々あります。Powershell5.1以降であればProxyの内側からインストールできます。-Proxyおよび-ProxyCredentialオプションが使えます。詳しくは下記Qiita記事を参照してください。6とありますが、5.1でも使えます
PowerShell 6にプロキシ経由でモジュールインストール
nugetのサイトからライブラリを直接ダウンロードする。
Nuget Galleryの右の方に「Download package」と書かれています。これをダウンロードするとWebから直接ダウンロードできます。2020年4月現在の安定最新版は5.1.0なので、「epplus.5.1.0.nupkg」というファイルで落ちてきます。この拡張子をzipに変えて展開してください。Windows環境で動かすには依存関係がないのでこっちの方が楽だと思います。
EPPlusの使用
ライブラリのロード
依存性がなく単体で動くので、Add-Typeするだけで動きます。かんたん。
1 |
Add-Type -Path [保存したパス]¥EPPlus.dll |
Excelファイル操作
interopとの差分でお送りしますw
interopは動いているExcelのオブジェクト操作、EPPlusはxlsxというXMLファイルの操作という違いがわかればそんなに難しくありません。
xlsxファイルはMicrosoftが策定したXML規格ファイルをzip圧縮したものです。拡張子を.zipに変えて展開するとXMLファイルが出てきます。
InteropはMicrosoftがアプリケーション間通信を通じてWindows内の他のアプリケーションを操作する機構を通じて操作しています。わからないことがあったらVBAで検索して文法変えれば実装できるのが強みですが、対話ログオンしかサポートされていません。
上段がinterop,下段がEPPlusです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#操作するオブジェクトを作る $Excel = New-Object -ComObject Excel.Application;$Book = $Excel.Workbooks.Open($FilePath) $Excel = New-Object OfficeOpenXml.ExcelPackage -ArgumentList $FilePath #Sheet名を指定してSheetオブジェクトを作る $Sheet = $Excel.Sheets.Item($DataSheetName) $Sheet = $Excel.Workbook.Worksheets[$DataSheetName] #InteropのUsedRange(使用範囲)はDimensionが相当します。 $EndRow=$Sheet.UsedRange.Rows.Count $EndCol=$Sheet.UsedRange.Columns.Count ↓ $EndRow=$Sheet.Dimension.End.Row $EndCol=$Sheet.Dimension.End.Column #使われている範囲の行数をとる $Sheet.UsedRange.Rows.Count $Sheet.Dimension.Rows #指定したセルの値を取得する。Interopは代入される変数がテキストや数値だったら暗黙的にデータを取得しますが、EPPlusは.valueを明示的に指定しないと取れませんでした。(xmlで行・列指定されたものだからっぽい) $Sheet.Cells.Item($Row,$Col) $Sheet.Cells.Item($Row,$Col).value #データのクリア $Sheet.Cells.item($Row, $Col).ClearContents() $Sheet.Cells.item($Row, $Col).Clear() #セル範囲の取得。Interopは始点・終点のCellオブジェクトを指定。EPPlusはCellsで範囲を指定。 $Sheet.Range($セルオブジェクト, $セルオブジェクト) $Sheet.Cells[$StartRow, $StartCol,$EndRow, $EndCol] #行範囲を指定 $Sheet.Rows.item($Row) $Sheet.Row($Row) #Excelオブジェクトの破棄。EPPlusはxlsxファイルがオブジェクトなので、暗黙的にsaveメソッドが走るようです。Excelが他のプロセスでオープンされていると上書きエラーが起こります。 $Excel.Quit() $Excel.Dispose() |
interopで20分かかっていた操作が3分ぐらいで終わるようになり満足です♪
“PowerShellでExcelPackagePlusを使う” に対して1件のコメントがあります。