ReoGrid
ReoGrid Version 4をリリースしました。多数の新機能に対応し、機能性・パフォーマンスの両面で大幅に強化されています。新機能の詳細については、こちらをご覧ください。
条件付きスタイル

条件付きスタイル(ConditionalStyles)

概要

条件付きスタイルは、数式の評価結果に基づいてセルのスタイル(背景色、文字色、フォントなど)を動的に変更する機能です。この機能により、データの値や条件に応じて自動的に視覚的な強調表示やフォーマットを適用できます。

基本概念

主要コンポーネント

  1. Rule(ルール): 条件付きスタイルの基本単位
    • Formula: 評価する数式(条件)
    • ApplyRange: スタイルを適用する範囲
    • Style: 条件が真の場合に適用するスタイル
    • NegativeNumberStyle: 負の数値の場合に適用する特別なスタイル(オプション)
  2. ConditionalStyleCollection: ワークシートの条件付きスタイルルールを管理するコレクション
  3. 数式エンジン: 各セルに対してルールの数式を評価

アクセス方法

条件付きスタイルは、ワークシートのConditionalStylesプロパティを通じてアクセスします:

var worksheet = grid.CurrentWorksheet;
var conditionalStyles = worksheet.ConditionalStyles;

基本的な使用方法

1. シンプルな条件付きスタイル

// 負の値を赤色で表示
var redTextStyle = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.TextColor,
    TextColor = SolidColor.Red,
};

worksheet.ConditionalStyles.Add(new Rule("THIS < 0", "A1:E10", redTextStyle));

2. 複数条件の設定

// 1000以上の値を太字にする
var boldStyle = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.FontStyleBold,
    Bold = true,
};

// 2000以上の値を青色にする
var blueTextStyle = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.TextColor,
    TextColor = SolidColor.Blue,
};

worksheet.ConditionalStyles.Add(new Rule("THIS >= 1000", "A1:E10", boldStyle));
worksheet.ConditionalStyles.Add(new Rule("THIS >= 2000", "A1:E10", blueTextStyle));

3. 背景色の条件付き変更

// 偶数の行を薄緑色の背景にする
var lightGreenBackground = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.BackColor,
    BackColor = SolidColor.LightGreen,
};

worksheet.ConditionalStyles.Add(new Rule("MOD(ROW(), 2) = 0", "A1:Z100", lightGreenBackground));

数式の構文

基本的なキーワード

キーワード説明
THIS現在評価中のセルの値THIS > 100
ROW()現在のセルの行番号(0ベース)ROW() > 10
COL()現在のセルの列番号(0ベース)COL() = 2
COLVAL(列)指定した列の値を取得COLVAL(A) > 500

COLVAL関数の使用例

// 同じ行のA列の値が"売"の場合、背景色を変更
var coralBackground = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.BackColor,
    BackColor = SolidColor.Coral,
};

worksheet.ConditionalStyles.Add(new Rule("COLVAL(A) = \"\"", "D1:D200", coralBackground));

// 前の列の値より大きい場合
worksheet.ConditionalStyles.Add(new Rule("THIS > COLVAL(THIS-1)", "B1:E10", highlightStyle));

// 列名で指定(ヘッダー名を使用)
worksheet.ConditionalStyles.Add(new Rule("COLVAL(\"価格\") > 1000", "A1:E100", expensiveStyle));

数学関数の使用

// SUM関数を使用した条件
worksheet.ConditionalStyles.Add(new Rule("SUM(A1:A10) > 1000", "B1:B10", totalStyle));

// ROUND関数を使用
worksheet.ConditionalStyles.Add(new Rule("ROUND(THIS) = 100", "A1:E10", roundStyle));

// MOD関数で偶数・奇数判定
worksheet.ConditionalStyles.Add(new Rule("MOD(THIS, 2) = 0", "A1:E10", evenStyle));

文字列関数の使用

// FIND関数で文字列検索
worksheet.ConditionalStyles.Add(new Rule("FIND(\"S\", COLVAL(A)) = 2", "C1:C100", findStyle));

