Apache POI формула для проверки любой ячейки из диапазона не является пустой - PullRequest
0 голосов
/ 08 мая 2018

Я работаю с Apache POI, используя условное форматирование. Я хочу иметь возможность написать формулу, например, - если какой-либо из столбцов в указанном диапазоне не является числом, выделите все из них. Я пытаюсь использовать с формулой - ISNUMBER ($ J1: P1000). Но это не работает.

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

Если я попробую использовать только одну ячейку с формулой - ISNUMBER ($ J1), это сработает. Но я хочу условие, если любая из ячеек от J до P является числом, тогда сделайте некоторое выделение.

Подробная информация о коде для выделения некоторых ячеек на основе некоторого правила приведена в этом потоке, поэтому не повторяется - Apache POI - Условное форматирование - необходимо установить другой диапазон ячеек для правила и форматирования

1 Ответ

0 голосов
/ 09 мая 2018

Поскольку теперь я понимаю вопрос (также принял во внимание комментарии), необходимо выделить весь диапазон J1:P[n] (я возьму, например, J1:P1000), если какая-либо из ячеек в этом диапазоне содержит числовое содержимое. Это возможно с использованием формулы как ConditionalFormattingRule.

Базовые знания:

Условное форматирование (CF) работает с правилами, применяемыми к диапазону ячеек, и с форматами, которые можно использовать, если правило выполняется. Во время выполнения процесса CF каждая ячейка в примененном диапазоне проверяется на соответствие правилу. Если да, то будет использоваться формат, если нет, то нет.

Итак, если правило является формулой, то мы должны смотреть на эту формулу с точки зрения каждой отдельной ячейки в диапазоне. Там это играет важную роль являются ли ссылки на ячейки в формуле относительными или зафиксированы с использованием $.

В ссылках на ячейку $ может фиксировать как ссылку на столбец, так и ссылку на строку. Например, в A1 и ссылка на столбец, и ссылка на строку являются относительными. В $A1 ссылка на столбец A является фиксированной, а ссылка на строку относительной. В A$1 ссылка на столбец является относительной, а ссылка на строку 1 является фиксированной. В $A$1 фиксирована и ссылка на столбец A, и ссылка на строку 1. Так что эта последняя ссылка всегда будет ссылаться на ячейку A1.

Конкретные примеры:

В моем ответе Apache POI - Условное форматирование - необходимо установить другой диапазон ячеек для правила и форматирования , что связано с этим ответом, правило формулы: 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) будет больше 0, если любая ячейка в J1:P1000 содержит число.

So

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

применяется к CellRangeAddress.valueOf("J1:P1000") может работать как вы хотите.

С точки зрения одной ячейки для каждой ячейки COUNT должен учитывать весь диапазон. Вот почему все ссылки в $J$1:$P$1000 фиксированы и не являются относительными.

...