PowershellへのClosedXMLの導入

ClosedXMLをPowershellで使うためのメモ

interop問題

Excel作業を自動化しようとすると、「interopサービスを使いましょう」という古い情報に当たることがあります。最近(2019年夏現在)は幸いにもそんな古い情報に当たることはそうそう無いんですが、それでも「マクロのあるファイルを操作する」とか「Web上のContents Management Service上のファイルを直接操作する」とかExcelじゃないと動かせない場合もあります。

そういった時のためにinteropサービスでExcel作業を自動化する際に当たりがちなエラーをまとめました。結構苦労します(^_^;)
[nlink url=”https://f-journey.com/it/problem_in_using_interopservice/”]
https://f-journey.com/it/problem_in_using_interopservice/

ということで、Excelをオブジェクト化するのではなくxlsxファイルを直接操作するライブラリを調べると、NPOI,ClosedXML,ExcelPackagePlus,ImportExcelなんかがヒットします。

それのうち、Microsoftが作っているClosedXMLを使うためのメモ。

ExcelPackagePlusは下記をご覧ください
[nlink url=”https://f-journey.com/it/excelpackageplus_on_powershell/” title=”PowerShellでEPPlusを使う” excerpt=”PowerShellでEPPlusを使うためのメモ” img=”http://f-journey.com/blog/wp-content/uploads/2020/04/EPPlus.png”]

ImportExcelはこちら
[nlink url=”https://f-journey.com/it/import-excel_japanese_help/” title=”Import-Excelコマンドレットの使い方” excerpt=”ImportExcelモジュールのImport-Excelコマンドレットの使い方” img=”http://f-journey.com/blog/wp-content/uploads/2018/07/powershell-icon-17194.png”]

ライブラリの入手

まずは入手する方法から

git-hubからソースをダウンロードしてCompileする

linux環境なら常道ですが、Windowsだとあんまり無い気がします。

nugetからライブラリを入手する

コマンドラインがNuget Galleryの上の方に書かれています。
ClosedXML -Nuget Gallery
例えばこんな感じ

Install-Packageを使ってもいいんですが「proxyを通じて社外アクセスしてる環境ではコケる」ことが多々あります。Powershell5.1以降であればProxyの内側からインストールできます。-Proxyおよび-ProxyCredentialオプションが使えます。詳しくは下記Qiita記事を参照してください。6とありますが、5.1でも使えます

PowerShell 6にプロキシ経由でモジュールインストール

ただ、こうやっても直接関係しないライブラリを大量にダウンロードします。恐らくDependencies(依存関係)に「System.IO.Packaging」が含まれているせいかと思います。

nugetのサイトからライブラリを直接ダウンロードする。

Nuget Galleryの右の方に「Download package」と書かれています。これをダウンロードするとWebから直接ダウンロードできます。2019年9月現在の安定最新版は0.94.2です。

ClosedXML 0.94.2
これをダウンロードすると、「closedxml.0.94.2.nupkg」という拡張子で落ちてきます。
「nupkgなんて拡張子知らないよ」って思うかも知れませんが、これ単にlibファイルとxmlファイルをzip圧縮しただけのものです。拡張子をzipに変えれば普通に展開できます(^_^;)

NugetのDependenciesにあるライブラリとその先のDependenciesをすべて落とします。面倒ですが、関係しないライブラリが落ちまくるよりマシでは?と思います。
v0.94.2版の.NETFramework 4.6での依存先は以下の3つです。

更に、DocumentFormat.OpenXml の依存先として以下が必要です。

最新版の依存関係はNuget Galleryを参照してください。
ClosedXML -Nuget Gallery

ライブラリのロード

今回はC:¥scropt¥にダウンロードしました。
入手できたら次はライブラリのロードです。
PowerShellだと[Reflection.Assembly]::LoadFile()という命令があります。
これは、エラーが起こりませんが、実際にはObject作成の段階で失敗します。
試してみるとAdd-Typeだと実行時にエラーが発生します。
5年くらい前の記事ですが、[Reflection.Assembly]::LoadFile()とAdd-Typeの差は下記を参照しました。

PowerShell の Add-Type と [Reflection.Assembly]

これを実行すると、下記のエラーが発生します。

…なるほど、わからん。LoaderExceptions プロパティを取得してください。ってどうやるねん?
英語で検索したら、下記で取れるとわかりました。結局英語なのね(´;ω;`)

これを表示した結果がこちら!

え、2.7.2.0が読み込めないってどういう事。2.9.1使ってるねんで?Dependenciesは、(>= 2.7.2)って書いてあるやん。最新版入手したやん。
訝しみながらもライブラリをv2.7.2にしたら…動きやがった(ー_ー;)

Hellor Worldを動かす

これでようやくClosedXMLが動かせます。一ヶ月無駄にした

A1セルにHello Worldを入力して保存するscriptがこちら

やっと動いた…(^_^;)

全体のソースのメモはこちら。

PowershellへのClosedXMLの導入” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください