Чтение значений даты из ячейки Excel с использованием API POI HSSF

StackOverflow https://stackoverflow.com/questions/861877

Вопрос

Я использую API POI HSSF для своих манипуляций с Excel на Java.У меня есть значение даты «01.08.2009» в одной из ячеек Excel, и пока я пытаюсь прочитать это значение с помощью HSSF API, оно определяет тип ячейки как числовой и возвращает значение «Double» моей даты.См. пример кода ниже:

cell = row.getCell(); // date in the cell '8/1/2009'
switch (cell.getCellType()) {

case HSSFCell.CELL_TYPE_STRING:
    cellValue = cell.getRichStringCellValue().getString();
    break;
case HSSFCell.CELL_TYPE_NUMERIC:
    cellValue = new Double(cell.getNumericCellValue()).toString();
    break;
default:
}

Cell.getCellType() возвращает NUMERIC_TYPE, и, таким образом, этот код преобразует дату в двойную!:(

Есть ли способ прочитать дату так, как она есть в HSSF POI!?

Это было полезно?

Решение

Вы можете посмотреть:

HSSFDateUtil.isCellDateFormatted()

Дополнительную информацию о HSSFDateUtil см. в API ужасного формата электронной таблицы POI:

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFDateUtil.html

Это также предоставляет некоторые вспомогательные методы для возврата Excel. getExcelDate() и даты Java getJavaDate().Однако вам следует с осторожностью относиться к разным форматам дат...

Другие советы

Если вы хотите указать дату в том же формате, что и в файле Excel, вам следует использовать CellDateFormatter.Образец кода:

CellValue cValue = formulaEv.evaluate(cell);
double dv = cValue.getNumberValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
    Date date = HSSFDateUtil.getJavaDate(dv);

    String dateFmt = cell.getCellStyle().getDataFormatString();
    /* strValue = new SimpleDateFormat(dateFmt).format(date); - won't work as 
    Java fmt differs from Excel fmt. If Excel date format is mm/dd/yyyy, Java 
    will always be 00 for date since "m" is minutes of the hour.*/

    strValue = new CellDateFormatter(dateFmt).format(date); 
    // takes care of idiosyncrasies of Excel
}

Excel рассматривает дату и время как числа...Джон сказал это лучше, поэтому я не буду повторять его здесь...

Однако пример кода того, что вы задали в вопросе, находится по адресу http://poi.apache.org/spreadsheet/quick-guide.html#CellContents

Если вы используете POI 3.5, вы можете использовать следующее

метод cell.getDateCellValue().Это будет работать и для Excel 2007.

Начиная с POI 3.15 beta3, некоторые функции deprecated.Вы можете проверить формат данных и получить их в формате Java. Date.

SimpleDateFormat format = new SimpleDateFormat("");
String cellValue;
if(cell != null && cell.getCellTypeEnum() != CellType.STRING &&
    cell.getCellTypeEnum() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)){

    cellValue = format.format(cell.getDateCellValue());
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top