このガイドは、すでに 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. アクション基底クラスのリネーム
BaseWorksheetAction は WorksheetAction に名前が変更されました。
- 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.DoAction が public に昇格しました(V3 では internal)。
B. アウトライン関連の型のリネーム
行・列のグルーピング(アウトライン)に関する基底クラスとインターフェースが、ReoGrid プレフィックスを外した名称になりました。
| V3 | V4 |
|---|---|
ReoGridOutline(抽象クラス) | BaseOutline |
IReoGridOutline(インターフェース) | IOutline |
- IReoGridOutline g = sheet.GetOutline(RowOrColumn.Row, 0);
+ IOutline g = sheet.GetOutline(RowOrColumn.Row, 0);
RowOutline および ColumnOutline の具象型名は変わっていません。基底クラス・インターフェースのみが変更されています。
C. ヘッダー型のリネーム
ReoGridHeader は WorksheetHeader に変更されました。
- ReoGridHeader h = sheet.RowHeaders[0];
+ WorksheetHeader h = sheet.RowHeaders[0];
RowHeader・ColumnHeader の名前は変わっていませんが、基底クラスが変更されています。
D. DropdownListCell の継承階層の変更
DropdownListCell の親クラスとして、新しい中間クラス DropdownListBaseCell が挿入されました。
V3: CellBody → DropdownCell → DropdownListCell
V4: CellBody → DropdownCell → DropdownListBaseCell → DropdownListCell
DropdownListCell を直接利用している場合は変更不要です。DropdownListCell を継承して protected メンバをオーバーライドしているカスタムクラスがある場合は、継承チェーンの変化に応じてオーバーライドの確認が必要です。なお、補完候補表示に対応した新しい兄弟型 ComboListCell も利用可能です。
E. 数式関連の例外クラスが削除
V4 では、数式評価エラーごとの個別例外クラスが廃止されました。以下の型は存在しません。
FormulaEvalutionExceptionFormulaNoNameExceptionFormulaParameterMismatchExceptionFormulaTypeMismatchException
これらを参照している catch ブロックはコンパイルエラーになります。V4 では、数式評価エラーは以下の方法で取得します。
Cell.FormulaStatus—FormulaStatus列挙体(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.FormulaStatusはNormalからFormulaStatus.InvalidValueに変わります。 - 文字列の数値変換(乗算).
="10"*2は20を返します(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. 移行チェックリスト
- V3 の DLL 参照を V4 の DLL(カスタマーポータルからダウンロード)に差し替え
- プロジェクトのターゲットが
net48またはnet8.0-windowsであることを確認 - ビルドして、セクション 1(A〜G)のリネームエラーを修正
- 数式関連の
catchブロックをCell.FormulaStatusのチェックに置き換え(セクション 1-E) - 既存のテストスイートを実行し、ソート順・数式・ゼロ除算などの差異を確認(セクション 2)
- (任意)セクション 3 の新 API のうち、アプリケーションに合うものを採用
5. ライセンス
V4 は商用ライセンスの製品です。
V3 は引き続き MIT ライセンスのオープンソースとして GitHub で公開されています。
6. お問い合わせ
このガイドに記載のない移行上の課題(特にカスタムセル型、カスタムアクション、大規模なデータバインド処理など)が発生した場合は、サポート窓口 までご連絡ください。V3 のパターンに対する V4 での最適な置き換え方法をご案内します。