セルの反復

セルを反復するには、以下の二つの方法が利用できます。

  1. 範囲インスタンスの Cells プロパティ
  2. ワークシートの IterateCells メソッド

範囲インスタンスの Cells プロパティ

範囲インスタンスの Cells プロパティは .NET 文法の For Each をサポートしています。

// 範囲インスタンスを取得
var range = sheet.Ranges["B2:D4"];

// 全てのセルを反復
foreach (var cell in range.Cells)
{
  // セルの塗りつぶし色を設定
  cell.Style.BackColor = Color.PaleGoldenrod;
}

424

ワークシートの IterateCells メソッド

IterateCells メソッドは、指定した範囲でセルを反復します。メソッドの定義は以下の通りです。

void IterateCells(対象範囲, 空のセルをスキップ, 反復子のコールバック関数)

パラメータ:

  1. 対象範囲:文字列のアドレス、RangePosition 値または範囲のインデントポジションのいずれか
  2. このパラメータに true を渡すと、空のセルインスタンスがスキップされる(このパラメータは省略可、省略した場合 true
  3. 反復子のコールバック関数

セル毎のインスタンスが反復子のコールバック関数に渡されます。コールバック関数の定義は以下の通りです。

bool Iterater(int row, int col, ReoGridCell cell)

パラメータ:

  1. セルの行ポジション
  2. セルの列ポジション
  3. セルインスタンス(セルインスタンスは null の場合がある)
  4. 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;
});

ワークシートが初期状態の場合セルインスタンスが一つも存在しないため、このソースコードでは反復できる対象セルがありません。そのため、結果はセルの塗りつぶし色が設定されません。

425

空のセルを反復

空のセルインスタンスをスキップせず、反復の対象セルとしたい場合、二つ目のパラメータを 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;
});

424

IterateCells メソッドを利用して反復を高速化

IterateCells メソッドは、空のセルインスタンスをスキップできるため、データ照合などの場合ではセルの反復を高速化できます。

Iterate Cells

例として、指定した範囲からセルのデータを集計する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 メソッド
動作スピード遅い速い
メモリ使用量多い少ない
ソースコードの簡潔さとても簡潔少し複雑
適切なケースデータの設定データの照合

ページの内容は役に立ちましたか?