V3 から V4 への移行ガイド

このガイドは、すでに ReoGrid V3(MIT ライセンスのオープンソース版)でアプリケーションを構築している開発者向けに、ReoGrid V4(商用ライセンス版)への移行手順をまとめたものです。

V3 は引き続きオープンソースとしてメンテナンスされています。V4 は別系列の商用製品で、機能が大幅に拡張されています。機能概要は V4 の新機能 をご覧ください。

要約

  • V4 の DLL に差し替えただけではコンパイルが通りません。 一部の公開クラス・インターフェース名が変更され、いくつかの例外型が削除され、データバインドやフィルター周りの API が再構成されています。
  • [Obsolete] による互換シムは提供していません。 V4 は旧名称を非推奨化せず、削除しています。
  • 破壊的変更は機械的に修正可能です。 多くのプロジェクトは、置換と数か所の構造修正で移行できます。コア API(Workbook, Worksheet, Cell, RangePosition, CellPosition, WorksheetRangeStyle など)は変更ありません。
  • 挙動変更は軽微で、Excel 互換性を高めるものです。 ソート時に数式が行とともに移動する、ゼロ除算が #DIV/0! を返す、などの Excel 寄りの挙動になりました。詳しくは下記セクション 2 を参照してください。
  • 配布方法. V4 は現在、ご購入後にカスタマーポータルから DLL を直接ダウンロードして頂く形で配布しています(NuGet パッケージは今後公開予定)。ルート名前空間 unvell.ReoGrid とアセンブリ名は変わっていないため、DLL 参照を差し替えるだけでビルド構成上の変更は完了します。V4 は net48 および net8.0-windows をターゲットとします。

1. コンパイルエラー系

V4 でビルドした際に最初に発生する破壊的変更です。いずれも機械的に修正できます。

A. アクション基底クラスのリネーム

BaseWorksheetActionWorksheetAction に名前が変更されました。

- public class MyAction : BaseWorksheetAction
+ public class MyAction : WorksheetAction

- void RunAction(BaseWorksheetAction action) { sheet.DoAction(action); }
+ void RunAction(WorksheetAction action) { sheet.DoAction(action); }

カスタムの Undo 可能アクションすべて、およびアクションを基底型で受け渡しているコードに影響します。なお、V4 では Worksheet.DoActionpublic に昇格しました(V3 では internal)。

B. アウトライン関連の型のリネーム

行・列のグルーピング(アウトライン)に関する基底クラスとインターフェースが、ReoGrid プレフィックスを外した名称になりました。

V3V4
ReoGridOutline(抽象クラス)BaseOutline
IReoGridOutline(インターフェース)IOutline
- IReoGridOutline g = sheet.GetOutline(RowOrColumn.Row, 0);
+ IOutline g = sheet.GetOutline(RowOrColumn.Row, 0);

RowOutline および ColumnOutline の具象型名は変わっていません。基底クラス・インターフェースのみが変更されています。

C. ヘッダー型のリネーム

ReoGridHeaderWorksheetHeader に変更されました。

- ReoGridHeader h = sheet.RowHeaders[0];
+ WorksheetHeader h = sheet.RowHeaders[0];

RowHeaderColumnHeader の名前は変わっていませんが、基底クラスが変更されています。

D. DropdownListCell の継承階層の変更

DropdownListCell の親クラスとして、新しい中間クラス DropdownListBaseCell が挿入されました。

V3:  CellBody → DropdownCell → DropdownListCell
V4:  CellBody → DropdownCell → DropdownListBaseCell → DropdownListCell

DropdownListCell を直接利用している場合は変更不要です。DropdownListCell を継承して protected メンバをオーバーライドしているカスタムクラスがある場合は、継承チェーンの変化に応じてオーバーライドの確認が必要です。なお、補完候補表示に対応した新しい兄弟型 ComboListCell も利用可能です。

E. 数式関連の例外クラスが削除

V4 では、数式評価エラーごとの個別例外クラスが廃止されました。以下の型は存在しません。

  • FormulaEvalutionException
  • FormulaNoNameException
  • FormulaParameterMismatchException
  • FormulaTypeMismatchException