// 文字列の比較
worksheet.ConditionalStyles.Add(new Rule("COLVAL(B) <> \"USD\"", "A1:Z30", currencyStyle));

高度な使用例

1. 負の数値に対する特別なスタイル

var positiveStyle = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.TextColor,
    TextColor = SolidColor.Green,
};

var negativeStyle = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.BackColor,
    BackColor = SolidColor.Red,
};

// 正の値は緑色、負の値は赤い背景
worksheet.ConditionalStyles.Add(new Rule("THIS != 0", "E1:E100", positiveStyle, negativeStyle));

2. 複雑な条件式

// 複数の条件を組み合わせ
var complexStyle = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.TextColor | PlainStyleFlag.FontStyleBold,
    TextColor = SolidColor.DarkBlue,
    Bold = true,
};

worksheet.ConditionalStyles.Add(new Rule(
    "COLVAL(B) = \"重要\" AND THIS > 1000", 
    "A1:E100", 
    complexStyle));

3. データソースとの連携

// データソースの特定の列に基づく条件
var importantDataStyle = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.BackColor | PlainStyleFlag.TextColor,
    BackColor = SolidColor.Yellow,
    TextColor = SolidColor.DarkRed,
};

worksheet.ConditionalStyles.Add(new Rule(
    "COLVAL(\"category\") = \"重要\"", 
    range, 
    importantDataStyle));

コレクション操作

ルールの追加・削除

// ルールの追加
var rule = new Rule("THIS > 500", "A1:E10", highlightStyle);
worksheet.ConditionalStyles.Add(rule);

// ルールの削除
worksheet.ConditionalStyles.Remove(rule);

// すべてのルールをクリア
worksheet.ConditionalStyles.Clear();

// ルールの存在確認
bool exists = worksheet.ConditionalStyles.Contains(rule);

// ルールの数を取得
int count = worksheet.ConditionalStyles.Count;

ルールの一覧取得

// すべてのルールを反復処理
foreach (var rule in worksheet.ConditionalStyles)
{
    Console.WriteLine($"Formula: {rule.Formula}, Range: {rule.ApplyRange}");
}

イベント処理

条件付きスタイルの変更イベント

// 条件付きスタイルが適用されたセルが変更された時のイベント
worksheet.ConditionalStyleCellChanged += (sender, e) =>
{
    Console.WriteLine("条件付きスタイルが適用されたセルが変更されました");
    
    // 適用されたセルのリストを取得
    var appliedCells = worksheet.ConditionalStyleApplyCells;
    Console.WriteLine($"適用されたセル数: {appliedCells.Count}");
};

パフォーマンス最適化

1. 更新の一時停止

// 大量のルールを追加する場合、更新を一時停止
worksheet.SuspendConditionalStyleUpdate = true;

try
{
    // 複数のルールを追加
    worksheet.ConditionalStyles.Add(rule1);
    worksheet.ConditionalStyles.Add(rule2);
    worksheet.ConditionalStyles.Add(rule3);
}
finally
{
    worksheet.SuspendConditionalStyleUpdate = false;
    // 手動で再適用
    worksheet.ApplyAllConditionalStyles();
}

2. 範囲の最適化

// 広すぎる範囲を避ける
// 悪い例:
worksheet.ConditionalStyles.Add(new Rule("THIS > 0", RangePosition.EntireRange, style));

// 良い例:
worksheet.ConditionalStyles.Add(new Rule("THIS > 0", "A1:E100", style));

デバッグとトラブルシューティング

1. 適用されたセルの確認

// 条件付きスタイルが適用されたセルを確認
var appliedCells = worksheet.ConditionalStyleApplyCells;
foreach (var cellPos in appliedCells)
{
    var cell = worksheet.GetCell(cellPos);
    Console.WriteLine($"セル {cellPos}: 値={cell.Data}, スタイル数={cell.ConditionalStyles.Count}");
}

2. ルールの無効化

