Worksheet は 1 枚のシートです。セルの読み書き、数式、スタイル、行や列の挿入削除は すべてここから行います。イベントは持ちません — 変更通知が必要な場合は コントロール側のイベントを使います(イベント)。

値の読み書き

using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Style;

ws.SetNumber(0, 0, 1200);
ws.SetText(0, 1, "ノート");
ws.SetBoolean(0, 2, true);

// 型が実行時にしか決まらない場合
ws.SetObjectValue(0, 3, DateTime.Today);

object? raw = ws.GetObjectValue(0, 0);       // double / string / bool / DateTime / null
string shown = ws.GetDisplayText(0, 0);      // 数値書式を適用した表示文字列

ws.ClearCell(0, 3);

型付きの SetNumber / SetText / SetBoolean が基本です。SetObjectValue は型が実行時に 決まる場合の受け口で、内部で適切な種別に振り分けます。

読み出しには 3 段階あります。

目的メソッド
画面やレポートに出す文字列GetDisplayText(r, c) — 数値書式を適用済み
.NET の値として扱うGetObjectValue(r, c)
割り当てを避けて種別ごとに処理するGetValue(r, c)CellValue

GetFormattedText(r, c, out uint? color) は表示文字列に加えて、書式コードが指定する 文字色([Red] など)を返します。

数式

ws.SetFormula(2, 0, "SUM(A1:A2)");      // 先頭の '=' は付けない
bool has = ws.HasFormula(2, 0);
string? text = ws.GetFormula(2, 0);

ws.ClearFormula(2, 0);
ws.Recalculate();                        // 一括ロード後などに全再計算

SetFormula は数式を解析して依存関係を登録し、そのセルとそれに依存するセルを再計算します。 通常 Recalculate() は不要で、XLSX を読み込んだ直後など、まとめて計算し直したいときに使います。

スタイル

ws.SetCellStyle(0, 0, new StyleRecord { Bold = true });
ws.SetRowStyle(0, new StyleRecord { BackgroundColor = 0xFFEFEFEF });
ws.SetColumnStyle(3, new StyleRecord { TextAlign = HAlign.Right });

ws.RootStyle = ws.RootStyle with { FontFamily = "Meiryo UI", FontSize = 11f };

// 継承(セル ◁ 行 ◁ 列 ◁ シート)を解決した結果
StyleRecord effective = ws.GetEffectiveStyle(0, 0);

RootStyle はシート全体の既定です。継承の詳細は スタイルの継承 を参照してください。

行と列の挿入・削除

ws.InsertRows(3, 2);       // 3 行目に 2 行挿入
ws.DeleteRows(10, 1);
ws.InsertColumns(1, 1);
ws.DeleteColumns(5, 3);

セル値だけでなく、結合・罫線・セル型・条件付き書式・行列のメタ情報、そして数式の参照も まとめて追従します。削除された範囲を指していた参照は #REF! になります。

使用範囲

if (ws.TryGetUsedRange(out var used))
{
	// 空シートなら false。範囲全体を回す処理はここでクランプする
	Console.WriteLine($"{used.ToAddress()} / {used.CellCount} cells");
}

シート全体を反復する処理を書く前に、必ずここでクランプしてください。既定のシートは 1,048,576 行あるため、素朴なループは実質的に終わりません。

実在するセルだけを走査する

// 実在するセルだけを訪問する。空セルはコールバックされない
ws.ReadWindow(0, 0, rows: 50, cols: 20, (row, col, value, styleId) =>
{
	Console.WriteLine($"{row},{col} = {value.Kind}");
});

ReadWindow は指定した窓の中で値を持つセルだけを訪問します。使用範囲でクランプした 二重ループより速く、描画やエクスポートはこの形を使っています。

セルカーソル

ws.Cell(0, 0).SetNumber(10);
ws.Cell("B2").SetText("hello").SetStyle(new StyleRecord { Italic = true });

var cursor = ws.Cell("C3");
if (!cursor.IsEmpty)
	Console.WriteLine(cursor.ObjectValue);

Cell(...) が返す CellCursor は位置を覚えた構造体で、割り当てを伴いません。 同じセルに続けて操作するときに読みやすくなります。

既定サイズ

ws.SetDefaultSizes(rowHeight: 24, columnWidth: 100);

double dr = Worksheet.DefaultRowHeight;      // 20(論理ピクセル)
double dc = Worksheet.DefaultColumnWidth;    // 80

個別の行高・列幅は 行と列 を参照してください。

セル値以外の情報

結合や罫線のように「セル 1 個の値」では表せない情報は、それぞれ専用のプロパティが持ちます。

プロパティ内容
Rows / Columns行・列のサイズ、非表示、既定スタイル(行と列
Merges結合(セルの結合
Borders罫線(罫線
CellTypesセル型の割り当て(セル型
ConditionalFormats条件付き書式(条件付き書式
Images画像(画像
RowOutlines / ColumnOutlinesグループ化(アウトライン
PrintSettings印刷設定(印刷とページ設定
Formulas数式エンジン(数式

HasImages / HasCellTypes / HasConditionalFormats / HasRowOutlines のような Has* プロパティは、その機能を一度も使っていないシートでも安全に呼べます。 中身を作らずに有無だけを判定するため、毎フレーム呼んでも問題ありません。

性能上の注意

  • シート寸法ではなく使用範囲で考える。 TryGetUsedRange でクランプするか ReadWindow を使う
  • 行・列全体の書式は SetRowStyle / SetColumnStyle へ。 セルを回すと処理量が シート寸法に比例します
  • モデルはイベントを持たない。 変更を検知したい場合はコントロール層で受けます

次に読む

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