Как читать ячейку Excel с датой с Apache POI?

Я использую Apache POI 3.6, я хочу прочитать файл Excel с такой датой 8/23/1991.

 switch (cell.getCellType()) {

   ...
   ...

   case HSSFCell.CELL_TYPE_NUMERIC:
     value = "NUMERIC value=" + cell.getNumericCellValue();
     break;

   ...

 }

Но он принимает числовой тип значения и возвращает значение, подобное этому 33473.0.

Я попытался использовать числовой тип ячейки, но безуспешно.

dbltemp=row.getCell(c, Row.CREATE_NULL_AS_BLANK).getNumericCellValue();

if (c == 6 || c == 9) {
    strTemp= new String(dbltemp.toString().trim());

    long tempDate = Long.parseLong(strTemp);
    Date date = new Date(tempDate);

    strVal = date.toString();
}

Как я могу исправить мою проблему?


person Venkat    schedule 30.06.2010    source источник


Ответы (8)


ПРИМЕЧАНИЕ. HSSFDateUtil устарел

Если вы знаете, в какой ячейке, то есть в позиции столбца, указано, что 0 в каждой строке будет датой, вы можете напрямую перейти к row.getCell(0).getDateCellValue().
http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFCell.html#getDateCellValue()

ОБНОВЛЕНИЕ: вот пример - вы можете применить это в приведенном выше коде переключателя. Я проверяю и печатаю числовое значение, а также значение даты. В этом случае в первом столбце моего листа есть даты, поэтому я использую row.getCell (0).

Вы можете использовать блок кода if (HSSFDateUtil.isCellDateFormatted .. непосредственно в корпусе коммутатора.

if (row.getCell(0).getCellType() == HSSFCell.CELL_TYPE_NUMERIC)
    System.out.println ("Row No.: " + row.getRowNum ()+ " " +
        row.getCell(0).getNumericCellValue());

    if (HSSFDateUtil.isCellDateFormatted(row.getCell(0))) {
        System.out.println ("Row No.: " + row.getRowNum ()+ " " + 
            row.getCell(0).getDateCellValue());
    }
}

На выходе

Row No.: 0 39281.0
Row No.: 0 Wed Jul 18 00:00:00 IST 2007
Row No.: 1 39491.0
Row No.: 1 Wed Feb 13 00:00:00 IST 2008
Row No.: 2 39311.0
Row No.: 2 Fri Aug 17 00:00:00 IST 2007
person JoseK    schedule 30.06.2010
comment
Я не могу получить никаких значений ... Если бы вы могли указать фрагмент кода, это было бы здорово ... - person Venkat; 30.06.2010
comment
Вызов DateUtil.isCellDateFormatted () будет шагом вперед на пути освобождения вашего кода от HSSF и XSSF. Используя глобальные родительские элементы вместо зависимых от XLS / XLSX дочерних HSSF / XSSF, вы можете сделать свой код более универсальным. - person Aram Paronikyan; 31.05.2014
comment
Пожалуйста, измените или удалите вторую ссылку. Он возвращает ошибку 404. - person Daniel T. Sobrosa; 31.07.2015
comment
Это сложно, потому что isCellDateFormatted также должен применяться к CELL_TYPE_FORMULA, если это формула даты. Если вы попытаетесь вызвать текстовую формулу, выдается исключение IllegalStateException. - person matias.g.rodriguez; 04.11.2016
comment
Я получаю Mon Apr 03 10:12:14 CEST 2017, у вас, например, с IST. Как я узнаю, что формат всегда один и тот же? поэтому я могу переформатировать его на Java. - person powder366; 11.12.2017
comment
@ Powder366: я не проверял это недавно, но поскольку это возвращает java.util.Date, это будет в местном часовом поясе пользователя и может быть отформатировано с использованием стандартного API - person JoseK; 12.12.2017
comment
В чем разница между DateUtil.getJavaDate (cell.getNumericCellValue ()) и cell.getDateCellValue ()? - person Luke; 04.01.2019
comment
Есть ли какая-нибудь информация о фактическом значении этого значения ячейки? - person Tomáš Zato - Reinstate Monica; 04.02.2019
comment
HSSFDateUtil устарел в версии 4.1.2 - person Aldo Canepa; 24.03.2020
comment
Вместо HSSFDateUtil просто используйте DateUtil (родительский класс HSSFDateUtil) - person Remigius Stalder; 03.08.2020

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

