Excel C#中的EPPLUS多列配置和条件格式

时间:2016-12-23 02:56:33

标签: c# excel-formula epplus conditional-formatting

在我的工具中,用户可以选择一种配置(通过组合框 - >多个数据表),相应的表格将反映在excel表格中,如下所示。列(行中的数据将有所不同)对所有人保持不变配置是产品名称,序列名称和长度1和总长度。不同的配置会添加诸如长度2,长度3,长度4(用户将在这些行中添加数据)等列。

我想在“总长度”列中添加条件格式设置公式,其中背景单元格在范围内(minval到maxval)将变为绿色,在超出范围时变为红色。我没有解决方案时遇到了我的代码。当用户在excel中添加数据时,它没有改变任何颜色。救命。谢谢!

enter image description here

     private void ManualFormatExcelandAddRules(ExcelWorksheet WS, DataTable DTtoFormat, int ColStartAddOfDT, int RowStartAddOfDT)
        {
            int colCountofDT = DTtoFormat.Columns.Count;
            int rowCountofDT = DTtoFormat.Rows.Count;
            double minval = 0;
            double maxval = 0;
            int flag = 0; 
            for (int Colno = ColStartAddOfDT; Colno < ColStartAddOfDT + colCountofDT; Colno++)
            {
                WS.Cells[RowStartAddOfDT, Colno].Style.Border.BorderAround(ExcelBorderStyle.Thin);
                for (int RowNo = RowStartAddOfDT + 1; RowNo <= RowStartAddOfDT + rowCountofDT; RowNo++)
                { if (WS.Cells[RowNo, Colno].Text.Contains("to") && WS.Cells[RowNo, ColStartAddOfDT].Text.Contains("DRAM"))
                        {
                            string[] GuidelineVal = WS.Cells[RowNo, Colno].Text.Split("to".ToArray(), StringSplitOptions.RemoveEmptyEntries).ToArray();
                            if (GuidelineVal[0].Trim() != "NA" && GuidelineVal[1].Trim() != "NA")
                            {
                                minval = Convert.ToDouble(GuidelineVal[0].Trim());
                                maxval = Convert.ToDouble(GuidelineVal[1].Trim());
                                flag = 0;
                            }
                            else
                                flag = 1;
                        }

                        else if (WS.Cells[RowNo, Colno].Text == "" && WS.Cells[RowStartAddOfDT + 1, Colno].Text.Contains("to"))
                        {


                            if (flag == 0)
                            {

                                string _statement = "AND(Convert.ToDouble(WS.Cells[RowNo, Colno].Text) >= minval,Convert.ToDouble(WS.Cells[RowNo, Colno].Text) <= maxval)";
                                var _cond = WS.ConditionalFormatting.AddExpression(WS.Cells[RowNo, Colno]);
                                _cond.Formula = _statement;
                                _cond.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                                _cond.Style.Fill.BackgroundColor.Color = Color.Green;                              

                            }
                            else
                                WS.Cells[RowNo, Colno].Style.Fill.BackgroundColor.SetColor(Color.Red);
                                WS.Cells[RowNo, Colno].Style.Border.BorderAround(ExcelBorderStyle.Thin);
                    }
   }
}

1 个答案:

答案 0 :(得分:1)

您使用的条件格式表达式错误/包含语法错误/使用不存在的函数,这使得Excel会忽略它,因为它不理解它需要做什么。

查看代码,您有4个构成该表达式的变量:

  • RowNoColNo表示要将条件格式应用于
  • 的单元格
  • minvalmaxval是条件的下限和上限

以下代码使用这些变量来构建正确的表达式:

string _statement = string.Format(
    CultureInfo.InvariantCulture,
    "AND({0}>={1},{0}<={2})",
    new OfficeOpenXml.ExcelCellAddress(RowNo, ColNo).Address, 
    minval, 
    maxval );
var _cond = WS.ConditionalFormatting.AddExpression(WS.Cells[RowNo, ColNo]);
_cond.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
_cond.Style.Fill.BackgroundColor.Color = Color.Green;

_cond.Formula = _statement;

请注意,表达式仅使用有效的Excel函数。你不能像Convert.ToDouble那样混合.Net语句。使用InvariantCulture进行数字转换也很重要,否则分隔符可能会被解释为函数中的额外参数。

调试时,_statement将包含:AND(A2>=40.2,A2<=44.5),当应用于A2单元格时,其效果与宣传的相同。