用于检查范围内任何单元格的Apache POI公式不为空白

时间:2018-05-08 06:54:32

标签: java excel apache-poi

我正在使用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

1 个答案:

答案 0 :(得分:1)

正如我现在理解的问题(也考虑了评论),要求是突出显示整个范围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")可以按您的意愿工作。

从{MBI}的每个单元格的单个单元格开始,COUNT必须计算整个范围。这就是为什么$J$1:$P$1000中的引用都是固定的并且不是相对的。