【问题标题】:Apache POI formula to check any of the cell from the range is not blank用于检查范围内任何单元格的 Apache POI 公式不为空
【发布时间】:2023-03-16 19:30:01
【问题描述】:

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

【问题讨论】:

  • 您似乎不了解 CF 的工作原理。 ConditionalFormattingRule rule = sheetCF.createConditionalFormattingRule("NOT(ISNUMBER(J1))"); 应用于 CellRangeAddress.valueOf("J1:P1000") 匹配 CellRangeAddress 中满足规则的所有单元格。这是因为规则中的某处没有$,因此列字母和行号是相对的而不是固定的。
  • 我了解当 ISNUMBER(J1) 应用于 CellRangeAddress.valueOf("J1:P1000") 时,它匹配此范围内的任何单元格,并且只为匹配的单元格着色。但我希望当此范围内的任何单元格匹配时,为从 J 到 P 的所有单元格着色。
  • 我认为使用 CF 是不可能的。你能在Excel 的GUI 中创建那个CF 吗?如果没有,那么apache poi 也不能这样做。
  • 从角度来看,应用于CellRangeAddress.valueOf("J1:P1000") 的单个单元格ConditionalFormattingRule rule = sheetCF.createConditionalFormattingRule("(COUNT($J$1:$P$1000)>0)"); 可以随心所欲地工作。 COUNT 只计算数字。所以如果J1:P1000中的任何一个单元格包含一个数字,count就会大于0。请尝试。
  • 谢谢 Axel,这正是我想要的。但我并不完全理解 $J$1:$P$1000。据我了解,$J 是 J 列中的特定条目,只有 J(不带 $)是相对的,适用于 CellRangeAddress 中的所有单元格。 $J$1 是什么意思?

标签: java excel apache-poi


【解决方案1】:

根据我现在理解的问题(也考虑了 cmets),如果此范围内的任何单元格包含数字内容,则要求突出显示整个范围 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 只计算数字。因此,如果J1:P1000 中的任何单元格包含数字,COUNT($J$1:$P$1000) 将大于 0。

所以

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

应用于CellRangeAddress.valueOf("J1:P1000") 可以随心所欲地工作。

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

【讨论】:

  • 这是一个非常有用的解释。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
相关资源
最近更新 更多