V5 は後方互換なしの全面再設計です。本ページは V4(unvell.ReoGrid4)を使ってきた方向けに
「何がどう変わったか」を対比します。機能そのものの有無ではなく API の形の違いに集中しています。
実際に移行を進める手順(判断材料・作業の順序・よくあるエラーへの対処)は V4 からの移行ガイド にあります。 本ページはその作業中に引く早見表です。
設計思想の変化
違いの多くはここから派生しています。
| 観点 | V4 | V5 |
|---|---|---|
| モデルと UI | ReoGridControl が入口。モデルは UI と密結合 | Workbook / Worksheet は UI 非依存。コントロール無しで完結 |
| セル値 | boxing された object(約 160 B/セル) | 16 バイトの CellValue 構造体 +共有文字列プール |
| スタイル | 可変 WorksheetRangeStyle + PlainStyleFlag | 不変 record StyleRecord(with で差分適用)+インターン |
| 色 | System.Drawing.Color | uint ARGB(コア・I/O は System.Drawing に依存しない) |
| プラットフォーム分岐 | #if WINFORM / WPF | クラス構造で分離(IGridGraphics の実装差し替え) |
| イベント | Worksheet 上に多数 | モデルはイベントを持たない。イベントはコントロール層のみ |
| 永続化 | RGF(XML)/BinaryFormatter | reogrid-json(Web 版と相互運用可能) |
名前空間・パッケージ
| V4 | V5 | |
|---|---|---|
| ルート名前空間 | unvell.ReoGrid | unvell.ReoGrid.Core(+ .Style .CellTypes .ConditionalFormatting .IO ほか) |
| WinForms コントロール | unvell.ReoGrid.ReoGridControl | unvell.ReoGrid.WinForms.ReoGridControl |
| WPF コントロール | 同名(#if 切替、unvell.ReoGridWPF.dll) | unvell.ReoGrid.Wpf.ReoGridControl(別アセンブリ) |
| パッケージ | unvell.ReoGrid4 / unvell.ReoGrid4.Wpf | unvell.ReoGrid.One / .One.Wpf / .One.Avalonia / .One.Core |
| XLSX / PDF | 本体 DLL に内蔵 | unvell.ReoGrid.IO.Excel / .IO.Pdf(One パッケージに同梱) |
V4 の ID は 4.x で凍結され、V5 は別 ID で配信されます。同一 ID の 5.x にすると、 バージョンを上げた瞬間にビルドが壊れるためです。
Workbook / Worksheet の作成
V4 はコントロール経由が基本で、画面なしの利用には ReoGridControl.CreateMemoryWorkbook() という
専用 API が必要でした。V5 はモデルを直接生成します。
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.CellTypes;
using unvell.ReoGrid.Core.ConditionalFormatting;
using unvell.ReoGrid.Core.Style;
var wb = new Workbook();
var ws = wb.AddWorksheet("Sheet1"); // 既定で 1,048,576 × 16,384(スパースなのでコストなし)
control.LoadWorkbook(wb); // UI に載せるときだけコントロールへ
control.CurrentWorksheet→control.ActiveWorksheet(モデル側はwb.ActiveWorksheet/wb.ActiveSheetIndex)- V4 の「シート=実サイズ」という考え方は廃止。V5 は常に Excel フル寸法でスパース格納します
セル値の読み書き — 最大の書き換えポイント
V4 の sheet["A1"] = 10 という object 代入は廃止されました。
ws.SetNumber(0, 0, 10);
ws.SetText(4, 0, "text");
ws.Cell("A1").SetNumber(10); // CellCursor(struct・チェーン可)
ws.Cell("B1").SetText("hello").SetStyle(style);
object? v = ws.GetObjectValue(0, 0); // object が欲しい場合
string display = ws.GetDisplayText(0, 0); // 書式適用後の表示文字列
- 値の実体は
CellValue構造体(Number/Boolean/DateTime/Text/Error)。GetValue/SetValueで直接扱えます - V4 の 1D / 2D
object[]一括流し込みに相当する糖衣はありません(ループで書きます) - 「ユーザー入力文字列 → 値」の変換(
=で数式、数値パース、TRUE/FALSE)はコントロールのSetActiveCellInput(text)を通します
数式
V4 は "=..." を値として代入していましたが、V5 は専用 API で、先頭の = を付けません。
ws.SetFormula(2, 0, "SUM(A1:A2)"); // 先頭の '=' は付けない
string? f = ws.GetFormula(2, 0); // "SUM(A1:A2)"
ws.Recalculate(); // 明示的な全再計算(通常は依存再計算が自動)
依存グラフによる自動再計算と、行列の挿入削除に伴う参照シフトは V5 が自動処理します。
クロスシート参照(Sheet2!A1)と定義名にも対応しています。
位置型
どちらも 0 始まりです。V5 は文字列パースを static Parse / TryParse に統一しました。
var pos = CellPosition.Parse("B3"); // "$B$3"・小文字可。TryParse あり
var range = RangePosition.Parse("B4:E6"); // "A1"・"$A$1:$C$3"・コーナー逆順も可
var cols = RangePosition.Parse("A:C"); // フル列
var rows = RangePosition.Parse("3:5"); // フル行
var num = RangePosition.FromBounds(3, 1, 5, 4);
// シート文脈で解決(フル列・行をシート寸法へクランプし、定義名も解決する)
var r1 = ws.ResolveRange("A:C");
var r2 = ws.ResolveRange("MyRange"); // TryResolveRange あり
シート修飾(Sheet1!A1:B2)は RangePosition.Parse では扱えません
(RangePosition はシート情報を持たないため)。Worksheet.ResolveRange か定義名 API を使います。
スタイル
PlainStyleFlag は廃止です。StyleRecord の **nullable プロパティ(null=未指定)**が
Flag の役割を兼ねます。
ws.SetCellStyle(r, c, (ws.GetCellStyle(r, c) ?? StyleRecord.Default)
with { BackgroundColor = 0xFFFFFF00u, Bold = true });
ws.SetRowStyle(3, new StyleRecord { Bold = true }); // 行・列の既定(O(1))
ws.SetColumnStyle(0, new StyleRecord { TextAlign = HAlign.Right });
- 範囲一括の
SetRangeStylesはWorksheetにありません。行・列単位は既定スタイルへ、 任意範囲はセルのループか、UI 経由ならcontrol.SetSelectionBackColor(...)系を使います - 継承解決後の実効スタイルは
ws.GetEffectiveStyle(r, c) - 色は
uintARGB(不透明の黄なら0xFFFFFF00u)。System.Drawing.Colorは WinForms 層のみ
罫線
BorderPositions ビットフラグとプリセット(RangeBorderStyle.BlackSolid など)は廃止され、
ws.Borders の側テーブルになりました。
var edge = new BorderEdge(BorderLineStyle.Solid, 0xFF000000u, 1);
ws.Borders.SetOutline(range, edge);
ws.Borders.SetEdge(r, c, BorderSide.Bottom, edge);
範囲内部の一括設定(V4 の InsideAll / InsideHorizontal 相当)は現状 outline のみで、
内部罫線はセルのループになります。UI の選択範囲には control.SetSelectionAllBorders(...) があります。
表示書式
CellDataFormatFlag と *FormatArgs は全廃され、Excel と同じ書式コード文字列に一本化されました。
XLSX との相互運用がロスレスになります。
ws.SetNumberFormat(range, "#,##0.00");
ws.SetNumberFormat(r, c, "yyyy/mm/dd");
ws.SetNumberFormat(r, c, "[Red]-#,##0;[Blue]#,##0"); // セクション・条件・色に対応
V4 の NumberNegativeStyle.RedBrackets などは書式コードで表現します(#,##0;[Red](#,##0))。
構造操作
| 操作 | V4 | V5 |
|---|---|---|
| 結合 | MergeRange(range) / UnmergeRange | ws.MergeRange(range) / ws.UnmergeAt(r, c)(判定は ws.Merges.IsMerged(r, c)) |
| 列幅・行高 | SetColumnsWidth(col, count, w) | ws.Columns.SetSize(i, w) / ws.Rows.SetSize(i, h)(非表示は SetHidden) |
| 挿入・削除 | InsertRows / DeleteRows ほか | 同名(結合・罫線・数式参照・セル型も自動でシフト) |
| フリーズ | worksheet.FreezeToCell(r, c) + FreezeArea | control.SetFreeze(rows, cols) — ビュー側の状態であり、モデルは持たない |
| アウトライン | GroupRows / CollapseOutline ほか | ws.GroupRows(row, count) / ws.UngroupRows / ws.RowOutlines |
| AutoFit | AutoFitColumnWidth | control.AutoFitSelectedColumns() / AutoFitSelectedRows()(測定は使用範囲のみ) |
セル型
V4 はセルごとに body インスタンスを代入していたため、セル数ぶんの実体ができました。 V5 はフライウェイトな記述子を範囲に割り当てます(100 万行のチェックボックス列でもエントリ 1 個)。
ws.SetCellType(3, 1, CheckboxCellType.Instance);
ws.SetCellType(range, new DropdownCellType(["Apple", "Orange"], editable: false));
ws.Cell("C3").SetCellType(new ProgressCellType(max: 100));
- 状態(チェックの有無・選択値)はセル値に格納されます。記述子は共有され、状態を持ちません
- V4 の body ごとのイベント(
btn.Clickなど)は廃止。コントロールのCellButtonClickedで受けます - 組込型: CheckBox / DropdownList / Progress / Button / Hyperlink + Sparkline(V5 で追加)
条件付き書式
V4 の ConditionalStyle は簡易な機構でしたが、V5 は OOXML 準拠のフルセットです
(cellIs / expression / containsText / colorScale / dataBar / top10 / aboveAverage /
duplicate / unique / iconSet、priority + stopIfTrue、XLSX 往復)。
ws.AddConditionalFormat(range, new CellIsRule
{
Operator = CfOperator.GreaterThan,
Value1 = CfValue.Num(100),
Style = new CfStyle { BackgroundColor = 0xFFFFC7CE, Color = 0xFF9C0006 },
});
コントロール
| V4 | V5 | |
|---|---|---|
| 選択範囲 | worksheet.SelectionRange / SelectRange(...) | control.Selection(取得)+ control.MoveTo(r, c)。モデルは選択状態を持たない |
| イベント | CellDataChanged・CellMouseDown/Up/Move・Before/AfterCellEdit ほか多数(Worksheet 上) | コントロール上の少数のみ(SelectionChanged・WorkbookChanged・ActiveSheetChanged・HistoryChanged・ZoomChanged・ContextMenuRequested・CellButtonClicked) |
| 編集 | StartEdit / EndEdit | BeginEdit(initial) / CancelEdit()、GetActiveCellInput() / SetActiveCellInput(text) |
| クリップボード | Copy / Cut / Paste | CopySelection() / CutSelection() / PasteClipboard() |
| コンテキストメニュー | 組込メニューあり | ContextMenuRequested でホスト側が構築 |
| 表示切替 | SetSettings(WorksheetSettings.View_ShowGridLine, ...) | control.ShowGridLines / ShowHeaders / ShowOutlines プロパティ |
イベントが少ないのは意図的な設計です。モデルがイベントを持たないことで、ヘッドレス利用時に 不要な通知経路を抱えずに済みます。
I/O
FileFormat 列挙による自動判別は無くなり、形式ごとの static クラスになりました。
| V4 | V5 | |
|---|---|---|
| XLSX 読み | wb.Load(path) | XlsxReader.Read(path)(ストリーミング。巨大ファイルは OpenVirtual) |
| XLSX 書き | wb.Save(path, FileFormat.Excel2007) | XlsxWriter.Write(wb, path) |
| ネイティブ形式 | RGF(SaveRGF) | RGF は廃止 → reogrid-json(ReoGridJsonIO.Write / Read) |
| CSV | worksheet.ExportAsCSV(path) | CsvIO.Write(ws) / CsvIO.Read(ws, text) |
| 印刷経由のみ | PdfExporter.Export(wb, path, settings)(V5 で新規) |
- V4 資産の移行経路は「V4 で XLSX 保存 → V5 で読み込み」です
- XLSX 読み込み時、数式は Excel のキャッシュ値を保持し、再評価しません(
Recalculate()で明示的に)
意図的に廃止したもの(復活しません)
RunScript / ReoScript、RGF、PlainStyleFlag、CellDataFormatFlag と *FormatArgs、
FileFormat 列挙、#if WINFORM / WPF、公開 API における System.Drawing 依存(コア・I/O)、
Android / iOS 対応。
移行チートシート
| やりたいこと | V4 | V5 |
|---|---|---|
| 値を書く | sheet["A1"] = 10 | ws.Cell("A1").SetNumber(10) |
| 値を読む | sheet.GetCellData<double>("A1") | ws.GetObjectValue(0, 0) / ws.GetValue(0, 0) |
| 数式 | sheet["A3"] = "=SUM(A1:A2)" | ws.SetFormula(2, 0, "SUM(A1:A2)") |
| 背景色 | SetRangeStyles(r, style { Flag = BackColor }) | SetCellStyle(… with { BackgroundColor = argb }) |
| 表示書式 | SetRangeDataFormat(r, Number, args) | ws.SetNumberFormat(r, "#,##0.00") |
| 罫線 | SetRangeBorders(r, Outside, BlackSolid) | ws.Borders.SetOutline(r, edge) |
| 結合 | MergeRange(r) | ws.MergeRange(r) |
| 列幅 | SetColumnsWidth(c, n, w) | ws.Columns.SetSize(c, w) |
| フリーズ | ws.FreezeToCell(r, c) | control.SetFreeze(rows, cols) |
| チェックボックス | sheet[r, c] = new CheckBoxCell() | ws.SetCellType(r, c, CheckboxCellType.Instance) |
| 保存 | wb.Save(path, FileFormat.Excel2007) | XlsxWriter.Write(wb, path) |
| 読込 | wb.Load(path) | XlsxReader.Read(path) |
| 選択取得 | worksheet.SelectionRange | control.Selection |
| アクティブシート | control.CurrentWorksheet | control.ActiveWorksheet |
ライセンスキーはそのまま使えます
V4 用に発行済みのキーは V5 でもそのまま通ります。再発行は不要です。 詳細は ライセンスキーの適用 を参照してください。