これらを参照している catch ブロックはコンパイルエラーになります。V4 では、数式評価エラーは以下の方法で取得します。

  • Cell.FormulaStatusFormulaStatus 列挙体(InvalidName, InvalidValue など)
  • セルの表示値(#NAME?, #DIV/0!, #VALUE! など、Excel と同様の形式)

例外ベースのエラー処理を、ステータスチェックに置き換えてください。

- try { sheet.Recalculate(); }
- catch (FormulaNoNameException) { /* ... */ }
+ sheet.Recalculate();
+ if (sheet.Cells["A1"].FormulaStatus == FormulaStatus.InvalidName) { /* ... */ }

なお、構文解析時の例外(FormulaParseException、新規追加の FormulaSyntaxErrorException / FormulaLiteralTooLongException)は引き続き公開されており、catch 可能です。

F. IsValidAddress のリネーム(v4.3.0)

V3 のアドレス文字列形式を判定するメソッドは、命名を明確化するためリネームされました。

- if (RangePosition.IsValidAddress(addr)) { ... }
+ if (RangePosition.IsValidAddressFormat(addr)) { ... }

V4 では、より厳密な意味を持つ Worksheet.IsValidAddress(string) が追加されました(形式の検証に加え、範囲内であるかも確認)。さらに、検証と安全なパースを兼ねた Worksheet.IsValidCellAddress(string, out CellPosition) および Worksheet.IsValidRangeAddress(string, out RangePosition) も追加されています。新しいコードではこれらの利用を推奨します。

G. ConditionalStyleApplyCells の削除(v4.4)

ConditionalStyleApplyCells プロパティと ConditionalStyleApplyCellCollection クラスは削除されました。

セルに条件付きスタイルが適用されているかどうかを確認するには、以下を使用します。

// セル単位の軽量チェック
bool has = sheet.Cells["A1"].HasConditionalStyles;

// もしくは Worksheet 経由
bool has = sheet.HasConditionalStyle(0, 0);
bool has = sheet.HasConditionalStyle(new CellPosition("A1"));

2. 動作(セマンティクス)の変更

コンパイルは通りますが、挙動が V3 と異なる項目です。テストの結果が想定外になった場合は、ここを確認してください。

ソート時に数式が行と一緒に移動

V3 ではソート対象は値のみで、数式セルはその場に残っていました。V4 では、Excel と同様に数式も行と一緒に移動します。 ソート後も数式の位置を固定したい場合は、絶対参照($A$1)を使うか、ソート前に数式を値に置き換えてください。

条件付きスタイルが描画タイミングで評価

V3 ではセル編集のたびに条件付きスタイルを再評価していました。V4 では「dirty フラグ」を立てておき、描画サイクルごとにまとめて評価します。大規模シートでの応答性が大幅に向上しますが、データ代入の直後・次の描画前に「実効スタイル」を読み出すコードでは、まだ反映されていない可能性があります。描画外のコードでは HasConditionalStyles を確認し、必要に応じて明示的に再評価してください。

Excel 互換の数式パース

V4 では数式パーサーが Excel に近づいています。

  • 単項プラス演算子. =+D25-F8-F14 が正しく解釈されます(V3 ではエラー)。
  • 括弧や空白を含むシート名の引用. 'BS(USD)'!B3, 'My Sheet'!A1 が有効になりました。
  • 0 は FALSE と評価. IF(0, x, y)y を返します。0 以外の数値は TRUE として評価されます。0 ≠ FALSE を前提としていたコードは分岐結果が変わります。
  • ゼロ除算. =A1/0#DIV/0! を返し、Cell.FormulaStatusNormal から FormulaStatus.InvalidValue に変わります。
  • 文字列の数値変換(乗算). ="10"*220 を返します(V3 ではエラー)。
  • VLOOKUP / HLOOKUP / MATCH / XMATCH / XLOOKUP が実装されました。近似一致を使用する場合は、Excel と同様にデータが昇順または降順にソートされている必要があります。

シートタブ描画・スクロール挙動・フォントルックアップ

ピクセル単位の UI スナップショットや視覚回帰テストを実施されている場合、スクロールバーの限界、フォントのフォールバック、シートタブ描画、ズーム時の文字スケーリングなどに微小な差異が生じます。これらは描画品質の改善であり、不具合ではありませんが、念のため再確認してください。

浮動小数点の精度補正

V4 では WorksheetOptions.FormulaCalculationPrecision が追加されました。デフォルトは NoPrecisionCorrection(V3 互換、最速、3.00000000000004 のような表示が出る可能性あり)です。Excel に近い表示を求める場合は LowPrecision に設定してください。

sheet.Options.FormulaCalculationPrecision = FormulaCalculationPrecision.LowPrecision;

3. 採用を検討すべき新 API

コンパイルが通り、既存テストが緑になった後に検討してほしい V4 機能です。いずれも追加機能で、移行に必須ではありません。

100 万行クラスのデータに対応する遅延ロード

worksheet.SetRows(1_000_000);
worksheet.AddDataSource(
    new RangePosition(0, 0, 1_000_000, 10),
    new MyDataSource(logs),
    DataSourceLoadMode.LazyLoading);

V3 の IDataSource<T> はチャート用途のみでしたが、V4 ではセル範囲にデータをバインドするための unvell.ReoGrid.Data.IDataSource<T> が新たに追加され、必要に応じて遅延ロードに対応します。

複数行ヘッダー

var ext = worksheet.ExtensionColumnHeader;
ext.SetRowCount(3);
ext.MergeCells(0, 1, 2, 1);
ext[0, 1].Text = "大分類";

条件付きスタイル

using unvell.ReoGrid.ConditionalStyle;

var rule = new Rule("THIS > 1000", "A1:Z30",
    new WorksheetRangeStyle {
        Flag = PlainStyleFlag.TextColor,
        TextColor = SolidColor.Yellow,
    });
sheet.ConditionalStyles.Add(rule);

THIS は現在のセルの値を参照する予約語です。

条件付きフィルター

using unvell.ReoGrid.Data.ConditionFilter;

var filter = new ConditionalDataFilter();
filter.Conditions.Add(new FilterCondition(2, ConditionOperator.NotEquals, "USD"));
sheet.DoFilter("A1:G30", filter);

3 段階のセルロック

V4 では Cell.IsLocked プロパティ(型は CellLock 列挙体:Locked, Unlocked, Inherit)が追加されました。V3 にはセル単位のロックモデルがありませんでした。

sheet.IsLocked = true;
sheet.Cells["C5"].IsLocked = CellLock.Unlocked;

注意:列挙体の値は Unlocked(大文字 1 つ)です。古いサンプルで UnLocked と書かれているものはタイポです。

Excel 互換のカスタム数値書式

cell.DataFormat = CellDataFormatFlag.Number;
cell.DataFormatArgs = "#,##0;[Red]-#,##0";

セル範囲を候補リストとした DropdownListCell

var listRange = sheet1.Ranges["G1:G3000"];
var dropdown = new DropdownListCell(listRange);
sheet1.Cells["A1"].Body = dropdown;

ワークブック全体のハイライト付きテキスト検索

using unvell.ReoGrid.TextSearch;

var session = new HighlightTextSearchSession(Workbook, keyword, Workbook.CurrentWorksheet);
session.Search();
session.MarkAllResultHighlight(SolidColor.Goldenrod);
session.NextMatch();

アウトラインの一括展開/折りたたみ・ボタン位置

sheet.OutlineButtonLocation = OutlineButtonLocation.Top;

var group = sheet.GetOutlineGroup(RowOrColumn.Row, 0);
group.CollapseAll();
group.ExpandAll();

WinAppDriver による UI 自動テスト

ReoGridControl.EnableUIAutomation = true;

すべての新機能は V4 新機能リリースノート を参照してください。

4. 移行チェックリスト

  1. V3 の DLL 参照を V4 の DLL(カスタマーポータルからダウンロード)に差し替え
  2. プロジェクトのターゲットが net48 または net8.0-windows であることを確認
  3. ビルドして、セクション 1(A〜G)のリネームエラーを修正
  4. 数式関連の catch ブロックを Cell.FormulaStatus のチェックに置き換え(セクション 1-E)
  5. 既存のテストスイートを実行し、ソート順・数式・ゼロ除算などの差異を確認(セクション 2)
  6. (任意)セクション 3 の新 API のうち、アプリケーションに合うものを採用

5. ライセンス

V4 は商用ライセンスの製品です。

V4 ProfessionalV4 Enterprise
利用可能端末数3 台以下無制限
技術サポート1 ヶ月3 ヶ月
価格価格表価格表

V3 は引き続き MIT ライセンスのオープンソースとして GitHub で公開されています。

6. お問い合わせ

このガイドに記載のない移行上の課題(特にカスタムセル型、カスタムアクション、大規模なデータバインド処理など)が発生した場合は、サポート窓口 までご連絡ください。V3 のパターンに対する V4 での最適な置き換え方法をご案内します。


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