我正在使用条件格式处理Apache POI。我希望能够编写一个公式,例如-如果指定范围内的任何列都不是数字,则突出显示所有这些列。我正在尝试使用公式-ISNUMBER($ J1:P1000)。但这是行不通的。

ConditionalFormattingRule rule = sheetCF.createConditionalFormattingRule("ISNUMBER($J1:P1000))");


如果我只尝试使用公式-ISNUMBER($ J1)的单个单元格,它将起作用。但是我想确定如果从J到P的任何单元格都是数字,然后进行一些突出显示。

该线程中提供了基于某些规则突出显示某些单元格的代码的详细信息,因此不再重复-Apache POI - Conditional formatting - need to set different cell range for rule and formatting

最佳答案

就我现在所理解的问题(还考虑了注释)而言,要求突出显示整个范围J1:P[n](例如,我将使用J1:P1000),如果此范围内的任何单元格包含数字内容。使用公式作为ConditionalFormattingRule可以做到这一点。

背景知识:

条件格式(CF)的工作原理是将规则应用于一系列单元格,并且如果满足规则,则具有要使用的格式。 CF过程运行时,将测试应用范围内的每个单元格是否满足规则。如果是这样,将使用该格式,否则将不使用。

因此,如果规则是一个公式,那么我们必须从范围内每个单个单元格的角度来看这个公式。在那里发挥重要作用
公式中的单元格引用是相对的还是使用$固定的。

在单元格引用中,$可以固定列引用和行引用。例如,在A1中,列引用和行引用都是相对的。在$A1中,对列A的列引用是固定的,而行引用是相对的。在A$1中,列引用是相对的,而对1行的行引用是固定的。在$A$1中,对列A的列引用和对行1的行引用都是固定的。因此,最后一个引用将始终引用单元格A1

具体示例:

在与该答案相关的答案Apache POI - Conditional formatting - need to set different cell range for rule and formatting中,公式规则:AND(ISNUMBER($C1), $C1>5)应用于范围G1:L1000。因此,从G1:L1000中的单个单元格的角度来看,该规则检查以下内容:

$C列中的单元格值(因为此引用是固定的,所以总是在C列中),单个单元格所在的同一行中(因为行引用是相对的),数值是否大于5?

在注释中,我建议将规则AND(ISNUMBER($C1), $C1>5, G1="")应用于相同的范围G1:L1000。这与上述检查相同:

G:L列中存在单个单元格的单元格(由于列引用是相对的,因此并不总是在G列中),在单个单元格存在的同一行中(因为行引用是相对的),为空(等于一个空字符串)?

现在您的实际要求:

“如果此范围内的任何单元格包含数字内容,则突出显示整个范围J1:P1000

函数COUNT仅计算数字。因此,如果COUNT($J$1:$P$1000)中的任何单元格包含数字,则J1:P1000将大于0。

所以

ConditionalFormattingRule rule = sheetCF.createConditionalFormattingRule("(COUNT($J$1:$P$1000)>0)");


应用于CellRangeAddress.valueOf("J1:P1000")可以按需要工作。

从角度来看,每个单元格的单个单元格COUNT必须计算整个范围。这就是为什么$J$1:$P$1000中的引用都是固定的而不是相对的。

07-24 18:57
查看更多