Как считать ячейку Excel, имеющую Дату с ПОИ Apache?

Imho более чистая альтернатива передает экземпляр EJB через Job JobExecutionContext

При подготовке Job

final JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(MY_INTERFACE, myInterface);

final Job myJob =
    JobBuilder.newJob(MyJob.class)
              .setJobData(jobDataMap)
              .build();

Внутри Job#execute [ 1115]

final JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
final MyInterface myInterface = (MyInterface) jobDataMap.get(MY_INTERFACE);

Реализация Quartz Job вообще не должна знать о контейнере JavaEE, в котором она работает. Это облегчит процесс обновления вашего кода / архитектуры в долгосрочной перспективе.
Кроме того, ваш Job должен заботиться только о своей единственной обязанности, а не о получении необходимых зависимостей.
Думайте о JobDataMap как о странном виде инъекции зависимости .

56
задан Jack 2 December 2015 в 17:27
поделиться

3 ответа

Если вы знаете, какая ячейка, то есть позиция столбца, скажем, 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
97
ответ дан 26 November 2019 в 17:20
поделиться

Для чтения ячеек даты этот метод, оказалось, был устойчив до сих пор:

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;
}
0
ответ дан 26 November 2019 в 17:20
поделиться

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

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

0
ответ дан 26 November 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: