PowerShell で ClosedXML を使って Excel ファイルを作成する

2020/04/18

経緯

以前 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 形式のファイルは扱えない
  • 環境構築が Excel インストールだけに比べると煩雑