新版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     }

同窗们慢慢理解吧,代码虽然挫了一点,也不能保证彻底正确,但至少这种状况下是可使用的。

 

原创文章,欢迎转载,转载请注明出处!

相关文章
相关标签/搜索