1. 程式人生 > >JexcelApi和POI匯入Excel日期識別成數字的解決方案

JexcelApi和POI匯入Excel日期識別成數字的解決方案

用過Jxl或者POI匯入Excel資訊的朋友應該都遇到過這樣的問題。日期格式的單元格有些會識別成數字單元格。(為什麼說有些呢?因為在Excel檔案中輸入2008-3-18的日期可以正確匯入,但是輸入3-18的就會識別成數字。)關於這個問題我找了很久,都沒有找到解答。現在解決了,所以記錄以下,一是怕以後忘了,二是希望遇到這個問題的朋友可以少走彎路。

首先來分析一下這個問題的成因。既然兩個開源包都有同樣的問題,說明可能是Excel內部就是這樣儲存的。所以需要通過一些其他的方式來從NUMERIC Cell中把這些日期找出來。

有兩種方式可以辨別NUMERIC Cell儲存的是否是日期:

方法一:如果用的是POI,可以直接用HSSFDateUtil.isCellDateFormatted(cell)這個方法。
Java程式碼 複製程式碼
  1. case HSSFCell.CELL_TYPE_NUMERIC:   
  2. if (HSSFDateUtil.isCellDateFormatted(cell)) {   
  3. double d = cell.getNumericCellValue();   
  4.         Date date = HSSFDateUtil.getJavaDate(d);   
  5.     }   
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程式碼
複製程式碼
  1. if (cell.getType() == CellType.NUMBER) {   
  2.     NumberCell nc = (NumberCell) cell;   
  3.     XFRecord xfr = (XFRecord) nc.getCellFormat();   
  4. finalint INDEX_OF_DATE = 58;   
  5. if(xfr.formatIndex == INDEX_OF_DATE) {   
  6.         Date date = HSSFDateUtil.getJavaDate(nc.getValue());   
  7.         content = dateformat.format(date);   
  8.     }    
  9. }  
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)這個方法。