首先來分析一下這個問題的成因。既然兩個開源包都有同樣的問題,說明可能是Excel內部就是這樣存儲的。所以需要通過一些其他的方式來從NUMERIC Cell中把這些日期找出來。
有兩種方式可以辨別NUMERIC Cell儲存的是否是日期:
方法一:如果用的是POI,可以直接用HSSFDateUtil.isCellDateFormatted(cell)這個方法。
- case HSSFCell.CELL_TYPE_NUMERIC:
- if (HSSFDateUtil.isCellDateFormatted(cell)) {
- double d = cell.getNumericCellValue();
- Date date = HSSFDateUtil.getJavaDate(d);
- }
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
double d = cell.getNumericCellValue();
Date date = HSSFDateUtil.getJavaDate(d);
}
方法二:如果用的是Jxl,可以將cell.getCellFormat 強制轉換成 XFRecord。然後判斷XFRecord.formatIndex 如果等於 58就是DateCell。
if (cell.getType() == CellType.NUMBER) {
NumberCell nc = (NumberCell) cell;
XFRecord xfr = (XFRecord) nc.getCellFormat();
final int INDEX_OF_DATE = 58;
if(xfr.formatIndex == INDEX_OF_DATE) {
Date date = HSSFDateUtil.getJavaDate(nc.getValue());
content = dateformat.format(date);
}
}
if (cell.getType() == CellType.NUMBER) {
NumberCell nc = (NumberCell) cell;
XFRecord xfr = (XFRecord) nc.getCellFormat();
final int INDEX_OF_DATE = 58;
if(xfr.formatIndex == INDEX_OF_DATE) {
Date date = HSSFDateUtil.getJavaDate(nc.getValue());
content = dateformat.format(date);
}
}
得到的這個double不能直接拿來用。轉換可以用HSSFDateUtil.getJavaDate(double date)這個方法。