C# で既存のエクセルファイルを読み書きができるライブラリとして、EEPlus や ClosedXML、SpreadsheetLight など代表的なものがいくつか存在します。
エクセルのライブラリ
- EEPlus
- ClosedXML
- SpreadsheetLight
- NPOI
- ExcelDataReader(読み込みのみ対応)
これらのライブラリで読み込みは可能ですが、XLS形式(エクセル2003以前の形式)はサポートしていなかったり、大容量のエクセルファイルの読み込みに時間がかかったりする場合があります。ユーザビリティを向上させる為にも短時間で処理が実行されることが望ましいですよね。
エクセルの操作ができる代表的なライブラリの中で、高速で読み込みができるライブラリについて検証した結果をまとめました。ぜひ参考にしてみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
エクセルの読み込み速度比較結果
Excel の Sheet1 に1,000万セル(100,000行×100列)に1~100までの数値データが書き込まれたファイル「Sample.xlsx」を用意します。ファイルサイズは、27,060KBです。
このファイルを5種類のライブラリでそれぞれ読み込みをして、処理時間を測定しました。
ライブラリ名 | 処理時間 | 比較 |
---|---|---|
ExcelDataReader | 1,1633 ms | ー |
EPPlus | 2,0820 ms | 1.8倍 |
ClosedXML | 53,255 ms | 4.6倍 |
SpreadsheetLight | 57,921 ms | 5.0倍 |
NPOI | 656,460 ms | 56.4倍 |
上記の結果から、「ExcelDataReader」が一番処理が速いことが分かりました。
ExcelDataReaderはエクセルの読み込みに特化したライブラリであることもあり、ClosedXMLより1.9倍速く読み込みが完了しました。
エクセルを読み込むだけなら、ExcelDataReaderを利用するのがいいという結果になりました。
測定環境のパソコンのスペックによって処理時間は異なるので、あくまで参考値として考えてください。
比較方法
数値データが書き込まれたファイルを開き、シート名「Sheet1」のセル「A10」を取得するまで時間を測定しました。測定は Stopwatch クラスでミリ秒単位で行っています。
- 既存ファイル(Sample.xlsx)のオープン
- シート名「Sheet1」を選択
- セル「A10」の値を取得
ライブラリは2021年12月現在の最新の安定版をインストールして検証を行っています。
測定環境
項目 | 内容 |
---|---|
開発環境 | Microsoft Visual Studio 2019 |
開発プラットフォーム | WPF(Windows Presentation Foundation) |
.NET | 5.0 |
対象データ
項目 | 内容 |
---|---|
ファイル | Excel 2007以降(*.xlsx) |
データ数 | 10,000,000 |
ライブラリのバージョン
ライブラリ名 | バージョン |
---|---|
ExcelDataReader | 3.6.0 |
ClosedXML | 0.95.4 |
SpreadsheetLight | 3.5.0 |
NPOI | 2.5.5 |
EPPlus | 5.8.3 |
各ライブラリの説明とテストコードは以下の通りです。
ExcelDataReader
ExcelDataReader は Excel 97-2003(*.xls)と Excel 2007以降(*.xlsx)のエクセルを読み取りできるライブラリです。読み取り専用で書き込みはできません。
エクセルの読み取り方法はReader
メソッドを使用する場合とAsDataSet
拡張メソッドを使用する場合の2種類があります。
Reader
メソッドは選択されたシートの読み込みを行い、AsDataSet
拡張メソッドは全シート全セルを読み込みます。今回はReader
メソッドを使用しています。ライセンスはMITライセンスです。
テストコードは以下の通りです。
private void MesasurementExcelDataReader()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//エクセルファイルの読み取り
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
using (FileStream stream = File.Open(@"Sample.xlsx", FileMode.Open, FileAccess.Read))
using (IExcelDataReader reader = ExcelReaderFactory.CreateOpenXmlReader(stream))
{
//Sheet1を指定
while (reader.Name != "Sheet1")
{
//次のシートへ移動
reader.NextResult();
}
//現在のシートから行を読み取り
reader.Read();
//1行目の10列目のセルデータを取得(列は0を含む)
Debug.WriteLine(reader.GetValue(9));
}
stopwatch.Stop();
Debug.WriteLine($"ExcelDataReader: {stopwatch.ElapsedMilliseconds} ms");
}
EPPlus
EPPlusとは Open Office Xml(*.xlsx)形式の仕様を元に、Excel の読み書きができるライブラリです。Excel 97-2003(*.xls)はサポートされていません。
バージョン4 以前のライセンスは LGPL でした。バージョン5 以降から商用利用が目的の場合は有償ライセンス、非商用利用が目的の場合は無料(Polyform Noncommercial 1.0.0を順守)に変更されています。有償ライセンスは開発者数や期間によって価格が異なりますので、詳しくはこちらを確認してください。
テストコードは以下の通りです。
private void MesasurementEPPlus()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//エクセルファイルの読み取り
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using (ExcelPackage excel = new ExcelPackage("Sample.xlsx"))
{
//Sheet1を指定
ExcelWorksheet sheet = excel.Workbook.Worksheets["Sheet1"];
//1行目の10列目のセルデータを取得(行は0を含まない、列は0を含まない)
Debug.WriteLine(sheet.Cells[1, 10].Value);
}
stopwatch.Stop();
Debug.WriteLine($"EPPlus: {stopwatch.ElapsedMilliseconds} ms");
}
ClosedXML
ClosedXML はMicrosoft の純正 API である「Open XML SDK」のラッパーです。
Excel の操作に特化しており、直感的にコードが書けるように設計されたライブラリです。Excel 97-2003(*.xls)はサポートされていません。
ライセンスはMITライセンスです。
テストコードは以下の通りです。
private void MesasurementClosedXML()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//エクセルファイルの読み取り
using (XLWorkbook workbook = new XLWorkbook("Sample.xlsx"))
{
//Sheet1を指定
IXLWorksheet worksheet = workbook.Worksheet(1);
//1行目の10列目のセルデータを取得(列は0を含まない)
Debug.WriteLine(worksheet.Cell(1, 10).Value);
}
stopwatch.Stop();
Debug.WriteLine($"ClosedXML: {stopwatch.ElapsedMilliseconds} ms");
}
SpreadsheetLight
SpreadsheetLight は Microsoft が提供するExcel 2007以降(*.xlsx)およびLibreOffice Calcと互換性があるオープンソースのライブラリです。Excel 97-2003(*.xls)はサポートされていません。
ライセンスはMITライセンスです。
テストコードは以下の通りです。
private void MesasurementSpreadsheetLight()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//エクセルファイルの読み取り
using (SLDocument document = new SLDocument("Sample.xlsx"))
{
//Sheet1を指定
document.SelectWorksheet("Sheet1");
//1行目の10列目のセルデータを取得(列は0を含まない)
Debug.WriteLine(document.GetCellValueAsString(1, 10));
}
stopwatch.Stop();
Debug.WriteLine($"SpreadsheetLight: {stopwatch.ElapsedMilliseconds} ms");
}
NPOI
NPOIはJavaのApache POIを.NETに移植したものです。Excel 97-2003(*.xls)とExcel 2007以降(*.xlsx)のファイル読み取りと書き出しも対応した便利なライブラリです。
ライセンスはApache License 2.0です。
テストコードは以下の通りです。
private void MesasurementNPOI()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
using (FileStream stream = File.OpenRead("Sample.xlsx"))
{
//エクセルファイルの読み取り
var workbook = new XSSFWorkbook(stream);
//Sheet1を指定
ISheet worksheet = workbook.GetSheet("Sheet1");
//1行目の10列目のセルデータを取得(行は0を含む、列は0を含まない)
Debug.WriteLine(worksheet.GetRow(0).Cells[10].NumericCellValue);
//ファイルを閉じる
workbook.Close();
}
stopwatch.Stop();
Debug.WriteLine($"NPOI: {stopwatch.ElapsedMilliseconds} ms");
txtNPOI.Text = $"NPOI: {stopwatch.ElapsedMilliseconds} ms";
}
まとめ
エクセルの操作可能である代表的なライブラリの中で、高速で読み込みができるライブラリについて検証しました。
検証した結果、「ExcelDataReader」が読み込み速度は抜群に早いことが分かりました。
ExcelDataReaderは読み込みに有効なライブラリなので、速度を重視してエクセルファイルを読み取る場合は利用してみてはいかがでしょうか。
以上、最後まで読んでいただきありがとうございました。