経緯
以前 PowerShell で Excel をどうのこうのすることに興味を持ってくれると嬉しい としてブログを書いたことがあります。
その時の方法では、 Excel がインストールされている必要がありましたが、ClosedXML というライブラリを使うと Excel がインストールされていなくても Excel のファイルを作れることを知りましたので、少し試してみたいと思います。
環境
- Windows 10
- PowerShell 5.0
- ClosedXML 0.76.0
- Microsoft Open XML Format SDK
作業ディレクトリ
作業ディレクトリをデスクトップに作りました。
ClosedXML の準備
まずはサイトでダウンロードします。 zip 形式でダウンロードできます。
ダウンロードしたライブラリにはセキュリティの観点からブロックが施されていますので、解除をして解凍します。
ダウンロードした zip ファイルを右クリックしてプロパティを開き、ブロックの解除にチェックを入れて OK ボタンを押します。
その後、zip ファイルから ClosedXML.dll を取得して、作業ディレクトリに保存します。
Microsoft Open XML Format SDK の準備
ClosedXML のドキュメントページ からも DLL を直接ダウンロードできますが、今回は
Microsoft のサイトから Microsoft Open XML Format SDK をダウンロードします。
今回私は 2.0 をインストールしてみましたが、私の環境では、msi を実行すると、 C:\Program Files (x86)\Open XML SDK\V2.0\lib に配置されました。
Office のバージョンと関係があるようです。
MS Office | Open XML Format SDK |
---|---|
Office 2007 | SDK 1.0 |
Office 2010 | SDK 2.0 |
Office 2013 以降 | SDK 2.5 |
ClosedXML 公式で配布されていたのは、2.0 と 2.5 でした。
Hello world
早速 Hello world を書いてみます。
[Reflection.Assembly]::LoadFile("$PSScriptRoot\ClosedXML.dll")
[Reflection.Assembly]::LoadFile("C:\Program Files (x86)\Open XML SDK\V2.0\lib\DocumentFormat.OpenXml.dll")
$workBook = new-object ClosedXML.Excel.XLWorkbook
$workSheet = $workBook.Worksheets.Add("Sheet1")
$worksheet.Cell("A1").Value = "Hello world";
$workBook.SaveAs("$PSScriptRoot\helloworld.xlsx")
結果はこうなりました
考察
とても簡単でしたし、動作がとても軽快で驚きました。以前の方法だと、何らかの理由で COM オブジェクトの破棄ができなかった時は、Excel のプロセスが残ってしまうという事がありましたが、その危険性もなさそうです。
気がついた点は次の通りです。
メリット
- 動作が軽快
- Excel が入っていないマシンでも実行できる ※重要
- オブジェクトの破棄に気を配る必要がない
デメリット
- xls 形式のファイルは扱えない (Office 2007 以上限定)
- 環境構築が Excel インストールだけに比べると煩雑