条件付きスタイル(ConditionalStyles)
概要
条件付きスタイルは、数式の評価結果に基づいてセルのスタイル(背景色、文字色、フォントなど)を動的に変更する機能です。この機能により、データの値や条件に応じて自動的に視覚的な強調表示やフォーマットを適用できます。
基本概念
主要コンポーネント
- Rule(ルール): 条件付きスタイルの基本単位
- Formula: 評価する数式(条件)
- ApplyRange: スタイルを適用する範囲
- Style: 条件が真の場合に適用するスタイル
- NegativeNumberStyle: 負の数値の場合に適用する特別なスタイル(オプション)
- ConditionalStyleCollection: ワークシートの条件付きスタイルルールを管理するコレクション
- 数式エンジン: 各セルに対してルールの数式を評価
アクセス方法
条件付きスタイルは、ワークシートの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独自関数:
THIS
、COLVAL
などの関数は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));
まとめ
条件付きスタイル機能は、データの動的な可視化において非常に強力なツールです。適切に使用することで、ユーザーがデータの重要な情報を一目で把握できるようになります。パフォーマンスと保守性を考慮しながら、効果的な条件付きスタイルを実装してください。