时间:2021-05-19
使用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中的字符串分割一点点判断,先放代码:
/** * 分多种格式解析单元格的值 * * @param cell 单元格 * @return 单元格的值 */ public static String convertCellToString(Cell cell){ //如果为null会抛出异常,应当返回空字符串 if (cell == null) return ""; //POI对单元格日期处理很弱,没有针对的类型,日期类型取出来的也是一个double值,所以同样作为数值类型 //解决日期2006/11/02格式读入后出错的问题,POI读取后变成“02-十一月-2006”格式 if(cell.toString().contains("-") && checkDate(cell.toString())){ String ans = ""; try { ans = new SimpleDateFormat("yyyy/MM/dd").format(cell.getDateCellValue()); } catch (Exception e) { ans = cell.toString(); } return ans; } cell.setCellType(CellType.STRING); return cell.getStringCellValue(); } /** * 判断是否是“02-十一月-2006”格式的日期类型 */ private static boolean checkDate(String str){ String[] dataArr =str.split("-"); try { if(dataArr.length == 3){ int x = Integer.parseInt(dataArr[0]); String y = dataArr[1]; int z = Integer.parseInt(dataArr[2]); if(x>0 && x<32 && z>0 && z< 10000 && y.endsWith("月")){ return true; } } } catch (Exception e) { return false; } return false; }同学们慢慢理解吧,代码虽然挫了一点,也不能保证完全正确,但至少这种情况下是可以使用的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
用cell[2].text取到值。但和通过cell[0].Text和cell[13].Text取的值都是""。应如何取到值呢?首先将ButtonField按钮的
日期类型区别及用途MySQL的日期类型有5个,分别是:date、time、year、datetime、timestamp。类型字节格式用途是否支持设置系统默认值
1.Trunc(date)trunc以指定的元素截取日期类型的数据语法:trunc(date,[format])date–日期格式的值format–日期格式如‘
JS提供了Date类型来处理时间和日期。Date类型内置一系列获取和设置日期时间信息的方法。下面我们简单的概述一下这个Date类型。大概看了一下Date类型的方
那你也许会问及,怎样获取当前系统日期的最大时间值,如yyyy-MM-dd23:59:59.997。我们可以使用DATEADD函数,来实现,以当前日期的午夜时间值