Чтение значений даты из ячейки Excel с использованием POI HSSF API - PullRequest
30 голосов
/ 14 мая 2009

Я использую POI HSSF API для манипуляций с 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!?

Ответы [ 5 ]

37 голосов
/ 14 мая 2009

Вы можете взглянуть на:

HSSFDateUtil.isCellDateFormatted()

См. API формата ужасной таблицы POI для получения дополнительной информации о HSSFDateUtil:

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

Это также предоставляет некоторые вспомогательные методы для возврата дат Excel getExcelDate() и Java getJavaDate(). Вы должны быть несколько осторожны с различными форматами даты, хотя ...

21 голосов
/ 31 августа 2011

Если вы хотите ссылаться на дату в том же формате, что и в файле 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
}
6 голосов
/ 04 августа 2010

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

Метод cell.getDateCellValue (). Это будет работать и в Excel 2007.

6 голосов
/ 14 мая 2009

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

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

0 голосов
/ 21 августа 2017

С 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());
}
...