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代碼

    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)這個方法。
發佈了22 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章