4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PowerShellでClosedXMLを利用する

Posted at

ClosedXMLとは

マイクロソフトのOfficeは2007から既定のファイル形式がOpen XML形式となっており。
それ以前の独自形式から標準化された形式となっています。

このOpen XML形式で作成されたドキュメントを取り扱うSDKとして、OpenXML SDKが提供されていますが、ClosedXMLはこのOpenXML SDKにユーザーフレンドリーなインターフェースを提供することを目的とした.NETライブラリとなります。

PowerShellからClosedXMLをあつかう

ClosedXMLは.NETライブラリなのでPowerShellから扱うことができます。
PowerShellから簡易にExcelを扱える有名なライブラリとしては、dfinke/ImportExcelがありますが、今回はあえてPowerShellからClosedXMLを取り扱ってみます。

今回取り扱っている環境

  • Windows 11 23H2
  • .NET 8.0
  • PowerShell 7.5.0-preview.2
  • ClosedXML.0.102.2

nugetクライアントツールでライブラリを取得

VisutoStudioだったり、Visuto Stuido Codeの拡張だったりを利用してnugetのライブラリを取り扱う事もできますが。
今回はPowerShellからClosedXMLを利用するためにdllが入手したいので、nugetクライアントツールを使ってライブラリをダウンロードしてみます。

nuget.exeをインストールする

まずはnuget.exeをドキュメントに従ってインストールします。

nuget.exeをインストールする

ドキュメントに記載がありますがダウンロードできるnuget.exeはそのままバイナリとなっているため、適当な場所に配置してPATHを通すなりして利用してください。

nugetギャラリーからClosedXMLをダウンロード

Nuget Gallery ClosedXML

image.png

NuGet.exe CLI を使用して NuGet パッケージを管理する

上記ドキュメントにあるようにサブディレクトリにパッケージをインストールする場合はnuget install パッケージ名 -OutputDirectory ディレクトリ とすればよいので今回はc:\qiita\closedxml\lib\というディレクトリにパッケージをインストールしてみます。

nuget install ClosedXML -OutputDirectory c:\qiita\closedxml\lib\

image.png

依存するパッケージ含めてインストールされました。

image.png

PowerShellからClosedXMLを利用する

ClosedXML wiki

今回は上記、Wikiの冒頭に書いてる部分をPowerShellでやってみます。

image.png

必要なライブラリを読み込む

今回はPowerShell 7.5.0-preview.2からダウンロードしたClosedXML.0.102.2の.NET Standard 2.1なライブラリを利用してみます。

.NET Standard 2.1のライブラリをDependenciesをみるといくつかのパッケージが依存関係になっているようなので、こららのライブラリも読み込んでおきます。

image.png

# DocumentFormat.OpenXml (>= 2.16.0 && < 3.0.0)
Add-Type -Path "C:\qiita\closedxml\lib\DocumentFormat.OpenXml.2.16.0\lib\netstandard2.0\DocumentFormat.OpenXml.dll"
# ExcelNumberFormat (>= 1.1.0)
Add-Type -Path "C:\qiita\closedxml\lib\ExcelNumberFormat.1.1.0\lib\netstandard2.0\ExcelNumberFormat.dll"
# SixLabors.Fonts (>= 1.0.0)
Add-Type -Path "C:\qiita\closedxml\lib\SixLabors.Fonts.1.0.0\lib\netstandard2.1\SixLabors.Fonts.dll"
# System.IO.Packaging (>= 6.0.0)
Add-Type -Path "C:\qiita\closedxml\lib\System.IO.Packaging.6.0.0\lib\netstandard2.0\System.IO.Packaging.dll"
# System.Net.Http (>= 4.3.4)
Add-Type -Path "C:\qiita\closedxml\lib\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll"
# System.Text.RegularExpressions (>= 4.3.1)
Add-Type -Path "C:\qiita\closedxml\lib\System.Text.RegularExpressions.4.3.1\lib\net463\System.Text.RegularExpressions.dll"
# XLParser (>= 1.5.2)
Add-Type -Path "C:\qiita\closedxml\lib\XLParser.1.5.2\lib\netstandard1.6\XLParser.dll"
# closedxml .NETStandard 2.1
Add-Type -Path "C:\qiita\closedxml\lib\ClosedXML.0.102.2\lib\netstandard2.1\ClosedXML.dll"

