在我的工具中,用户可以选择一种配置(通过组合框 - >多个数据表),相应的表格将反映在excel表格中,如下所示。列(行中的数据将有所不同)对所有人保持不变配置是产品名称,序列名称和长度1和总长度。不同的配置会添加诸如长度2,长度3,长度4(用户将在这些行中添加数据)等列。
我想在“总长度”列中添加条件格式设置公式,其中背景单元格在范围内(minval到maxval)将变为绿色,在超出范围时变为红色。我没有解决方案时遇到了我的代码。当用户在excel中添加数据时,它没有改变任何颜色。救命。谢谢!
表
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);
}
}
}
答案 0 :(得分:1)
您使用的条件格式表达式错误/包含语法错误/使用不存在的函数,这使得Excel会忽略它,因为它不理解它需要做什么。
查看代码,您有4个构成该表达式的变量:
RowNo
和ColNo
表示要将条件格式应用于minval
和maxval
是条件的下限和上限以下代码使用这些变量来构建正确的表达式:
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单元格时,其效果与宣传的相同。