Чтение чисел как строк из Excel в Java с POI

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам потребовалось получить числовые данные из ячеек Excel в виде строк в Java, то наилучшим решением будет использование класса DataFormatter из библиотеки Apache POI. Рассмотрим следующий пример:

Java
Скопировать код
DataFormatter formatter = new DataFormatter();
Sheet sheet = workbook.getSheetAt(0);

for (Row row : sheet) {
    for (Cell cell : row) {
        System.out.println(formatter.formatCellValue(cell));
        // Вы получаете значения ячеек, которые будут представлены точно так же, как в Excel
    }
}

Этот код игнорирует числовой формат данных и выводит их в виде текста, при этом сохраняя исходное визуальное представление.

Кинга Идем в IT: пошаговый план для смены профессии

Преодоление ограничений .toString()

Для корректного различения значений, которые могут визуально совпадать, например, "2" и "2.0", применение метода .toString() будет неэффективно. В то время как DataFormatter поможет избежать подобной путаницы:

Java
Скопировать код
Cell cell = ... // В эту переменную помещается ваша ячейка
DataFormatter formatter = new DataFormatter();
String textValue = formatter.formatCellValue(cell);
// Таким образом, "2.0" будет отличаться от "2"

Такой подход позволяет сохранить специфику форматирования, что крайне важно для данных типа номеров счетов или идентификаторов.

Стратегия работы с формулами

Обработка формул Excel требует особого подхода. В этом случае следует использовать комбинирование классов FormulaEvaluator и DataFormatter:

Java
Скопировать код
Workbook workbook = ... // Загружаете ваш документ Excel
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
DataFormatter formatter = new DataFormatter();

for (Row row : workbook.getSheetAt(0)) {
    for (Cell cell : row) {
        if (cell.getCellType() == CellType.FORMULA) {
            System.out.println(formatter.formatCellValue(cell, evaluator));
        } else {
            System.out.println(formatter.formatCellValue(cell));
        }
    }
}

При таком подходе формулы преобразуются в присущие им значения, а не в текст формулы.

Тип рабочей книги: выбираем правильный инструмент!

Важно выбрать соответствующую реализацию Workbook: HSSF подойдет для файлов с расширением .xls, тогда как для .xlsx будет подходить XSSF. В соответствии с этим выбор FormulaEvaluator также зависит от типа файла, будь то HSSFFormulaEvaluator или XSSFFormulaEvaluator.

При обработке больших файлов Excel лучшим выбором станет потоковая обработка с помощью SXSSFWorkbook из библиотеки Apache POI.

Детальнее о NumberToTextConverter

Для сохранения точности числовых значений без их округления необходимо использовать NumberToTextConverter от Apache POI:

Java
Скопировать код
double cellValue = ... // Число из ячейки
String preciseText = NumberToTextConverter.toText(cellValue);
// Так вы получите точное числовое значение в текстовом формате

Такой подход гарантирует максимально точное сохранение исходного числового значения.

Визуализация

Визуализируйте ячейки Excel как контейнеры, маркированные числами:

Markdown
Скопировать код
Ячейки Excel: [🔢1️⃣, 🔢2️⃣, 🔢3️⃣]

Вам нужно видеть их как текст, поэтому вы используете DataFormatter:

Java
Скопировать код
DataFormatter formatter = new DataFormatter(); // 🛠️
cellValue = formatter.formatCellValue(cell);   // 🪄📜

По итогу, числа представляются как текст:

Markdown
Скопировать код
Ячейки Excel: [🔠"1", 🔠"2", 🔠"3"]
// Все числа преобразованы в текст. Прощайте, числа!

DataFormatter не заменяет содержимое ячеек, а изменяет способ их восприятия в Java.

Итерация по типам ячеек

Перед преобразованием важно определить тип ячейки с помощью getCellType():

Java
Скопировать код
Cell cell = ... // Экземпляр ячейки
switch (cell.getCellType()) {
    case NUMERIC:
        // Применяем DataFormatter или NumberToTextConverter
        break;
    case STRING:
        // Просто берем текст из ячейки
        break;
    case FORMULA:
        // Сначала оцениваем формулу
        break;
    // Не забывайте проверить и другие типы ячеек
}

Полезные материалы

  1. Подробное руководство по работе с файлами Excel в Java при помощи Apache POI: Чтение файлов Excel в Java через Apache POI | CalliCoder.
  2. Документация, описывающая специфику работы со форматами HSSF и XSSF: Руководство по HSSF и XSSF от Apache POI.
  3. Форум для обсуждения вопросов чтения и записи файлов в Excel: java – Чтение и запись файлов Excel – Stack Overflow.
  4. Официальный исходник библиотеки Apache POI на GitHub: GitHub – apache/poi: Mirror ПО Apache POI.
  5. API-документация по управлению форматированием ячеек: DataFormatter (API-документация POI).
  6. Руководство по управлению большими файлами Excel: SXSSFWorkbook (API-документация POI).