// 一時的にルールを無効化
rule.Disabled = true;
worksheet.ApplyAllConditionalStyles(); // 再適用が必要

注意事項とベストプラクティス

1. 数式の構文エラー

// ❌ 間違い:先頭に"="を付けない
var rule = new Rule("=THIS > 100", "A1:E10", style); // エラー

// ✅ 正しい:
var rule = new Rule("THIS > 100", "A1:E10", style);

2. パフォーマンスの考慮

  • 範囲を必要最小限に: 全ワークシート範囲(RangePosition.EntireRange)の使用は避ける
  • 複雑な数式の制限: 非常に複雑な数式は評価に時間がかかる可能性がある
  • ルール数の管理: 大量のルールは処理速度に影響する

3. 数式のテスト

// 数式をテストする簡単な方法
worksheet["Z1"] = "=THIS > 100"; // 数式セルで動作確認

4. スタイルの優先順位

  • 条件付きスタイルは通常のセルスタイルの上に適用される
  • 複数の条件付きスタイルが同じセルに適用される場合、後から追加されたルールが優先される
  • NegativeNumberStyleは通常のStyleより優先される

5. メモリ管理

// 不要になったルールは削除する
worksheet.ConditionalStyles.Remove(unusedRule);

// ワークシート全体をクリアする場合
worksheet.ConditionalStyles.Clear();

6. Excel出力との互換性

⚠️ 重要な制限事項

  • 条件付きスタイルはExcel出力未対応: 現時点では、ReoGridの条件付きスタイルはExcelファイルへの出力・保存に対応していません
  • ReoGrid独自関数: THISCOLVALなどの関数はReoGrid独自の機能であり、Excelには存在しないため、Excelファイルに出力することはできません
// Excel出力時は条件付きスタイルは保存されない
worksheet.SaveAsExcel("output.xlsx"); // 条件付きスタイルは失われる

// ReoGrid独自の形式での保存が必要
worksheet.SaveRGF("output.rgf"); // 条件付きスタイルも保存される

実用的な応用例

1. 売上データの可視化

// 売上額に応じた段階的な色分け
var lowSalesStyle = new WorksheetRangeStyle { Flag = PlainStyleFlag.BackColor, BackColor = SolidColor.LightGray };
var mediumSalesStyle = new WorksheetRangeStyle { Flag = PlainStyleFlag.BackColor, BackColor = SolidColor.LightBlue };
var highSalesStyle = new WorksheetRangeStyle { Flag = PlainStyleFlag.BackColor, BackColor = SolidColor.LightGreen };

worksheet.ConditionalStyles.Add(new Rule("THIS < 1000", "C1:C100", lowSalesStyle));
worksheet.ConditionalStyles.Add(new Rule("THIS >= 1000 AND THIS < 5000", "C1:C100", mediumSalesStyle));
worksheet.ConditionalStyles.Add(new Rule("THIS >= 5000", "C1:C100", highSalesStyle));

2. 締切日の管理

// 今日の日付と比較して期限切れを強調
var overdueStyle = new WorksheetRangeStyle 
{ 
    Flag = PlainStyleFlag.BackColor | PlainStyleFlag.TextColor,
    BackColor = SolidColor.Red,
    TextColor = SolidColor.White
};

worksheet.ConditionalStyles.Add(new Rule("THIS < TODAY()", "D1:D100", overdueStyle));

3. 在庫管理

// 在庫不足の警告
var lowStockStyle = new WorksheetRangeStyle
{
    Flag = PlainStyleFlag.BackColor | PlainStyleFlag.FontStyleBold,
    BackColor = SolidColor.Orange,
    Bold = true
};

worksheet.ConditionalStyles.Add(new Rule("THIS <= 10", "E1:E100", lowStockStyle));

まとめ

条件付きスタイル機能は、データの動的な可視化において非常に強力なツールです。適切に使用することで、ユーザーがデータの重要な情報を一目で把握できるようになります。パフォーマンスと保守性を考慮しながら、効果的な条件付きスタイルを実装してください。


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