セルの反復
セルを反復するには、以下の二つの方法が利用できます。
- 範囲インスタンスの
Cells
プロパティ - ワークシートの
IterateCells
メソッド
範囲インスタンスの Cells プロパティ
範囲インスタンスの Cells
プロパティは .NET 文法の For Each をサポートしています。
// 範囲インスタンスを取得
var range = sheet.Ranges["B2:D4"];
// 全てのセルを反復
foreach (var cell in range.Cells)
{
// セルの塗りつぶし色を設定
cell.Style.BackColor = Color.PaleGoldenrod;
}
ワークシートの IterateCells
メソッド
IterateCells
メソッドは、指定した範囲でセルを反復します。メソッドの定義は以下の通りです。
void IterateCells(対象範囲, 空のセルをスキップ, 反復子のコールバック関数)
パラメータ:
- 対象範囲:文字列のアドレス、
RangePosition
値または範囲のインデントポジションのいずれか - このパラメータに
true
を渡すと、空のセルインスタンスがスキップされる(このパラメータは省略可、省略した場合true
) - 反復子のコールバック関数
セル毎のインスタンスが反復子のコールバック関数に渡されます。コールバック関数の定義は以下の通りです。
bool Iterater(int row, int col, ReoGridCell cell)
パラメータ:
- セルの行ポジション
- セルの列ポジション
- セルインスタンス(セルインスタンスは null の場合がある)
true
を返すと反復を続ける、false
を返すと反復を終了する
IterateCells
メソッドのサンプルコードは以下の通りです。
sheet.IterateCells(range, (row, col, cell) =>
{
return true;
});
空のセルをスキップする
二つ目のパラメータを省略すると、空のセルインスタンスがスキップされます。
sheet.IterateCells("B2:D4", (row, col, cell) =>
{
cell.Style.BackColor = Color.PaleGoldenrod;
return true;
});
ワークシートが初期状態の場合セルインスタンスが一つも存在しないため、このソースコードでは反復できる対象セルがありません。そのため、結果はセルの塗りつぶし色が設定されません。
空のセルを反復
空のセルインスタンスをスキップせず、反復の対象セルとしたい場合、二つ目のパラメータを false に設定します。この場合空のセルインスタンスが反復子に渡されるため、セルインスタンスが null であるかをチェックする必要があります。または常に CreateAndGetCell
メソッドを利用してセルインスタンスを取得します。
sheet.IterateCells("B2:D4", false, (row, col, _unused_cell) =>
{
var cell = sheet.CreateAndGetCell(row, col);
cell.Style.BackColor = Color.PaleGoldenrod;
return true;
});
IterateCells メソッドを利用して反復を高速化
IterateCells
メソッドは、空のセルインスタンスをスキップできるため、データ照合などの場合ではセルの反復を高速化できます。
例として、指定した範囲からセルのデータを集計するSUM関数のソースコードは以下の通りです。
public static double Sum(Worksheet sheet, RangePosition range)
{
double val = 0;
sheet.IterateCells(range, (row, col, cell) =>
{
if (ScriptRunningMachine.IsNumber(cell.Data))
{
val += ScriptRunningMachine.GetDoubleValue(cell.Data);
}
return true;
});
return val;
}
二つ目のパラメータを省略して null のセルインスタンスをスキップしているため、 null のチェックは不要です。
Cells プロパティとワークシートの IterateCells メソッド
IterateCells
メソッドでは、空のセルインスタンスをスキップせず、CreateAndGetCell
メソッドを利用して確実にセルインスタンスを取得するため、範囲インスタンスの Cells
プロパティの利用と同じ効果が得られます。ただしソースコードは、範囲インスタンスの Cells
プロパティを利用したほうが簡潔です。
範囲インスタンスの Cells プロパティのメリットは、空のセルインスタンスの有無に関わらず、必ず有効なセルインスタンスを反復できることです。ワークシートにデータを設定するには最適です。
IterateCells
メソッドのメリットは空のセルインスタンスをスキップし、セルの反復を高速に行うことです。無駄なセルインスタンスを作成せず、メモリの使用量を抑えることもできます。データの照合に最適です。
Cells プロパティ | IterateCells メソッド | |
---|---|---|
動作スピード | 遅い | 速い |
メモリ使用量 | 多い | 少ない |
ソースコードの簡潔さ | とても簡潔 | 少し複雑 |
適切なケース | データの設定 | データの照合 |