JexcelApi和POI匯入Excel日期識別成數字的解決方案
阿新 • • 發佈:2019-02-02
用過Jxl或者POI匯入Excel資訊的朋友應該都遇到過這樣的問題。日期格式的單元格有些會識別成數字單元格。(為什麼說有些呢?因為在Excel檔案中輸入2008-3-18的日期可以正確匯入,但是輸入3-18的就會識別成數字。)關於這個問題我找了很久,都沒有找到解答。現在解決了,所以記錄以下,一是怕以後忘了,二是希望遇到這個問題的朋友可以少走彎路。
首先來分析一下這個問題的成因。既然兩個開源包都有同樣的問題,說明可能是Excel內部就是這樣儲存的。所以需要通過一些其他的方式來從NUMERIC Cell中把這些日期找出來。
有兩種方式可以辨別NUMERIC Cell儲存的是否是日期:
方法一:如果用的是POI,可以直接用HSSFDateUtil.isCellDateFormatted(cell)這個方法。
Java程式碼
方法二:如果用的是Jxl,可以將cell.getCellFormat 強制轉換成 XFRecord。然後判斷XFRecord.formatIndex 如果等於 58就是DateCell。
Java程式碼
得到的這個double不能直接拿來用。轉換可以用HSSFDateUtil.getJavaDate(double date)這個方法。
首先來分析一下這個問題的成因。既然兩個開源包都有同樣的問題,說明可能是Excel內部就是這樣儲存的。所以需要通過一些其他的方式來從NUMERIC Cell中把這些日期找出來。
有兩種方式可以辨別NUMERIC Cell儲存的是否是日期:
方法一:如果用的是POI,可以直接用HSSFDateUtil.isCellDateFormatted(cell)這個方法。
Java程式碼
- 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。
Java程式碼
- if (cell.getType() == CellType.NUMBER) {
- NumberCell nc = (NumberCell) cell;
- XFRecord xfr = (XFRecord) nc.getCellFormat();
- finalint 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)這個方法。