新版POI如何獲取日期類型的cell的值

使用POI讀取Excel值的同窗,必定爲日期類型抓狂過!java

POI對單元格日期處理很弱,沒有針對的類型,日期類型取出來的也是一個double值,因此一樣做爲數值類型。即便使用cell.setCellType(CellType.STRING) 也仍是會返回一個數字正則表達式

 

網上大部分的方法是:
cell.getCellType()
可是在新版的POI中,好比3.15版,這個寫法已經被放棄使用了。因爲項目須要在下不能調整jar包,只好硬着頭皮去解決。spa

 

後來發現了一個方法:
cell.getCellStyle().getDataFormatString() 能夠判斷單元格的格式類型,以下圖3d


因而即可以使用以下方法判斷:調試

if("yyyy/mm;@".equals(cell.getCellStyle().getDataFormatString()) || "m/d/yy".equals(cell.getCellStyle().getDataFormatString()) || "yy/m/d".equals(cell.getCellStyle().getDataFormatString()) || "mm/dd/yy".equals(cell.getCellStyle().getDataFormatString()) || "dd-mmm-yy".equals(cell.getCellStyle().getDataFormatString())|| "yyyy/m/d".equals(cell.getCellStyle().getDataFormatString())){ return new SimpleDateFormat("yyyy/MM/dd").format(cell.getDateCellValue()); }

使用這個方法判斷的格式有限,若是可以限定單元格格式的話,這樣是足夠解決的。code

 

但個人項目坑爹的是Excel中的日期格式也是不固定的,還須要另謀出路。
在調試的時候發現,明明就顯示着這個cell的值,是個日期。orm

如上圖,這個日期【31-一月-2005】並不在這個cell下的某一個子元素裏,至少我找了好久是沒找到。只能使用cell.toString() 獲得blog

最後個人解決辦法是:首先使用了cell.getCellStyle().getDataFormatString()判斷,若是能獲得就返回「yyyy/MM/dd」格式的日期。若是得不到,最後都返回cell.toString()。這樣至少不會返回一個數字了,也不知道對其餘類型的單元格有沒有影響,目前跑了幾張表沒有報錯字符串

 

這種解決辦法固然是很差的,確定是有一種好的方法我沒找到,若是哪位大俠找到了,煩請告知一聲,在下拜謝了!get

 


 

到最後果真仍是找我麻煩了,【31-一月-2005】格式不行,必須轉成「yyyy/MM/dd」格式。

而後想,要不寫個正則表達式,經過判斷字符串的方式,來判斷出這種日期類型。坑爹了,正則不會寫。。。。。。。明明感受很簡單的,就是不對

再而後,耍小聰明,改爲經過使用java中的字符串分割一點點判斷,先放代碼:

 1   /**
 2  * 分多種格式解析單元格的值  3  *  4  * @param cell 單元格  5  * @return 單元格的值  6      */
 7     public static String convertCellToString(Cell cell){  8         //若是爲null會拋出異常,應當返回空字符串
 9         if (cell == null) 10             return ""; 11 
12         //POI對單元格日期處理很弱,沒有針對的類型,日期類型取出來的也是一個double值,因此一樣做爲數值類型 13         //解決日期2006/11/02格式讀入後出錯的問題,POI讀取後變成「02-十一月-2006」格式
14         if(cell.toString().contains("-") && checkDate(cell.toString())){ 15             String ans = ""; 16             try { 17                 ans = new SimpleDateFormat("yyyy/MM/dd").format(cell.getDateCellValue()); 18             } catch (Exception e) { 19                 ans = cell.toString(); 20  } 21             return ans; 22  } 23 
24  cell.setCellType(CellType.STRING); 25         return cell.getStringCellValue(); 26  } 27 
28     /**
29  * 判斷是不是「02-十一月-2006」格式的日期類型 30      */
31     private static boolean checkDate(String str){ 32         String[] dataArr =str.split("-"); 33         try { 34             if(dataArr.length == 3){ 35                 int x = Integer.parseInt(dataArr[0]); 36                 String y =  dataArr[1]; 37                 int z = Integer.parseInt(dataArr[2]); 38                 if(x>0 && x<32 && z>0 && z< 10000 && y.endsWith("月")){ 39                     return true; 40  } 41  } 42         } catch (Exception e) { 43             return false; 44  } 45         return false; 46     }

同窗們慢慢理解吧,代碼雖然挫了一點,也不能保證徹底正確,但至少這種狀況下是可使用的。

 

原創文章,歡迎轉載,轉載請註明出處!

相關文章
相關標籤/搜索