新版POI如何获取日期类型的cell的值
使用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;
}
同学们慢慢理解吧,代码虽然挫了一点,也不能保证完全正确,但至少这种情况下是可以使用的。
原创文章,欢迎转载,转载请注明出处!
新版POI如何获取日期类型的cell的值的更多相关文章
- js获取object类型所有的键值对
万物皆对象,而对象完全可以用键值对来表示,所以,在js中,也是通过键值对来表示对象的,在开发中,我在修改的时候,知道属性值可以直接用点.符号来获取值,但是写common.js的时候,发现这个属性名称是 ...
- angularjs之ng-mode获取lobject类型里的键值
有时候数据库定义的时候,用一个对象来代表某个属性,之后直接访问对象就可以获取全部该对象的属性,但是有时需求访问对象中包含中的键值,引用键值的时候可以直接用.来获取对象的键值,比如 对象points: ...
- Dapper基础知识四之 利用Dapper获取不同类型的主键值
在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. 一下是Dapper源码几种主键,当主键不包含"ID" ...
- selenium,统计某分支下有多少个同类子分支的方法(用于循环获取同类型子分支属性值)
利用selenium自动化统计微博阅读数 查看微博阅读数的元素路径 微博列表中第一条微博的元素路径“//*[@id="Pl_Official_MyProfileFeed__20"] ...
- [SharePoint]javascript client object model 获取lookup 类型的field的值,包括user类型(单人或者多人)的值。how to get the multiple user type/lookup type field value by Javascript client object model
1. how to get value var context = new SP.ClientContext.get_current(); var web = context.get_web(); v ...
- mysql5日期类型datetime查询范围值
1.DATE_FORMAT函数 SELECT a.create_time FROM account_log a WHERE a.create_time >= DATE_FORMAT('2014- ...
- js如何获取object类型里的键值
最近遇到一个问题: var obj = {"name1":"张三","name2":"李四"}; var key = & ...
- [Python]xlrd 读取excel 日期类型2种方式
有个excle表格须要做一些过滤然后写入数据库中,可是日期类型的cell取出来是个数字,于是查询了下解决的办法. 主要的代码结构 data = xlrd.open_workbook(EXCEL_PAT ...
- golang(3):strings和strconv使用 & 时间和日期类型 & 指针类型 & 流程控制 & 函数
strings和strconv使用 . strings.HasPrefix(s string, prefix string) bool: // 判断字符串s是否以prefix开头 . . string ...
随机推荐
- qmlscene: could not find a Qt installation of ''
qt └── helloqt.qml 在qt目录下运行helloqt.qml文件时出现这个提示: $ qmlscene helloqt.qml qmlscene: could not find a Q ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解
笔者没有学 ASP.NET,直接学 ASP.NET Core ,学完 ASP.NET Core MVC 基础后,开始学习 ASP.NET Core 的运行原理.发现应用程序有一个非常主要的 “传导体” ...
- Kafka 集群部署
kafka是一个分布式消息队列,需要依赖ZooKeeper,请先安装好zk集群 kafka安装包解压 $ -0.9.0.1.tgz $ -0.9.0.1 /usr/kafka $ cd /usr/ka ...
- intellij idea新建maven项目,一直loading archetype list.....
不知道什么时候开始,在idea里新建maven项目时,在new module页面,一直显示loading archetype list....,导致一直没办法新建.后来我以为是防火墙问题,各种设置还是 ...
- Eclipse安装Git插件(在线和离线)
在线安装: help-->install new software-->add location就是安装的地址:http://download.eclipse.org/egit/updat ...
- Android几行代码实现监听微信聊天
原创作品,转载请注明出处,尊重别人的劳动果实. 2017.2.7更新: *现在适配微信版本更加容易了,只需要替换一个Recourse-ID即可 *可以知道对方发的是小视频还是语音,并获取秒数. *可以 ...
- unity中camera摄像头控制详解
目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...
- ffmpeg sox 音频转换 MP3 转 wav
转自:https://blog.csdn.net/xiaoshulf/article/details/78657172 1 windows 下 mp3 文件和 wav 文件的 转换 实现代码: 1 f ...
- ABP中文文档及源码说明
目录 ABP.ModuleZero(ABP自带的一套用户模块) 版本管理(Edition) 特性管理(Feature)
- 详细聊聊k8s deployment的滚动更新(二)
一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 ● 相关的参数介绍: livenessProbe:存活性探测.判断pod是否已经停止 readinessProbe:就绪 ...