C#

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

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

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

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

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

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

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

ExcelのSheet1に1,000万セル(100,000行×100列)に1~100までの数値データが書き込まれたファイル「Sample.xlsx」を用意します。ファイルサイズは、27,060KBです。

このファイルを5種類のライブラリでそれぞれ読み込みをして、処理時間を測定しました。

ライブラリ名処理時間比較
ExcelDataReader1,1633 ms
EPPlus2,0820 ms1.8倍
ClosedXML53,255 ms4.6倍
SpreadsheetLight57,921 ms5.0倍
NPOI656,460 ms56.4倍

上記の結果から、「ExcelDataReader」が一番処理が速いことが分かりました。

ExcelDataReaderはエクセルの読み込みに特化したライブラリであることもあり、ClosedXMLより1.9倍速く読み込みが完了しました。

エクセルを読み込むだけなら、ExcelDataReaderを利用するのがいいという結果になりました。

測定環境のパソコンのスペックによって処理時間は異なるので、あくまで参考値として考えてください。

比較方法

数値データが書き込まれたファイルを開き、シート名「Sheet1」のセル「A10」を取得するまで時間を測定しました。測定はStopwatchクラスでミリ秒単位で行っています。

  • 既存ファイル(Sample.xlsx)のオープン
  • シート名「Sheet1」を選択
  • セル「A10」の値を取得

ライブラリは2021年12月現在の最新の安定版をインストールして検証を行っています。

測定環境

項目内容
開発環境Microsoft Visual Studio 2019
開発プラットフォームWPF(Windows Presentation Foundation)
.NET5.0

対象データ

項目内容
ファイルExcel 2007以降(*.xlsx)
データ数10,000,000

ライブラリ

ライブラリ名バージョン
ExcelDataReader3.6.0
ClosedXML0.95.4
SpreadsheetLight3.5.0
NPOI2.5.5
EPPlus5.8.3

各ライブラリの説明とテストコードは以下の通りです。

ExcelDataReader

ExcelDataReaderはExcel 97-2003(*.xls)とExcel 2007以降(*.xlsx)のファイル読み取り専用ライブラリです。

【C#】Excel ファイルの読み込みなら ExcelDataReader がおすすめエクセルの読み込み専用ライブラリ「ExcelDataReader」をご紹介します。C#で利用できるライブラリで、Excelファイルの読み込みを高速に処理ができるメリットがあります。...

使い方は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で操作する方法を紹介C#でExcelの読み込み・書き込み・操作などを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で操作する方法Excel(エクセル)の書き込み・読み込み・エクセル操作するならC#専用ライブラリ「SpreadsheetLight」がおすすめ。無料で利用できる上に、豊富なサンプルで導入が簡単です。この記事ではライブラリのインストールを始め、基本となるエクセルの操作方法について詳しく解説をしています。...

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

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

プログラミングを学習したいなら…

プログラミングスキルを身に付けるなら、プログラミングを効率良く学べる
プログラミングスクール」がオススメです。

特にこんな方にオススメ!!
これからエンジニアを目指したい
プログラミングの専門性を高めたい
プログラミングを学んで副業をしたい
エンジニアに転職して年収をアップさせたい

プログラミングを触ったことがない未経験からでも、プログラミングスクールで学習すれば、エンジニアへ就職・転職することも可能です。

あなたの「行動力」と「やる気」で、あなたの人生を大きく変えるチャンスになることでしょう。

プログラミングスクールに興味がある方は是非チェックしてみてください。

> プログラミングを学ぶ <

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA