Apache POI — Формула для определения максимальной длины символов в столбце

#java #excel #excel-formula #apache-poi

Вопрос:

привет всем,

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

                 String range = "MAX(LEN(A1:A3))";
                formulaCell.setCellFormula(range);
                formulaEvaluator.evaluateInCell(formulaCell);
 

Ниже приведен вопрос, с которым я сталкиваюсь

Формула, приведенная в коде, устанавливается как =MAX(LEN(@A1:A3)), из-за чего формула возвращает длину ячейки в той же строке, в которую вставляется формула.

Я не уверен, почему apache POI добавляет » @ » в формулу, если кто-нибудь, пожалуйста, дайте мне знать, есть ли какие-либо альтернативные способы.

Превосходить

Ответ №1:

Это не apache poi то, что вкладывает @ это в формулу. Excel 365 делает это потому, что часть формулы LEN(A1:A3) неверна для обычной формулы ячейки, так как LEN ожидает только один параметр, а не несколько или диапазон ячеек. Таким MAX(LEN(A1:A3)) образом, должна быть формула массива.

Поэтому, если бы вы задали формулу как таковую:

 ...
String formula = "MAX(LEN(A1:A3))";
//cell.setCellFormula(formula);
CellRange cellRange = sheet.setArrayFormula(formula, CellRangeAddress.valueOf("B1"));
...
 

Тогда Excel бы правильно обработал эту формулу.

Но FormulaEvaluator не может правильно оценить такие формулы массива. Это будет только оценка MAX(LEN(A1)) .

Поэтому apache poi , если необходимо знать максимальную длину символов в столбце, то единственный способ-выполнить итерацию по всем строкам (ячейкам) в этом столбце, получить длину содержимого ячейки для каждой ячейки и получить максимум.

Кстати.: Если кто-то задается вопросом, почему Excel 365 нет необходимости помещать эту формулу в виде формулы массива, используя CtrlShiftEnterи не используя маркеры массива ( {=MAX(LEN(A1:A3)} ) вокруг этой формулы:

Excel 365 имеет новую функцию, называемую формулами динамического массива. Эта функция обнаруживает формулы массива — в данном случае потому LEN , что в качестве аргумента используется диапазон ячеек, — а затем автоматически помечает такие формулы как массив. Дополнительно он помещает в ячейку информацию метаданных о том, что эта ячейка содержит формулу массива. Так что специальные маркеры {...} больше не нужны. Но apache poi не поддерживает эту новую функцию.