条件样式允许您根据公式评估的条件动态更改单元格的外观。当条件满足时,指定的样式会自动应用到目标单元格。这对于数据可视化、高亮显示和警告提示非常有用。

创建条件样式规则

条件样式规则由三个组件组成:

  1. 公式 — 评估为 truefalse 的公式表达式
  2. 应用范围 — 应用样式的单元格范围
  3. 样式 — 条件为真时要应用的 WorksheetRangeStyle
var rule = new unvell.ReoGrid.ConditionalStyle.Rule(
    formula: "A1>100",
    applyRange: "A1:A100",
    style: new WorksheetRangeStyle
    {
        Flag = PlainStyleFlag.FillColor | PlainStyleFlag.TextColor,
        BackColor = Color.LightGreen,
        TextColor = Color.DarkGreen,
    }
);

规则属性

属性类型描述
Formulastring用于确定何时应用样式的公式
ApplyRangeRangePosition应用样式的单元格范围
StyleWorksheetRangeStyle条件为真时应用的样式
NegativeNumberStyleWorksheetRangeStyle单元格值为负数时应用的样式
Disabledbool设置为 true 以临时禁用此规则

构造函数重载

// 使用字符串范围地址
new Rule(string formula, string applyRange, WorksheetRangeStyle style,
    WorksheetRangeStyle negativeNumberStyle = null)

// 使用 RangePosition
new Rule(string formula, RangePosition applyRange, WorksheetRangeStyle style,
    WorksheetRangeStyle negativeNumberStyle = null)

向工作表添加规则

使用工作表上的 ConditionalStyles 集合来添加、移除或管理规则:

var sheet = grid.CurrentWorksheet;

// 添加规则:高亮值 > 100 的单元格
sheet.ConditionalStyles.Add(new Rule(
    formula: "A1>100",
    applyRange: "A1:A100",
    style: new WorksheetRangeStyle
    {
        Flag = PlainStyleFlag.FillColor,
        BackColor = Color.Yellow,
    }
));

多条规则

您可以添加多条规则。它们按顺序评估,多条规则可以应用于同一单元格:

// 规则 1:值 > 80 显示绿色背景
sheet.ConditionalStyles.Add(new Rule(
    formula: "B1>80",
    applyRange: "B1:B50",
    style: new WorksheetRangeStyle
    {
        Flag = PlainStyleFlag.FillColor | PlainStyleFlag.TextColor,
        BackColor = Color.LightGreen,
        TextColor = Color.DarkGreen,
    }
));

// 规则 2:值 < 20 显示红色背景
sheet.ConditionalStyles.Add(new Rule(
    formula: "B1<20",
    applyRange: "B1:B50",
    style: new WorksheetRangeStyle
    {
        Flag = PlainStyleFlag.FillColor | PlainStyleFlag.TextColor,
        BackColor = Color.LightCoral,
        TextColor = Color.DarkRed,
    }
));

负数样式

规则可以为负数单独设置样式:

sheet.ConditionalStyles.Add(new Rule(
    formula: "C1<>0",
    applyRange: "C1:C100",
    style: new WorksheetRangeStyle
    {
        Flag = PlainStyleFlag.TextColor,
        TextColor = Color.Black,
    },
    negativeNumberStyle: new WorksheetRangeStyle
    {
        Flag = PlainStyleFlag.TextColor,
        TextColor = Color.Red,
    }
));

管理规则

移除规则

sheet.ConditionalStyles.Remove(rule);

清除所有规则

sheet.ConditionalStyles.Clear();

检查规则数量

int count = sheet.ConditionalStyles.Count;

遍历规则

foreach (var rule in sheet.ConditionalStyles)
{
    Console.WriteLine($"Formula: {rule.Formula}, Range: {rule.ApplyRange}");
}

临时禁用规则

rule.Disabled = true;   // 禁用
rule.Disabled = false;  // 重新启用

重新应用条件样式

条件样式在单元格值变更时自动评估。如果需要手动触发重新评估(例如在批量数据更新后),请调用:

sheet.ApplyAllConditionalStyles();

挂起和恢复更新

为提升性能,您可以在批量操作期间挂起条件样式更新:

// 挂起更新
sheet.SuspendConditionalStyleUpdate = true;

// 执行批量数据操作
for (int i = 0; i < 10000; i++)
{
    sheet[i, 0] = i;
}

// 恢复更新并重新应用
sheet.SuspendConditionalStyleUpdate = false;
sheet.ApplyAllConditionalStyles();

检查已应用的样式

单元格上

每个单元格都有一个 ConditionalStyles 属性,包含当前已应用的条件样式列表:

var cell = sheet.Cells["A1"];
if (cell.ConditionalStyles != null && cell.ConditionalStyles.Count > 0)
{
    foreach (var style in cell.ConditionalStyles)
    {
        Console.WriteLine($"Applied: BackColor={style.BackColor}");
    }
}

事件:条件样式单元格变更

监听受条件样式影响的单元格的变更:

sheet.ConditionalStyleCellChanged += (s, e) =>
{
    Console.WriteLine("Conditional style cells were updated");
};

完整示例

以下是一个使用颜色编码规则高亮销售数据的完整示例:

var sheet = grid.CurrentWorksheet;

// 设置表头
sheet["A1"] = "Product";
sheet["B1"] = "Sales";

// 设置数据
sheet["A2:A6"] = new object[] { "Widget A", "Widget B", "Widget C", "Widget D", "Widget E" };
sheet["B2:B6"] = new object[] { 150, 45, 88, 12, 200 };

// 规则:高绩效(绿色)
sheet.ConditionalStyles.Add(new Rule(
    formula: "B2>=100",
    applyRange: "A2:B6",
    style: new WorksheetRangeStyle
    {
        Flag = PlainStyleFlag.FillColor | PlainStyleFlag.FontStyleBold,
        BackColor = Color.LightGreen,
        Bold = true,
    }
));

// 规则:低绩效(红色)
sheet.ConditionalStyles.Add(new Rule(
    formula: "B2<50",
    applyRange: "A2:B6",
    style: new WorksheetRangeStyle
    {
        Flag = PlainStyleFlag.FillColor | PlainStyleFlag.TextColor,
        BackColor = Color.MistyRose,
        TextColor = Color.DarkRed,
    }
));

相关主题

这篇文章对您有帮助吗?