【VB.NET】ClosedXML:パフォーマンスと効率の向上

MEMO
  • この記事は GitHub - ClosedXML - Wiki を参考に書かせていただいたものですが、C# から VB.NET への書き換えをし、英語から日本語へ翻訳しただけでなく、元記事の構成・コード・コメント等を変更している場合もありますのでご了承ください。
  • 現在 ClosedXML のメンテナンスをご担当されている Francois Botha 様からの掲載許可もいただいてます。
  • この記事のコードサンプルについては、Imports ClosedXML.Excel が宣言されていることを前提としています。
  • ClosedXML の作成者について:Francois Botha, Aleksei Pankratev, Manuel de Leon, Amir Ghezelbash
  • ClosedXML のライセンスについて:GitHub - ClosedXML - MIT License

範囲の自動調整をしないようにする

通常、ClosedXML は挿入・削除の処理を追跡し、関連する範囲を適切に調整します。以下はその例です。

もしもこの調整が不要な場合は、調整を行わないようにできます。そうすることにより、メモリの節約とパフォーマンスの改善が期待できます。

この機能をオフにするには、ワークブックを開く際の引数として XLEventTracking.Disabled を指定します。

適切なラムダ式を使用する

.Where などにすべてのオブジェクトを渡すかわりに、Cells/Rows/Columns のメソッドに述部を与えることを検討してください。

 

改善の余地があるやり方

 

適切なやり方

MEMO by エレン・イースト

元記事では rows に対して Using を使うように書かれているが、rows (IXLRows) には System.IDisposable が実装されていないので Using を使うことはできない。

 

改善の余地があるやり方

 

適切なやり方

Using キーワードの使用

MEMO

ワークブックのイベント追跡をオフにしている場合、Using キーワードは不要です。詳細については「範囲の自動調整をしないようにする」を参照してください。

ループ内で範囲を表すオブジェクトを処理する場合は Using キーワードを使用してください。これにはワークブック、ワークシート、行(row, rows)、列(column, columns)が含まれます。

下記のサンプルコードで処理しているのは大きなファイルだと考えてください。

 

改善の余地があるやり方

 

適切なやり方

MEMO by エレン・イースト

元記事では row に対しても Using を使うように書かれているが、row (IXLRow) には System.IDisposable が実装されていないので Using を使うことはできない。

 

改善の余地があるやり方

 

適切なやり方

MEMO by エレン・イースト

元記事では ws に対しても Using を使うように書かれているが、ws (IXLWorksheet) には System.IDisposable が実装されていないので Using を使うことはできない。

パフォーマンスの改善に役立つその他のこと

  • セルを取得するときは文字列ではなく数値を使用するようにしてください。たとえば Cell("A1") とするのではなく Cell(1, 1) と指定します。小さなシートではこの違いをほとんど感じられませんが、何万ものセルを処理する場合には無視できないものになります。
  • ループの中で行や列の挿入・削除をしないでください。それよりも挿入する行や列の数を計算してから一度に処理したほうがずっと高速です。なぜなら、挿入や削除を行うたびに、ライブラリがすべての式を再計算することになるからです。

範囲の取得に便利なメソッド

最初・最後の行や列の取得は、頻繁に必要となる処理です。毎回めんどうなコードを書かなくても下記のメソッドが使用できます。

 

使用済みの範囲を計算する必要もありません。次のコードを利用してください。

 

「【VB.NET】ClosedXML の使い方」の一覧を表示

コメントの投稿

avatar
  購読する  
通知を受け取る対象