Если вам нужны данные в формате, который отображается в Excel, вам просто нужно отформатировать ячейку с помощью класса DataFormatter.

DataFormatter dataFormatter = new DataFormatter();
String cellStringValue = dataFormatter.formatCellValue(row.getCell(0));
System.out.println ("Is shows data as show in Excel file" + cellStringValue);  // Here it automcatically format data based on that cell format.
// No need for extra efforts 
person Chintan    schedule 22.02.2017
comment
Как его отформатировать в формате ISO? (ГГГГ-ММ-ДД) - person golimar; 30.11.2020

Вы можете использовать CellDateFormatter для получения даты в том же формате, что и в ячейке Excel. См. Следующий код:

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

    String df = cell.getCellStyle().getDataFormatString();

    strValue = new CellDateFormatter(df).format(date); 
}
person Abhishek Mishra    schedule 01.06.2018

Вам понадобится DateUtils: см. эту статью для подробностей.

Или, еще лучше, используйте JExcel Энди Хана вместо POI.

person duffymo    schedule 30.06.2010
comment
Я почти реализовал многие вещи в POI, мне очень жаль, что я не могу пойти ни на что только для этого ... Должно быть что-то ... Тем не менее, спасибо, duffymo - person Venkat; 30.06.2010
comment
DateUtils разберется с вами, если вы не можете переключиться на JExcel - person duffymo; 30.06.2010
comment
Эта ссылка мертва, но все еще доступна для WayBack. Тем не менее, я не вижу упоминания о DateUtils. - person beldaz; 30.08.2018
comment
Я полагаю, HSSFDateUtil имел в виду DateUtil. - person Evgeny Semionov; 27.11.2018

Если вы знаете номер ячейки, то я бы порекомендовал использовать метод getDateCellValue () Вот пример того же, что сработало для меня - java.util.Date date = row.getCell (). GetDateCellValue (); System.out.println (дата);

person user1416932    schedule 29.05.2019

Для чтения ячеек даты этот метод доказал свою надежность:

private LocalDate readCellAsDate(final Row row, final int pos) {
    if (pos == -1) {
        return null;
    }
    final Cell cell = row.getCell(pos - 1);
    if (cell != null) {
        cell.setCellType(CellType.NUMERIC);
    } else {
        return null;
    }
    if (DateUtil.isCellDateFormatted(cell)) {
        try {
            return cell.getDateCellValue().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        } catch (final NullPointerException e) {
            logger.error(e.getMessage());
            return null;
        }
    }
    return null;
}
person yglodt    schedule 13.07.2019

Попробуйте этот код.

XSSFWorkbook workbook = new XSSFWorkbook(new File(result));
    XSSFSheet sheet = workbook.getSheetAt(0);

    // Iterate through each rows one by one
    Iterator<Row> rowIterator = sheet.iterator();
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        // For each row, iterate through all the columns
        Iterator<Cell> cellIterator = row.cellIterator();

        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_NUMERIC:
                if (cell.getNumericCellValue() != 0) {
                    //Get date
                    Date date = row.getCell(0).getDateCellValue();



                    //Get datetime
                    cell.getDateCellValue()


                    System.out.println(date.getTime());
                }
                break;
            }
        }
    }

Надежда - помощь.

person superup    schedule 26.03.2020

person    schedule
comment
Пожалуйста, добавьте больше контекста к своему ответу. Просто написание кода в качестве ответа может быть не таким понятным для всех, кто читает ваш ответ. - person uzilan; 25.08.2020
comment
Он использует getDateCellValue в качестве других ответов здесь, но также использует SimpleDateFormat для форматирования значения даты, что является тем, что большинство пользователей хотели бы - person golimar; 30.11.2020