基于单元格值设置ClosedXML整行背景色(仅已用区域)
解决整行背景色按单元格选中值设置(仅作用于已用区域)的问题
嘿,我明白你想要的效果:当Action列选中"Edit"或"Delete"时,给整行设置对应背景色,而且只对已经有数据的行生效,不碰空白单元格。咱们来调整一下你的代码,完美实现这个需求!
现有代码的小问题
你当前的条件格式是对整个已用区域的所有单元格检查是否包含"Edit"/"Delete",这会导致只要单元格里有这些词就变色,但你其实只需要检查第三列(Action列)的值,然后给整行变色,同时确保规则只应用在已用数据的行范围内。
修改后的完整代码
class Program { static void Main(string[] args) { CreateWorkbook(); } static void CreateWorkbook() { var workbook = new XLWorkbook(); var ws1 = workbook.AddWorksheet("Main"); var ws2 = workbook.AddWorksheet("ListOfOptions"); // 设置下拉选项 var listOfStrings = new List<string>(); listOfStrings.Add(" "); listOfStrings.Add("Edit"); listOfStrings.Add("Delete"); ws2.Cell(2,2).InsertData(listOfStrings); ws1.Column(3).SetDataValidation().List(ws2.Range("B2:B4"), true); // 插入测试数据 var list = new List<Person>(); list.Add(new Person() { Name = "John", Age = 30, Action = " " }); list.Add(new Person() { Name = "Mary", Age = 15, Action = " " }); list.Add(new Person() { Name = "Luis", Age = 21, Action = " " }); list.Add(new Person() { Name = "Henry", Age = 45, Action = " " }); ws1.Cell(1, 1).InsertData(list.AsEnumerable()); // 获取已用区域(包含表头和数据行) var usedRange = ws1.RangeUsed(); // 从第二行开始(跳过表头)到已用区域的最后一行,作为条件格式的作用范围 var targetRows = ws1.Range($"{usedRange.FirstRow().RowNumber + 1}:{usedRange.LastRow().RowNumber}"); // 当Action列(第三列)等于"Edit"时,整行设为黄色 var editRule = targetRows.AddConditionalFormat(); editRule.Formula = $"$C{targetRows.FirstRow().RowNumber} = \"Edit\""; editRule.Fill.SetBackgroundColor(XLColor.Yellow); // 当Action列(第三列)等于"Delete"时,整行设为红色 var deleteRule = targetRows.AddConditionalFormat(); deleteRule.Formula = $"$C{targetRows.FirstRow().RowNumber} = \"Delete\""; deleteRule.Fill.SetBackgroundColor(XLColor.Red); ws2.Hide(); workbook.SaveAs("DemoWorkbook.xlsx"); } class Person { public string Name { get; set; } public int Age { get; set; } public string Action { get; set; } } }
关键修改点说明
- 精准锁定作用范围:先用
RangeUsed()获取已用区域,再指定从数据行(第二行)到最后一行作为条件格式的目标范围,彻底避免影响空白单元格 - 用公式精准匹配条件:改用Excel公式
$C行号 = "Edit"来检查每行第三列的精确值,这样只有当Action列选中对应选项时,整行才会变色 - 规则应用到整行:把条件格式绑定到目标行范围,公式里用绝对列引用
$C,确保每行都检查自己的Action列值
这样修改后,你的Excel文件就会按照预期工作:只有已用数据的行,在Action列选中"Edit"或"Delete"时,整行才会显示对应的背景色,完全不会影响未使用的空白单元格。
内容的提问来源于stack exchange,提问作者Andrei
相关产品推荐
相关产品推荐

