#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
не поддерживает эту новую функцию.