Чтение значений даты из ячейки Excel с использованием API POI HSSF
-
21-08-2019 - |
Вопрос
Я использую 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());
}