У меня есть файл Excel с таким содержимым:
A1: SomeString
A2: 2
Все поля имеют строковый формат.
Когда я читаю файл в Java, используя POI, он говорит, что A2 в числовом формате ячейки.
- Проблема в том, что значение в A2 может быть 2 или 2,0 (и я хочу иметь возможность их различать), поэтому я не могу просто использовать
.toString()
.
Что я могу сделать, чтобы прочитать значение в виде строки?
java
excel
apache-poi
joycollector
источник
источник
Я не думаю, что у нас был этот класс, когда вы задавали вопрос, но сегодня есть простой ответ.
То, что вы хотите сделать, это использовать класс DataFormatter . Вы передаете эту ячейку, и она делает все возможное, чтобы вернуть вам строку, содержащую то, что Excel покажет вам для этой ячейки. Если вы передадите ей строковую ячейку, вы получите строку обратно. Если вы передадите ей числовую ячейку с примененными правилами форматирования, она отформатирует число, основываясь на них, и вернет вам строку.
В вашем случае я бы предположил, что к числовым ячейкам применяется правило целочисленного форматирования. Если вы попросите DataFormatter отформатировать эти ячейки, он вернет вам строку с целочисленной строкой.
Кроме того, обратите внимание, что многие люди предлагают делать это
cell.setCellType(Cell.CELL_TYPE_STRING)
, но JavaDocs Apache POI совершенно ясно заявляют, что вы не должны этого делать ! ВыполнениеsetCellType
вызова приведет к потере форматирования, поскольку javadocs объясняют, что единственный способ преобразовать строку в оставшееся форматирование - это использовать класс DataFormatter .источник
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
Приведенный ниже код работал для меня для любого типа клеток.
источник
getCreationHelper().createFormulaEvaluator()
метод оценки формулы через метод. Таким образом, ваш код не будет связан с классом HSSFFormulaEvaluator.FormulaEvaluator
просто удалить из этого решения? Это служит цели?Я бы рекомендовал следующий подход, когда изменение типа ячейки нежелательно:
NumberToTextConverter может правильно преобразовать двойное значение в текст, используя правила Excel без потери точности.
источник
Как уже упоминалось в JavaDocs Poi ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ), не используйте:
но используйте:
Дополнительные примеры на http://massapi.com/class/da/DataFormatter.html
источник
Да, это работает отлично
рекомендуемые:
старый:
даже если у вас есть проблема с получением значения из
cell
формулы, все равно это работает.источник
Пытаться:
Должен правильно отформатировать номер.
источник
2
и2.0
. Ваше решение не будет делать это. (Но, тем не менее, добро пожаловать в Stack Overflow!)Пока ячейка находится в текстовом формате, прежде чем пользователь введет число, POI позволит вам получить значение в виде строки. Одним из ключей является то, что если в верхнем левом углу ячейки, отформатированной как текст, есть маленький зеленый треугольник, вы сможете получить его значение в виде строки (зеленый треугольник появляется всякий раз, когда что-то выглядит как число приведен в текстовый формат). Если у вас есть ячейки в формате Text, содержащие числа, но POI не позволит вам извлекать эти значения в виде строк, есть несколько вещей, которые вы можете сделать с данными электронной таблицы, чтобы:
Последнее, что вы можете сделать, это то, что если вы используете POI для получения данных из электронной таблицы Excel 2007, вы можете использовать метод класса getRawValue () класса Cell. Это не волнует, что формат. Он просто вернет строку с необработанными данными.
источник
Когда мы читаем числовое значение ячейки MS Excel, используя библиотеку Apache POI, оно читается как числовое. Но иногда мы хотим, чтобы он читался как строка (например, номера телефонов и т. Д.). Вот как я это сделал:
Вставьте новый столбец с первой ячейкой = CONCATENATE ("!", D2). Я предполагаю, что D2 - это идентификатор ячейки вашего номера телефона. Перетащите новую ячейку до конца.
Теперь, если вы читаете ячейку с помощью POI, она будет читать формулу вместо вычисленного значения. Теперь сделайте следующее:
Добавить другой столбец
Выберите полный столбец, созданный на шаге 1. и выберите «Правка» -> «КОПИЯ»
Перейдите в верхнюю ячейку столбца, созданного на шаге 3. и выберите «Правка» -> «Специальная вставка».
В открывшемся окне установите переключатель «Значения»
Выберите «ОК»
Теперь читайте, используя POI API ... после чтения в Java ... просто удалите первый символ, т.е. "!"
источник
У меня также была похожая проблема с набором данных из тысяч номеров, и я думаю, что нашел простой способ решения. Мне нужно было вставить апостроф перед числом, чтобы отдельный импорт БД всегда рассматривал числа как текст. До этого число 8 будет импортировано как 8.0.
Решение:
Привет Престо все числа, но хранятся в виде текста.
источник
getStringCellValue возвращает NumberFormatException, если тип ячейки числовой. Если вы не хотите менять тип ячейки на строку, вы можете сделать это.
источник
Многие из этих ответов ссылаются на старую документацию и классы POI. В новейшей POI 3.16 ячейка с типами int устарела
Вместо этого можно использовать перечисление CellType .
Просто убедитесь, что ваш pom обновлен с зависимостью poi, а также с зависимостью poi-ooxml до новой версии 3.16, иначе вы будете продолжать получать исключения. Одним из преимуществ этой версии является то, что вы можете указать тип ячейки во время ее создания, исключив все дополнительные шаги, описанные в предыдущих ответах:
источник
Я бы предпочел пойти по пути ответа или Винаяк Дорнала, к сожалению, они сильно повлияли на мою работу. Я пошел на HACKY решение неявного приведения:
Я не советую вам делать это, поскольку в моей ситуации это сработало из-за характера работы системы, и у меня был надежный источник файлов.
Сноска: numericColumn - это int, который генерируется из чтения заголовка обработанного файла.
источник
Я попробовал это, и у меня это сработало
источник
В любом случае вы контролируете лист Excel? Есть ли у пользователей шаблон для ввода? Если это так, вы можете иметь код формата входных ячеек для вас.
источник
Похоже, что это не может быть сделано в текущей версии POI, основываясь на том факте, что эта ошибка:
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
все еще выдающийся
источник
cell.setCellType (Cell.CELL_TYPE_STRING); у меня работает нормально
источник
Это сработало идеально для меня.
источник
У нас была та же проблема, и мы заставляли пользователей форматировать ячейки как «текст» перед вводом значения. Таким образом, Excel правильно сохраняет четные числа в виде текста. Если впоследствии формат изменяется, Excel только изменяет способ отображения значения, но не меняет способ хранения значения, пока значение не будет введено снова (например, путем нажатия клавиши возврата в ячейке).
Правильно ли Excel сохранил значение в виде текста, обозначается маленьким зеленым треугольником, который Excel отображает в левом верхнем углу ячейки, если считает, что ячейка содержит число, но форматируется как текст.
источник
приведите к int, затем сделайте
.toString()
. Это некрасиво, но это работает.источник