Apache POI-HSSF: получение десятичной дроби вместо текстовой строки - PullRequest
1 голос
/ 04 июня 2011

Я использую Apache POI-HSSF для работы с файлами Excel.

В моей электронной таблице есть ячейка, которая выглядит как "115".Я проверил, что он отформатирован как «Текст» (Format Cells -> Text).

Однако, когда я читаю его как row.getCell (0) .toString ()

эта строка: "115.0"

Это неверно.Я должен получить «115», поскольку он явно отформатирован как текст.Как я могу получить желаемый результат?Ячейка может быть чем угодно, числами или символами, и я ожидаю ту же строку, что и в ячейке.Спасибо

Ответы [ 2 ]

2 голосов
/ 04 июня 2011

Форматированный как текст не означает сохраненный как текст, они отличаются.Excel сохранил вашу ячейку как число, и когда вы спросите POI для ячейки, вы получите числовую ячейку обратно.

Если вы спросите ячейку, вы вернетесь, какой она, вы обнаружите, что она имеет типCELL_TYPE_NUMERIC, а не CELL_TYPE_STRING

Что вы, вероятно, захотите сделать, это использовать класс DataFormatter , чтобы отформатировать ячейку в соответствии с Excel.Тогда это будет выглядеть так, как вы ожидаете.(Как и ячейки, отформатированные как валюта, проценты и т. Д.)

1 голос
/ 16 апреля 2015

Вы должны вызывать метод HSSFCell.getCellType (), чтобы определить его тип.Вот метод, который обрабатывает ячейки типа String или Numeric.(Вы можете легко добавить другие типы.) Формат, используемый для чисел, будет допустимым форматом, но не обязательно будет соответствовать формату таблицы.(Это рассматривается ниже.)

public static String getCellStringValue(final HSSFCell cell) {
    int cellType = cell.getCellType();
    String value;
    if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
        // Locale is optional here
        DataFormatter dataFormatter = new DataFormatter(Locale.US);
        value = dataFormatter.formatCellValue(cell);
    } else {
        // HSSFCell.CELL_TYPE_STRING
        value = cell.getStringCellValue();
    } // more cell types are possible. Add whatever you need.
    return value;
}

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

public static String getCellStringValue(final HSSFCell cell) {
    int cellType = cell.getCellType();
    String value;
    if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
        // Locale is optional here
        DataFormatter dataFormatter = new DataFormatter(Locale.US);
        Format format = dataFormatter.createFormat(cell);
        value = format.format(cell.getNumericCellValue());
    } else {
        // HSSFCell.CELL_TYPE_STRING
        value = cell.getStringCellValue();
    } // more cell types are possible. Add whatever you need.
    return value;
}
...