C#でのエクセル読出し速度を比較してみた(2)

どもです。

今回は、前回に引き続き、C#でのエクセルデータ読出しの速度を比較してみた結果について書きます。なお今回は、

読み出すテーブルの各セルの内容が計算式であった場合、どのように読出し速度は変化するのだろう?

ということに着目して、測定・比較を行います。

1. 比較環境

今回のエントリでは、以下の環境で作業を行います。前回と全く同じ環境です。

性能比較実行環境
項目 内容
OS Windows10 Pro(22H2)
CPU i7-8700
メモリ 16GB
IDE Visual Studio Commnuity 2019
version 16.11.19
ClosedXML ver.0.97.0.0
ExcelDataReader ver.3.6.0.0
ExcelDataReader.DataSet ver.3.6.0.0

2. 比較手順

比較は、以下の手順で行います。これも前回と同じです。

  1. 任意のシートから、任意の文字列(テーブル名)がセットされたセルを見つける。

    (見つけたセルの1行下、1列右のセルを、テーブルの先頭のセルとする。)

  2. テーブルの先頭列から右方向に、空白のセルが見つかるまで読み込む。
    (読み込んだ値は、テーブルヘッダとする。)
  3. テーブルの先頭の次の行、先頭列から右方向に1行分読み出す。
  4. 各行の先頭列が空白になるまで、1行ずつ読み出す。

ここで、テストを容易にするために、これらの手順を実施するラッパとなるクラスを、各ライブラリ毎に作成します。

2.1. 比較に使用するライブラリ

…使用するライブラリの実装をココで紹介しようと思ったのですが、意外と長くなってしまいました。なので、本記事での紹介は省略します。詳細は、GitHub – CsMySamples/TableReaderに公開していますので、そちらを参考してください。

2.2. 比較で使用するデータ

比較では、以下のようなデータを用意します。

No. テーブル名(セルの座標) データのサイズ
1 TestTable_001(B1) 100×100
2 TestTable_001(B106) 100×100
3 TestTable_001(DA2) 100×100
4 TestTable_004(DA107) 100×100

今回は、テーブルのサイズを100×100に固定して実施してみます。テーブルのサイズの変化に伴うデータ読出し速度の変化は、別の機会に測定を行います。

また、各セルには、以下の計算式を設定します。

(セルの値) = (行番号 – 1) x 100 + (列番号)

2.3. 比較方法

今回も前回同様、上述の各テーブルをそれぞれ100回読み込み、読み込みに要した時間の平均値を測定、比較します。

3. 結果

比較した結果は、以下の通りです。

テーブル名 ClosedXML ExcelDataReader
TestTable_001 2306 ms 195 ms
TestTable_002 4551 ms 197 ms
TestTable_003 2315 ms 200 ms
TestTable_004 4566 ms 196 ms

4. まとめ

今回は、ClosedXMLとExcelDataReaderについて、読み出すセルの内容が計算式であった場合の性能を測定してみました。

ライブラリの速度を比較した場合、やはりExcelDataReaderの方が速いです。

各ライブラリごとに、テーブルの位置の変化に対する読出し速度の変化に着目すると、ClosedXMLの場合には読み出す行番号が大きくなるほど、読出しに要する時間が長くなる傾向にあります。同じ行番号なら、列番号が大きくなっても、それほど時間は長くなりません。対してExcelDataReaderの場合には、行番号、列番号が変化しても、読出し速度は大きくは変化しません。

結論としては、やっぱりC#でのExcelの読出しは、ExcelDataReaderが速い!

ではっ!