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へ。 セルを回すと処理量が シート寸法に比例します - モデルはイベントを持たない。 変更を検知したい場合はコントロール層で受けます