背景
Excel シートを、Infragistics.Document.Excel.Workbook で読み込み、そのセルの値を参照したり書き換えたりする際、とくにその Excel シートが数式を含むセルを大量に持っていると、セルの値の参照・書き換えにかなりの時間がかかる場合があります。
この現象は (Blazor Server プログラムに比べ) Blazor WebAssembly プログラム上ではとくに顕著です。
対処方法
このような場合に処理時間を改善する方法のひとつとして、数式の自動計算を一時的に停止しておいてから、セルの値の参照・書き換えを行ない、ひととおり処理が完了してから、数式の自動計算を再開する、という方法があります。
数式の自動計算が一時停止されている間は、セルの値を参照・書き換えても、都度毎回の数式の再計算が実行されなくなることで、処理時間を改善することができます。
具体的には、Workbook オブジェクトの SuspendCalculations() メソッドと ResumeCalculations() メソッドをそれぞれ呼び出します (下記コード例)。
@using Infragistics.Documents.Excel ... var workbook = Workbook.Load(...); // ? SuspendCalculations() を呼び出すと、これ以降、数式の自動計算が止る workbook.SuspendCalculations(); // ... ここで、この Workbook に含まれるセルの読み書きなどを行なう ... // ? ResumeCalculations() を呼び出すと、数式の自動計算が再開する workbook.ResumeCalculations();
注意
数式の自動計算を一時的に停止させる方法であるため、数式が常に最新の状態に自動計算されることが前提となっているセルの値の参照・書き換えにおいては、再計算前の値が取得されてしまうなどの問題が発生することが想定されます。
このような場合には、数式の自動計算を一時的に停止して処理速度を改善するこの方法は適用できません。
また、数式の自動計算が処理時間が長くかかることの要因ではない場合は、この対処方法では処理速度の改善は見込めません。
補足
.NET 6 以降の Blazor WebAssembly プログラムにおいては、”AOT コンパイル” を有効にすることにより、特に計算が中心となる処理 (Excel シートの処理のような) については処理速度の改善が見込まれます。但し AOT コンパイルは発行に長時間かかったり、出力されるアプリケーションコンテンツサイズが大きくなるなどの副作用があります。
Blazor WebAssembly プログラムにおける AOTコンパイルについて詳細は下記リンク先をご参照ください。