博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
新版POI如何获取日期类型的cell的值
阅读量:6849 次
发布时间:2019-06-26

本文共 2823 字,大约阅读时间需要 9 分钟。

使用POI读取Excel值的同学,一定为日期类型抓狂过!

POI对单元格日期处理很弱,没有针对的类型,日期类型取出来的也是一个double值,所以同样作为数值类型。即使使用cell.setCellType(CellType.STRING) 也还是会返回一个数字

 

网上大部分的方法是:

cell.getCellType()
但是在新版的POI中,比如3.15版,这个写法已经被放弃使用了。由于项目需要在下不能调整jar包,只好硬着头皮去解决。

 

后来发现了一个方法:

cell.getCellStyle().getDataFormatString() 可以判断单元格的格式类型,如下图

于是便可以使用如下方法判断:

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());}

使用这个方法判断的格式有限,如果能够限定单元格格式的话,这样是足够解决的。

 

但我的项目坑爹的是Excel中的日期格式也是不固定的,还需要另谋出路。

在调试的时候发现,明明就显示着这个cell的值,是个日期。

如上图,这个日期【31-一月-2005】并不在这个cell下的某一个子元素里,至少我找了很久是没找到。只能使用cell.toString() 得到

最后我的解决办法是:首先使用了cell.getCellStyle().getDataFormatString()判断,如果能得到就返回“yyyy/MM/dd”格式的日期。如果得不到,最后都返回cell.toString()。这样至少不会返回一个数字了,也不知道对其他类型的单元格有没有影响,目前跑了几张表没有报错

 

这种解决办法当然是不好的,肯定是有一种好的方法我没找到,如果哪位大侠找到了,烦请告知一声,在下拜谢了!

 


 

到最后果然还是找我麻烦了,【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     }

同学们慢慢理解吧,代码虽然挫了一点,也不能保证完全正确,但至少这种情况下是可以使用的。

 

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

 

你可能感兴趣的文章
UITextField的详细使用
查看>>
oracle触发器select into和cursor用法的区别
查看>>
TortoiseGit + msysgit 记住帐号密码方法及使用密匙的方法
查看>>
Python中的else
查看>>
zend_db连接mysql(附完整代码)(转)
查看>>
五个人二个月为什么不等于十个人一个月
查看>>
matlab 与 VC 混编函数参数传递<2>
查看>>
Silverlight for Windows Phone开发系列课程
查看>>
Ajax经典交互讲解
查看>>
如何让windows更高效?
查看>>
windows 搭建 subversion+TortoiseSVN
查看>>
windows8安装xna4.0不能开发Xbox和PC端游戏的解决办法
查看>>
jQuery.validate errorPlacement
查看>>
转载:linux vi命令详解
查看>>
EM算法原理
查看>>
System.Drawing.Color的颜色对照表
查看>>
一次滚动一屏的滚动条行为实现
查看>>
.NET面试题(三)
查看>>
自定义TreeList单元格 z
查看>>
【百度地图】- 学习.1
查看>>