> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】エクセルの読み込み速度比較 ~高速でおすすめのライブラリとは~

  • URLをコピーしました!

C#で既存のエクセルファイルを読み込みできるライブラリとして、ClosedXMLやNPOIなど代表的なものがいくつか存在します。

大容量のエクセルファイルを読み込みする場合は、ユーザビリティを向上させる為にも短時間で処理を実行されることが求められます。

エクセルの操作可能である代表的なライブラリの中で、高速で読み込みができるライブラリについて検証した結果をまとめました。

これからプログラミングを始めたい初心者の方におすすめのノートパソコンを紹介しています。プログラミング向けのノートパソコンの選び方も解説していますので、参考にしてみてください。

>>おすすめのノートパソコンをもっと詳しくみる

記事の内容

エクセルの読み込み速度比較結果

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)のファイル読み取り専用ライブラリです。

あわせて読みたい
【C#】Excel ファイルの読み込みなら ExcelDataReader がおすすめ C#でエクセルの読み込みを行える「ExcelDataReader」を紹介します。 無料で利用できる上に高速に処理ができる人気のライブラリです。 エクセルファイルの読み込み専用の...

使い方は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 OfficeXml(*.xlsx)形式のExcelファイルを読み書きすることができるライブラリです。

バージョン5以降からライセンスがLGPLからポリフォーム非商用1.0.0に変更されています。非商用で個人利用であれば、無料で使用することができます。商用目的の場合は開発者毎にライセンスが必要となり、31,999円(税別)で購入可能です。

テストコードは以下の通りです。
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のOpen XML SDKはOfficeアプリを扱えるという汎用性がある一方、コードが煩雑になり使い勝手が悪いので、Excelに特化し使い易くしたライブラリです。

Open XMLSDKを対象としているので、Excel 2007(*.xlsx)以降のファイル形式で読み書きをすることができます。

あわせて読みたい
【C#】ExcelをClosedXMLで操作する方法を紹介 Microsoft Excel(マイクロソフト エクセル)をC#で作成したプログラムから操作することができる便利なライブラリ「ClosedXML」の使用法について紹介します。 このライブ...

ライセンスは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と互換性があるオープンソースのライブラリです。

あわせて読みたい
【C#】ExcelをSpreadsheetLightで操作する方法 エクセルは表計算ソフトとして社会人の多くが利用している必須アプリの1つです。 C#を使ってエクセルの読み込みや書き込み等の操作を制御できれば、これまで時間を費や...

ライセンスは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は読み込みに有効なライブラリなので、速度を重視してエクセルファイルを読み取る場合は利用してみてはいかがでしょうか。

以上、最後まで読んでいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

プログラムが大好きなパンダです。
主に C# を使ってデスクトップアプリやモバイルアプリなどを開発しています。

当ブログでは C# の使い方や WPF または .NET MAUI を使ったサンプルアプリなど発信しています。

コメント

コメントする

CAPTCHA


記事の内容