エクセルをC#で操作できるライブラリはいくつかありますが、代表的なものとしてEPPlusとClosedXMLを挙げることができ、更にその他いくつかのライブラリが存在しています。
パフォーマンスやライセンス等、相違点は意識しておく必要があります。本記事ではその差に着目して解説します。
尚、EPPlus/ClosedXMLその他それぞれのAPIの説明や操作方法については、以下関連記事にまとめています。併せてご参考ください。
◇目次
- 比較総論:筆者ならEPPlus>ExcelDataReader>ClosedXML>SpreadSheetLightの順に検討する
- EPPlus・ClosedXML比較総論:EPPlusは処理速度に優れるが、有償ライセンス(5.X系以降)かサポート切れバージョン(4.X系以前)の2択。
- ライセンス:EPPlusは5.X以降は商用有償ライセンス。ClosedXMLはMITライセンス。
- NuGetにおけるダウンロード数、GitHubにおけるStar数
- 処理速度:セル読み書きはEPPlusが1.5~2倍程度早い
- EPPlus、ClosedXMLでできること・できないこと
- (参考)速度測定に使用したコード
- (参考)関連記事
- 記事筆者へのお問い合わせ、仕事のご依頼
比較総論:筆者ならEPPlus>ExcelDataReader>ClosedXML>SpreadSheetLightの順に検討する
詳細は下表のとおりです。有償ライセンスを購入可能ならEPPlus、無償のみで読み込みのみのタスクならExcelDataReader、無償のみ・書込必要でグラフ記述がない場合はClosedXML、という順で検討します。(あくまで筆者の経験に基づく主観です。)
また、XLSファイル(Excel2003以前)を読み込む必要がある場合はExcelDataReader一択で選定します。
EPPlus | ExcelDataReader | ClosedXML | SpreadSheetLight | |
---|---|---|---|---|
ライセンス | 独自、最新Verは有償 | MIT | MIT | MIT |
読み込み | 〇 | 〇 | 〇 | 〇 |
書き込み | 〇 | ✕ | 〇 | 〇 |
XLS(Excel2003以前)対応 | ✕ | 〇 | ✕ | ✕ |
強み | 機能的に最もリッチかつ高速 | 読込のみだが高速、XLS(Excel2003以前)も対応 | 読み書きを中心に様々な機能 | グラフ描写が可能 |
読み書き速度 (筆者体感・測定) |
早い | 早い | 左2個より遅いがそこそこ早い | この中では恐らく最も遅い |
注意すべき機能的制約 | 読込専用ファイルオープンが不可 | 書込ができない | グラフの作成が不可 パスワード付ファイルを開けない |
- |
筆者の選定優先度 | 1 | 2 | 3 | 4 |
EPPlus・ClosedXML比較総論:EPPlusは処理速度に優れるが、有償ライセンス(5.X系以降)かサポート切れバージョン(4.X系以前)の2択。
いずれもエクセルファイルをC#で操作する優れたライブラリである点は共通ですが、細かく比較してみると次のように言えます。
- EPPlusの方がClosedXMLより処理速度に優れる。
- EPPlusをプロダクトに組み込む場合は有償ライセンスの選択となる(但し、サポート切れのリスクを無視する場合はこの限りではない)。
- ClosedXMLはMITライセンスで利用可。
- 細かい部分で、EPPlusでできずClosedXMLでできること、またその逆の操作も存在する。(筆者調べ)
2023/2/3追記:読み込みのみのタスクであればExcelDataReaderも有力選択肢
後日、ExcelDataReaderという別のライブラリの性能測定を行ったところ、セル読み込み速度はEPPlus>ExcelDataReader>ClosedXMLの順という結果を得ました。
ExcelDataReaderは2023年2月時点ではMITライセンスであり、読み込みのみであれば有力な選択肢と言えます。詳しくは以下の関連記事をご参考ください。
ライセンス:EPPlusは5.X以降は商用有償ライセンス。ClosedXMLはMITライセンス。
EPPlus及びClosedXMLはいずれもオープンソースのライブラリです。ライセンス方針は異なりますので、必ずご確認の上ご利用ください。
ClosedXML:MITライセンス
ClosedXMLはMITライセンスで提供されています。
MITライセンスは著作権表示等の条件下で商用利用可のライセンスです。ClosedXML自体のライセンスも必ず確認しましょう。
EPPlus:5.X系以降、商用使用において有償ライセンス
EPPlusは4.X系以前はLGPLライセンス、EPPlus5.X以降は商用はサブスクリプション型の有償ライセンスとなっています(ライセンスページ参照)。個人プロジェクトでは引き続き無償ライセンスで利用できますが、企業では社内利用でも有償ライセンスが必要です(参考:ライセンスに関するよくある質問 - EPPlus Software)。
商用利用ライセンスはJPY(日本円)ベースでも購入可能で、2022年9月時点で開発者1人あたり約5万円の年間サブスクリプションまたは約50万円のパッケージライセンスと確認できます。詳しくは公式の料金表及び解説をご確認ください。
尚、4.X系以前は引き続きLGPLライセンスで提供されることがEPPlus Software公式サイトに掲示されています。(2022/4/25時点)。但し、4.X系以前はサポートが終了しており非推奨の表示がされています。実装に組み込む場合は注意が必要です。
NuGetにおけるダウンロード数、GitHubにおけるStar数
2022年10月末現在、NuGetにおけるダウンロード数はEPPlus 58M、ClosedXML 27.2Mと、EPPlusが2倍の差をつけています。
また、GitHubにおけるStar数はEPPlus 3.6k、ClosedXML 3.4kという状況にあります。
処理速度:セル読み書きはEPPlusが1.5~2倍程度早い
エクセルファイル処理において量が多く負荷がかかるセル読み書きについて、処理速度を比べてみました。
結果としては、セル読み書きはEPPlusが1.5~2倍程度早い結果を得られました。
尚、検証に用いたバージョンは、次の通りです。
- EPPlus:4.5.3.3
- ClosedXML:0.95.4
実験結果は以下の通りです。System.Diagnostics.Stopwatchクラスで読み書き部分の所要時間を測定しています。検証コードはこちら(ページ内リンク)に掲示しています。
EPPlus (a) |
ClosedXML (b) |
倍率 (b/a) |
|
---|---|---|---|
セル書き込み | 804ミリ秒 | 1659ミリ秒 | 2.06 |
セル読み込み | 374ミリ秒 | 584ミリ秒 | 1.56 |
EPPlus、ClosedXMLでできること・できないこと
基本的にはエクセルで利用可能な操作はいずれも一通り組み込まれていますが、若干できる・できない点が存在します。※EPPlusについては5.X系以降で機能追加されている可能性があります。
見落とし、あるいは今後のアップデートで実は可能という可能性はありますが、私がそれなりに調べた限りでの状況では以下の通りです。
EPPlus | ClosedXML | |
---|---|---|
パスワード付きエクセルファイルの開閉 | 可 | 不可 |
読み取り専用で開く (使用中ファイルを開く) |
不可 | 可 |
グラフの作成 | 可 | 不可 |
尚、パスワード付きエクセルファイルは、EPPlusでは以下のコードで開くことが出来ます。ExcelPackageクラスのコンストラクタの第2引数でパスワードを指定します。
C#
//EPPlusによるパスワード付きファイルのオープン
var inputExcelFile = new FileInfo(@"C:\Users\sakai\Desktop\test.xlsx");
using var wb = new ExcelPackage(inputExcelFile, "password").Workbook;
(参考)速度測定に使用したコード
書き込み測定用コードのみ記載します。読み込みに関しては、書き込みを行っている箇所をvar a = ws.Cells[row, column].Value;といった具合に単純代入に置き換えました。
EPPlus検証コード
C#
//EPPlus検証コード(書き込み)
using OfficeOpenXml;
using System.Diagnostics;
var stopwatch = new Stopwatch();
//ファイル読み込み
var inputExcelFile = new FileInfo(@"C:\Users\sakai\Desktop\test.xlsx");
using var wb = new ExcelPackage(inputExcelFile).Workbook;
var ws = wb.Worksheets[0];
//計測開始
stopwatch.Start();
for (int row = 1; row <= 1000; row++) {
for (int column = 1; column <= 1000; column++) {
ws.Cells[row, column].Value = 1;
}
}
//計測終了
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
ClosedXML検証コード
C#
//ClosedXML検証コード(書き込み)
using ClosedXML.Excel;
var stopwatch = new Stopwatch();
//ファイル読み込み ※XLEventTracking.Disabledはバージョン0.100系で削除されているため、第2引数は不要となりました。
var wb = new XLWorkbook(@"C:\Users\sakai\Desktop\test.xlsx", XLEventTracking.Disabled);
var ws = wb.Worksheets.First();
//計測開始
stopwatch.Start();
for (int row = 1; row <= 1000; row++) {
for (int column = 1; column <= 1000; column++) {
ws.Cell(row, column).Value = 1;
}
}
//計測終了
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
(参考)関連記事
CLosedXMLの概要・操作一覧を以下の記事にまとめております。
記事筆者へのお問い合わせ、仕事のご依頼
当社では、IT活用をはじめ、業務効率化やM&A、管理会計など幅広い分野でコンサルティング事業・IT開発事業を行っております。
この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。
皆様のご投稿をお待ちしております。