ReoGrid V4 で作ったアプリケーションを V5(ReoGrid One)へ移行するための手順書です。
自動移行ツールはありません。 V5 は後方互換性のない全面再設計であり、コードの書き換えが必要です。 本ページは、その作業をどの順序で進めれば手戻りが少ないかをまとめたものです。
API がどう変わったかの一覧は V4 との違い にあります。 本ページは進め方に集中します。
1. まず、移行すべきかを判断する
移行は必須ではありません。 V4 は 4.x として継続しており、既存のアプリケーションが そのまま動かなくなることはありません。ライセンスキーも共通です。
次のいずれかに当てはまる場合、移行を検討する価値があります。
| 状況 | V5 で解決すること |
|---|---|
| 数万行以上を扱うとメモリや速度が厳しい | セルあたり約 16〜23 B(V4 は約 150〜200 B)、処理量は可視範囲に比例 |
| サーバーやバッチ処理でシートを扱いたい | Workbook / Worksheet が UI 非依存。画面なしで完結 |
| Linux / macOS でも動かしたい | Avalonia 版とヘッドレス版が対応 |
| PDF を直接出力したい | PdfExporter で 1 行。日本語フォント埋め込み済み |
| Web 版とファイルをやり取りしたい | reogrid-json が共通形式 |
逆に、次の場合は今は移行しないでください。
- .NET 10 へ上げられない。 V5 は .NET 10 以降のみです(net48 / net8 は非対応)
- 後述の「V5 にまだ無い機能」を使っている
工数の目安
書き換えは機械的な作業がほとんどです。おおよその目安として、 セル操作・書式・I/O が中心のアプリケーションであれば、数百行規模の書き換えで済みます。 時間がかかるのは、V4 の細かいイベントに依存した処理と、後述の機能ギャップへの対応です。
2. 事前確認 — 使っている機能が V5 にあるか
移行を始める前に、次のリストを確認してください。該当するものがあれば、そこが最大の課題です。
V5 にまだ無い機能
| 機能 | V4 での使用例 | 現時点の選択肢 |
|---|---|---|
| チャート | Chart/ の各種グラフ | 別のグラフライブラリと併用する/V4 に留まる |
| セルコメント | Comment | セル型やツールチップで代替する |
| 図形・テキストボックス | Drawing/ | 画像は V5 でも使えます |
| データバインディング | IDataSource / ArrayDataSource | ループで書き込む |
| 入力検証 | IValidator / CellValidation | 入力後に自前で検証する |
| テキスト検索 | TextSearch/ | 使用範囲を走査して自前で実装する |
| ReoScript | RunScript | 廃止済み。復活しません |
| 一部のセル型 | DatePicker / RadioButton / NumberInput / 画像系 | カスタムセル型として実装できます |
チャート・コメント・図形・データバインディング・入力検証・テキスト検索は V5.0 では対応していません。対応時期は未定で、ご要望を踏まえて検討します (リリースノートのロードマップ節参照)。 ライセンスはバージョン非依存(V4 / V5 共通)のため、これらの機能が必要な間は 同じライセンスで V4 をそのままご利用いただけます。
保存形式
| V4 の形式 | V5 |
|---|---|
RGF(.rgf) | 読めません。XLSX 経由で移行します(次節) |
| XLSX | そのまま読めます |
BinaryFormatter | 廃止 |
ライセンス
V4 用に発行済みのキーは V5 でもそのまま使えます。 再発行の申請は不要です。 1 本のキーで WinForms / WPF / Avalonia / ヘッドレスすべてを賄います (ライセンスキーの適用)。
3. データを移す
RGF ファイルは V5 では読めません。V4 が動くうちに XLSX へ変換してください。
① V4 のアプリケーション(または V4 の Editor)で .rgf を開く
② XLSX として保存する
③ V5 の XlsxReader.Read() で読み込む
この作業は V4 をアンインストールする前に済ませてください。 変換できるのは V4 だけです。
以降も RGF を読み書きし続ける必要がある場合は、移行の対象外として V4 を残す構成も検討してください。
4. プロジェクトを差し替える
.csproj を次のように変更します。
<PropertyGroup>
<!-- 変更前: <TargetFramework>net48</TargetFramework> -->
<TargetFramework>net10.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms> <!-- WPF なら <UseWPF>true</UseWPF> -->
</PropertyGroup>
<ItemGroup>
<!-- 変更前: <PackageReference Include="unvell.ReoGrid4" Version="4.*" /> -->
<PackageReference Include="unvell.ReoGrid.One" Version="5.0.0-alpha" />
</ItemGroup>
| V4 のパッケージ | V5 |
|---|---|
unvell.ReoGrid4 | unvell.ReoGrid.One |
unvell.ReoGrid4.Wpf | unvell.ReoGrid.One.Wpf |
| (なし) | unvell.ReoGrid.One.Avalonia・unvell.ReoGrid.One.Core |
V5 のパッケージには XLSX / PDF I/O が同梱されています。追加の参照は不要です。
5. using を書き換える
ここで大量のコンパイルエラーが出ますが、正常です。次の対応で大半が解決します。
| V4 | V5 |
|---|---|
using unvell.ReoGrid; | using unvell.ReoGrid.Core; |
| (WinForms コントロール) | using unvell.ReoGrid.WinForms; |
| (WPF コントロール) | using unvell.ReoGrid.Wpf; |
using unvell.ReoGrid.Graphics; | using unvell.ReoGrid.Core.Style; |
using unvell.ReoGrid.CellTypes; | using unvell.ReoGrid.Core.CellTypes; |
using unvell.ReoGrid.IO; | using unvell.ReoGrid.IO.Excel; / unvell.ReoGrid.Core.IO; |
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.CellTypes;
using unvell.ReoGrid.Core.Style;
全体の一覧は インストール にあります。
6. コードを書き換える
次の順序で進めてください。 依存関係の少ないものから直すと手戻りが減ります。
① ワークブックの生成
// V4: var sheet = reoGridControl.CurrentWorksheet;
// V4: var ws2 = reoGridControl.Worksheets.Create("Sheet2");
// V4: var wb = ReoGridControl.CreateMemoryWorkbook(); // 画面なしの場合
var wb = new Workbook();
var ws = wb.AddWorksheet("Sheet1");
control.LoadWorkbook(wb); // UI に載せるときだけ
var active = control.ActiveWorksheet; // V4: control.CurrentWorksheet
画面なしで使うための CreateMemoryWorkbook() は不要になりました。
V5 では new Workbook() が最初からコントロールに依存しません。
② セル値 — 最も書き換え量が多い箇所
// V4: sheet["A1"] = 10;
// V4: sheet[4, 0] = "text";
ws.SetNumber(0, 0, 10);
ws.SetText(4, 0, "text");
// V4: var s = sheet.GetCellData<string>("A2");
// V4: object v = sheet["A1"];
object? v = ws.GetObjectValue(0, 0);
string shown = ws.GetDisplayText(0, 0);
インデクサの挙動が変わっています(要注意)
// V4 の ws[0, 0] は object の get/set だった。
// V5 の ws[0, 0] は CellCursor を返す get 専用 —— 代入するとコンパイルエラーになる。
//
// ws[0, 0] = 10; // CS0200: 代入できない
//
// カーソル経由か、型付きメソッドを使う。
ws[0, 0].SetNumber(10);
ws.SetNumber(0, 0, 10);
代入はコンパイルエラーになるので気づけますが、読み出しは要注意です。
var v = ws[0, 0]; は V4 では値、V5 では CellCursor になります。
var で受けている箇所は型を確認してください。
V4 の object[] による一括流し込み(sheet["B5"] = new object[] {...})に相当する
糖衣はありません。ループで書いてください。
③ 数式
// V4: sheet["A3"] = "=SUM(A1:A2)"; // 値として代入していた
ws.SetFormula(2, 0, "SUM(A1:A2)"); // 先頭の '=' は付けない
// V4: string f = sheet.GetCellFormula("A3"); // "=SUM(A1:A2)" が返る
string? f = ws.GetFormula(2, 0); // "SUM(A1:A2)"('=' なし)
= の有無は最も間違えやすい点です。 ユーザーが入力した文字列(= で始まるかどうかで
判定したいもの)を扱う場合は、コントロールの SetActiveCellInput(text) を使ってください。
こちらは V4 と同じく = 付きの文字列を受け付けます。
④ スタイル
// V4: worksheet.SetRangeStyles(range, new WorksheetRangeStyle {
// V4: Flag = PlainStyleFlag.BackColor | PlainStyleFlag.FontStyleBold,
// V4: BackColor = Color.Yellow, Bold = true });
// V5: Flag は不要(null が「指定しない」)。色は uint ARGB。
for (int r = range.Row; r <= range.EndRow; r++)
for (int c = range.Col; c <= range.EndCol; c++)
ws.SetCellStyle(r, c, (ws.GetCellStyle(r, c) ?? StyleRecord.Default)
with { BackgroundColor = 0xFFFFFF00u, Bold = true });
PlainStyleFlag は廃止されました。StyleRecord のプロパティが null であること自体が
「指定しない」を意味します。色は System.Drawing.Color ではなく uint の ARGB です
(不透明の黄なら 0xFFFFFF00u)。
範囲一括の SetRangeStyles に相当するメソッドはありません。 ただし、
列全体・行全体に効かせたい場合はループにしないでください。
// 列・行の全体に効かせたい場合は、セルを回さず既定スタイルへ。
// V4 の SetRangeStyles(列全体) を素直に移すとセル数ぶん実体化する。
ws.SetColumnStyle(0, new StyleRecord { TextAlign = HAlign.Right });
ws.SetRowStyle(0, new StyleRecord { Bold = true });
これは移行時に最も性能差が出る箇所です。 V4 のコードをそのままループに置き換えると、 V5 の利点であるメモリ効率が失われます(スタイルの継承)。
UI の選択範囲に対しては control.SetSelectionBackColor(...) 系のヘルパがあり、
こちらは行・列全体の選択を自動的に判別します。
⑤ 罫線
// V4: worksheet.SetRangeBorders(range, BorderPositions.Outside,
// V4: RangeBorderStyle.BlackSolid);
ws.Borders.SetOutline(range, new BorderEdge(BorderLineStyle.Solid, 0xFF000000u, 1f));
BorderPositions のビットフラグとプリセットは廃止されました。範囲内部の罫線
(InsideAll 相当)は現状ループで設定します(罫線)。
⑥ 表示書式
// V4: worksheet.SetRangeDataFormat(range, CellDataFormatFlag.Number,
// V4: new NumberDataFormatter.NumberFormatArgs {
// V4: DecimalPlaces = 2, UseSeparator = true });
ws.SetNumberFormat(range, "#,##0.00");
CellDataFormatFlag と *FormatArgs は全廃され、Excel と同じ書式コードになりました。
V4 の NumberNegativeStyle.RedBrackets は #,##0;[Red](#,##0) のように書きます
(数値書式)。
⑦ 構造操作
// V4: worksheet.SetColumnsWidth(2, 1, 160);
ws.Columns.SetSize(2, 160);
// V4: worksheet.FreezeToCell(1, 1); // モデル側の状態だった
control.SetFreeze(1, 1); // V5 はビュー側
ウィンドウ枠の固定はビュー側に移りました。 そのため現時点では保存されません。 ファイルを開いた後に毎回設定する必要があります。
⑧ セル型
// V4: worksheet[3, 1] = new CheckBoxCell();
// V4: var dd = new DropdownListCell("Apple", "Orange");
// V4: worksheet["C3"] = dd;
// V4: dd.SelectedItemChanged += ...;
ws.SetCellType(3, 1, CheckboxCellType.Instance);
ws.SetCellType(RangePosition.Parse("C3:C100"),
new DropdownCellType(["Apple", "Orange"]));
// 状態はセル値。イベントはコントロール側で受ける。
ws.SetBoolean(3, 1, true);
セルごとにインスタンスを代入する方式から、範囲に記述子を割り当てる方式に変わりました。
セル型ごとのイベント(dd.SelectedItemChanged など)は廃止され、ボタンのクリックは
コントロールの CellButtonClicked で受けます(セル型の考え方)。
⑨ イベント
ここは単純な置き換えができません。 V4 は Worksheet 上に多数のイベントを持っていましたが、
V5 のモデル型はイベントを持ちません。イベントはコントロール層の 7 つだけです。
| V4 のイベント | V5 での対応 |
|---|---|
SelectionRangeChanged | control.SelectionChanged |
CellDataChanged | 相当するものがありません — 値を変える処理側で通知してください |
BeforeCellEdit / AfterCellEdit | 編集の開始・確定はコントロール操作から辿ります |
CellMouseDown / CellMouseMove など | control.ContextMenuRequested・CellButtonClicked で必要な範囲を受けます |
BeforePaste | 貼り付け前後の処理は呼び出し側で挟みます |
セルの変更を検知して別の処理を動かしている場合、その通知経路を自分で用意する必要があります。 多くの場合、値を書き込んでいる箇所は自分のコードなので、そこにフックを足すのが最短です。
⑩ ファイル入出力
| V4 | V5 |
|---|---|
wb.Load(path) | XlsxReader.Read(path) |
wb.Save(path, FileFormat.Excel2007) | XlsxWriter.Write(wb, path) |
worksheet.SaveRGF(path) | 廃止 → ReoGridJsonIO.Write(wb) |
worksheet.ExportAsCSV(path) | CsvIO.Write(ws) |
| (印刷経由のみ) | PdfExporter.Export(wb, path) |
FileFormat 列挙による自動判別はありません。形式ごとのクラスを直接呼びます。
XLSX を読み込んだ直後、数式は再評価されません。 Excel が保存したキャッシュ値が使われます。
自分で計算し直したい場合は sheet.Recalculate() を明示的に呼んでください
(XLSX 入出力)。
7. よくあるコンパイルエラーと対処
| エラー | 原因 | 対処 |
|---|---|---|
CS0200 プロパティまたはインデクサに代入できません | ws[r, c] = value | ws.SetNumber(r, c, v) / ws[r, c].SetNumber(v) |
CS0246 型 WorksheetRangeStyle が見つかりません | スタイル型の変更 | StyleRecord |
CS0246 型 PlainStyleFlag が見つかりません | 廃止 | 削除してよい(null が同じ役割) |
CS1503 Color から uint に変換できません | 色の型 | 0xAARRGGBB の uint にする |
CS0246 型 CellDataFormatFlag が見つかりません | 廃止 | SetNumberFormat(range, "書式コード") |
CS0117 BorderPositions に定義がありません | 廃止 | ws.Borders.SetOutline(...) / SetEdge(...) |
CS1061 CurrentWorksheet の定義がありません | 改名 | ActiveWorksheet |
CS1061 SelectionRange の定義がありません | ビューへ移動 | control.Selection |
CS1061 CellDataChanged の定義がありません | 廃止 | 通知経路を自前で用意する |
CS0246 型 FileFormat が見つかりません | 廃止 | XlsxWriter.Write(wb, path) |
コンパイルは通るのに挙動が変わるもの
ここが移行で最も見落としやすい箇所です。
| 症状 | 原因 |
|---|---|
| 数式が文字列として表示される | SetFormula に = を付けている |
var で受けた値が使えない | インデクサが CellCursor を返している |
| 起動が遅い・メモリを食う | 列全体の書式をセルのループで設定している |
| ウィンドウ枠の固定が保存されない | ビュー側の状態になったため(仕様) |
| 選択範囲が保存されない | 同上(仕様) |
8. 動作確認
移行後に確認することを挙げます。
- 既存の XLSX を読み込んで、表示が V4 と一致するか
- 書き出した XLSX を Excel で開いて崩れていないか
- 数式の計算結果が一致するか(
Recalculate()の要否を確認) - 数値書式の見た目が一致するか(分数・指数・和暦は未対応)
- 高 DPI 環境での表示(
Application.SetHighDpiMode(HighDpiMode.PerMonitorV2)) - 大きなデータでの起動時間とメモリ(改善しているはず。悪化していれば書式のループを疑う)
- ライセンスキーが通っているか(透かしが出ていないか)
移行チェックリスト
□ .NET 10 へ上げられることを確認した
□ 使っている機能が V5 にあることを確認した(チャート・コメント・図形・検証・検索・ReoScript)
□ RGF ファイルを XLSX へ変換した(V4 が動くうちに)
□ csproj の TFM とパッケージを差し替えた
□ using を書き換えた
□ セル値の読み書きを型付きメソッドへ移した
□ 数式から '=' を外した
□ スタイルを StyleRecord へ移した(列・行全体は既定スタイルへ)
□ 罫線・数値書式を新しい API へ移した
□ セル型を範囲割り当てへ移した
□ イベント依存の処理に代替の通知経路を用意した
□ ファイル入出力を形式ごとのクラスへ移した
□ 上記の動作確認を通した
移行しない部分を残す
すべてを一度に移す必要はありません。V5 のコアは UI に依存しないため、
既存の V4 アプリケーションはそのままに、新しいバッチ処理やサーバー機能だけを
V5(unvell.ReoGrid.One.Core)で書くという構成も取れます。
両者は XLSX を介してデータをやり取りできます。
次に読む
- V4 との違い — API 対比の早見表
- ライセンスキーの適用
- リリースノート — 今後の対応予定