image.png

サンプルをやってみる

image.png

上記サンプルの部分をPowerShellで同様にやってみます。
必要なライブラリを読み込んだ状態で下記のスクリプトを実行してみます。

# ワークブックインスタンスをインスタンス化
$workBook = New-Object ClosedXML.Excel.XLWorkbook
# ワークブックにシート("Sheet1")を追加
$workSheet = $workBook.Worksheets.Add("Sheet1")
# A1セルにHello worldを入力
$workSheet.Cell("A1").Value = "Hello world"
# A2に数式を入力(FormulaA1でA1形式で数式入力)
$workSheet.Cell("A2").FormulaA1 = "MID(A1, 7, 5)"
# SaveAsでファイルを保存
$workBook.SaveAs("c:\qiita\closedxml\helloworld.xlsx")

実行している所。

image.png

作成されたエクセルファイル(helloworld.xlsx)

image.png

ClosedXMLを利用して簡単にエクセルファイルが作成できました。

Windows PowerShellでClosedXML .0.102.2を利用できるか

今回、PowerShell 7.5.0-preview.2で利用してみましたが、Windows Powershell 5.1でClosedXML.0.102.2を利用できるかについて。

.NET Standard のバージョンの選択

.net frameworkが基盤となっているWindows PowerShellでは.net standard2.0 or .net standard 2.1なライブラリを依存関係含めて利用しようとするのは無理な気がするので。
.NETFramework 4.6向けが提供されているClosedXML 0.96.0を利用するのがよさそうです。

nuget.exeでバージョン0.96.0のダウンロード

nuget install ClosedXML -Version 0.96.0 -OutputDirectory c:\qiita\closedxml\ClosedXML0.96.0\

image.png

Windows PowerShell 5.1からClosedXML 0.96.0を利用する

# DocumentFormat.OpenXml (>= 2.16.0)
Add-Type -Path "C:\qiita\closedxml\ClosedXML0.96.0\DocumentFormat.OpenXml.2.16.0\lib\net46\DocumentFormat.OpenXml.dll"
# ExcelNumberFormat (>= 1.1.0)
Add-Type -Path "C:\qiita\closedxml\ClosedXML0.96.0\ExcelNumberFormat.1.1.0\lib\net20\ExcelNumberFormat.dll"
# Microsoft.CSharp (>= 4.7.0)
Add-Type -Path "C:\qiita\closedxml\ClosedXML0.96.0\Microsoft.CSharp.4.7.0\lib\netstandard1.3\Microsoft.CSharp.dll"
# ClosedXML
Add-Type -Path "C:\qiita\closedxml\ClosedXML0.96.0\ClosedXML.0.96.0\lib\net46\ClosedXML.dll"

# ワークブックインスタンスをインスタンス化
$workBook = New-Object ClosedXML.Excel.XLWorkbook
# ワークブックにシート("Sheet1")を追加
$workSheet = $workBook.Worksheets.Add("Sheet1")
# A1セルにHello worldを入力
$workSheet.Cell("A1").Value = "Hello world"
# A2に数式を入力(FormulaA1でA1形式で数式入力)
$workSheet.Cell("A2").FormulaA1 = "MID(A1, 7, 5)"
# SaveAsでファイルを保存
$workBook.SaveAs("c:\qiita\closedxml\helloworld.xlsx")

image.png

上記のように、ClosedXML 0.96.0はWindows PowerShell 5.1から利用する事ができました。

総評

PowerShellからExcelを利用する場合は、COMオブジェクトを利用するか、ClosedXML(OpenXML SDK)を利用するか、importExcel(EPPlus v4)を利用するか、etcetcといった感じかと思いますが。
今回はClosedXMLを利用するケースについて書いてみました。

ClosedXMLを利用すればOfficeがインストールされていない環境でOpemXML形式のExcelファイルを取り扱えるので、いろいろなケースで用途があるかと思います。
(PowerShellからエクセルファイルを利用する場合は、importExcelが一番楽な気もしますが)

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?