【C#×Excelライブラリ選定】
及びEPPlus vs ClosedXML 処理速度・概要比較


(最終更新日:

記事イメージ

エクセルをC#で操作できるライブラリはいくつかありますが、代表的なものとしてEPPlusとClosedXMLを挙げることができ、更にその他いくつかのライブラリが存在しています。

パフォーマンスやライセンス等、相違点は意識しておく必要があります。本記事ではその差に着目して解説します。

尚、EPPlus/ClosedXMLその他それぞれのAPIの説明や操作方法については、以下関連記事にまとめています。併せてご参考ください。

関連記事:【C#でエクセル操作】EPPlus操作まとめ
関連記事:【C#でエクセル操作】ClosedXMLの特徴と操作まとめ
関連記事:【C#・Excel】SpreadSheetLightの特徴と基本操作
関連記事:【C#でエクセル解読】ExcelDataReaderの実装とパフォーマンス測定

比較総論:筆者ならEPPlus>ExcelDataReader>ClosedXML>SpreadSheetLightの順に検討する

詳細は下表のとおりです。有償ライセンスを購入可能ならEPPlus、無償のみで読み込みのみのタスクならExcelDataReader、無償のみ・書込必要でグラフ記述がない場合はClosedXML、という順で検討します。(あくまで筆者の経験に基づく主観です。)

また、XLSファイル(Excel2003以前)を読み込む必要がある場合はExcelDataReader一択で選定します。

C#で利用できるExcelパッケージ比較(筆者調べ。必ず公式をご確認ください。)
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(4.X系) vs ClosedXML比較総論
  • EPPlusの方がClosedXMLより処理速度に優れる。
  • EPPlusをプロダクトに組み込む場合は有償ライセンスの選択となる(但し、サポート切れのリスクを無視する場合はこの限りではない)。
  • ClosedXMLはMITライセンスで利用可。
  • 細かい部分で、EPPlusでできずClosedXMLでできること、またその逆の操作も存在する。(筆者調べ)

2023/2/3追記:読み込みのみのタスクであればExcelDataReaderも有力選択肢

後日、ExcelDataReaderという別のライブラリの性能測定を行ったところ、セル読み込み速度はEPPlus>ExcelDataReader>ClosedXMLの順という結果を得ました。

ExcelDataReaderは2023年2月時点ではMITライセンスであり、読み込みのみであれば有力な選択肢と言えます。詳しくは以下の関連記事をご参考ください。

関連記事:【C#でエクセル解読】ExcelDataReaderの実装とパフォーマンス測定
【社内PR】チーム・ウォーク

ライセンス: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系以前はサポートが終了しており非推奨の表示がされています。実装に組み込む場合は注意が必要です。

Visual StudioのNuGetパッケージマネージャーからもバージョンを選択してインストールすることができます。4.X系は非推奨マークが表示されています。
Visual StudioのNuGetパッケージマネージャーからもバージョンを選択してインストールすることができます

NuGetにおけるダウンロード数、GitHubにおけるStar数

2022年10月末現在、NuGetにおけるダウンロード数はEPPlus 58M、ClosedXML 27.2Mと、EPPlusが2倍の差をつけています。

また、GitHubにおけるStar数はEPPlus 3.6k、ClosedXML 3.4kという状況にあります。

NuGetにおけるダウンロード数
NuGetにおけるダウンロード数

処理速度:セル読み書きはEPPlusが1.5~2倍程度早い

エクセルファイル処理において量が多く負荷がかかるセル読み書きについて、処理速度を比べてみました。

結果としては、セル読み書きはEPPlusが1.5~2倍程度早い結果を得られました。

尚、検証に用いたバージョンは、次の通りです。

  • EPPlus:4.5.3.3
  • ClosedXML:0.95.4

実験結果は以下の通りです。System.Diagnostics.Stopwatchクラスで読み書き部分の所要時間を測定しています。検証コードはこちら(ページ内リンク)に掲示しています。

表:処理速度実測の差(読み書きそれぞれ100万回実行)
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の概要・操作一覧を以下の記事にまとめております。

関連記事:【C#でエクセル操作】ClosedXMLの特徴と操作まとめ

記事筆者へのお問い合わせ、仕事のご依頼

当社では、IT活用をはじめ、業務効率化やM&A、管理会計など幅広い分野でコンサルティング事業・IT開発事業を行っております。

この記事をご覧になり、もし相談してみたい点などがあれば、ぜひ問い合わせフォームまでご連絡ください。

皆様のご投稿をお待ちしております。

記事筆者へ問い合わせする

※ご相談は無料でお受けいたします。

この記事へのコメント

ニックネーム(任意)

返信通知先Emailアドレス(任意)

本文


* 感想やご意見等、お気軽にコメントください。但し、公序良俗に反するコメントはお控えください。
* 管理者が承認したコメントはこの箇所に公開させていただく可能性がございます。
* 返信通知先Emailアドレスは、筆者のみに通知され、公開されることはありません。返信通知先Emailを入力された場合は、コメントへの返信をこちらに掲載した際に通知させていただきます。その他の目的には使用いたしません。
* スパム対策のため、コメントは日本語のみ受け付けております。

堺財経電算合同会社 小規模IT構築サービス