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
как о странном виде инъекции зависимости .
Если вы знаете, какая ячейка, то есть позиция столбца, скажем, 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
Для чтения ячеек даты этот метод, оказалось, был устойчив до сих пор:
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;
}
Вам понадобится DateUtils: подробности см. В этой статье .
Или, еще лучше, используйте JExcel Энди Хана вместо POI.