在文件excel文件上传之后,进行单个单元格的值进行处理以及验证。

对单元格的处理如下:

public Object getCellValue(Cell cell) {Object value = null;DecimalFormat df = new DecimalFormat("0"); // 格式化为整数SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 日期格式化switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:value = cell.getStringCellValue();break;case Cell.CELL_TYPE_NUMERIC:String dataFormat = cell.getCellStyle().getDataFormatString();    // 单元格格式boolean isDate = DateUtil.isCellDateFormatted(cell);if ("General".equals(dataFormat)) {value = df.format(cell.getNumericCellValue());} else if (isDate) {value = sdf.format(cell.getDateCellValue());} else {value = cell.getNumericCellValue();}break;case Cell.CELL_TYPE_BOOLEAN:value = cell.getBooleanCellValue();break;case Cell.CELL_TYPE_BLANK:value = "";break;default:break;}return value;}

可是我在使用的过程中,excel导入的日期格式无法进行判断,因为很多导入excel的人要求设置的是日期格式,而日期格式导入到java后台之后呈现的是一个5、6位数字的形式。

DateUtil提供了一个isCellDateFormatted(Cell cell)的方法进行判断excel该单元格的值是否为日期格式,返回值为布尔类型。

DateUtil.isCellDateFormatted(cell);

通常以上就可以进行判断了,可是我自己在使用的过程中发现判断不准确,一直返回的false。

查看源码之后才发现,原来它里面并没有对汉字进行替换,只是对如下的斜杠以及短横线等进行替换。所以在设置日期格式为2019年1月18日这种格式的时候,工具判断会出现问题。

fs = fs.replaceAll("\\\\-", "-");fs = fs.replaceAll("\\\\,", ",");fs = fs.replaceAll("\\\\.", ".");fs = fs.replaceAll("\\\\ ", " ");fs = fs.replaceAll(";@", "");fs = fs.replaceAll("^\\[\\$\\-.*?\\]", "");fs = fs.replaceAll("^\\[[a-zA-Z]+\\]", "");

解决办法有二:

1、直接修改jar包(修改了之后,对以后项目的迁移以及转换可能有点影响)

2、copy需要的代码,手动创建一个工具类进行判断。

这里贴上我自己修改后的工具类:

public static boolean isCellDateFormatted(Cell cell){if (cell == null) return false;boolean bDate = false;double d = cell.getNumericCellValue();if (isValidExcelDate(d)) {CellStyle style = cell.getCellStyle();if (style == null) return false;int i = style.getDataFormat();String f = style.getDataFormatString();bDate = isADateFormat(i, f);}return bDate;}public static boolean isADateFormat(int formatIndex, String formatString){if (isInternalDateFormat(formatIndex)) {return true;}if ((formatString == null) || (formatString.length() == 0)) {return false;}String fs = formatString;//下面这一行是自己手动添加的 以支持汉字格式wingzingfs = fs.replaceAll("[\"|\']","").replaceAll("[年|月|日|时|分|秒|毫秒|微秒]", "");  fs = fs.replaceAll("\\\\-", "-");fs = fs.replaceAll("\\\\,", ",");fs = fs.replaceAll("\\\\.", ".");fs = fs.replaceAll("\\\\ ", " ");fs = fs.replaceAll(";@", "");fs = fs.replaceAll("^\\[\\$\\-.*?\\]", "");fs = fs.replaceAll("^\\[[a-zA-Z]+\\]", "");return (fs.matches("^[yYmMdDhHsS\\-/,. :]+[ampAMP/]*$"));}public static boolean isInternalDateFormat(int format){switch (format) { case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 45:case 46:case 47:return true;case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44: } return false;}public static boolean isValidExcelDate(double value){return (value > -4.940656458412465E-324D);}

代码都是从源码copy出来后修改的,可以放心使用。

后记

遇到很多工具类不符合自己的预期以及网上人所说,可以尝试阅读一下源码,找一下问题所在,这样才是解决问题以及提升自己能力的最好的选择。

Excel导入时,日期格式的判断 isCellDateFormatted(Cell cell)不成功原因相关推荐

  1. java excel导入 日期_java导入excel时处理日期格式(已验证ok)

    在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171. 如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是 ...

  2. poi导入excel日期处理_POI处理Excel中各种日期格式问题

    前不久写过一篇随笔<EXCEL解析之终极方法WorkbookFactory>,提到使用WorkbookFactory来处理Excel文件数据,最近发现一个问题就是这个办法不能很好的处理各种 ...

  3. java导入excel时处理日期格式

    在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171. 如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是 ...

  4. EXCEl 时间戳转换为日期格式

    1. EXCEl 时间戳转换为日期格式 公式为:=TEXT((A2/1000+8*3600)/86400+70*365+19,"yyyy-mm-dd hh:mm:ss") 具体操作 ...

  5. Excel无法更改日期格式计算天数——糖潮丽子

    工作中我们可能遇到有关时间的数据,但是它并不是时间的格式,需求中我们需要进行计算天数等,此时我们就需要更改这些数据的格式位日期格式.但是,有时会出现更改后并未成功的情形,如下: 我们要将上面的额数据改 ...

  6. Excel调整各种日期格式为长日期年月日的操作

    看下图中的各种日期格式,今天小编要通过Excel调整各种日期格式为长日期0000年00月00日的格式-- (方方格子插件) ​ 1.先看动图演示吧 2.开始之前首先选中数据区域 ​ 3.然后选择方方格 ...

  7. poi 导入excel文件,日期格式的处理。

    poi 定时任务导入excel到数据库 花费了一些时间是现实定时任务下excel文件的定时导入功能,因为放入的文件excel格式不一样,所以可以自定义枚举,与对应的文件名进行区分. poi 版本是4. ...

  8. 在JAVA读取Excel数据的日期格式

    在ExcelReader类中.getStringCellValue()方法里: public static String getStringCellValue(Cell cell) { if(cell ...

  9. 使用PHPExcel判别和格式化Excel中的日期格式

    转自:http://renzhen.iteye.com/blog/799391 最近,在做一个导入功能,在系统中使用PHPExcel类库,读取上传的Excel文件,然后进行字段映射,最后将Excel内 ...

最新文章

  1. elasticsearch _field_stats 源码分析
  2. 技术解析系列 PouchContainer Goroutine Leak 检测实践
  3. java gc机制新区域旧屋_Java 内存回收机制——GC机制-Go语言中文社区
  4. 开始我的blog之旅
  5. 三层架构之抽象工厂加反射mdash;mdash;实现数据库转换
  6. 在EVE虚拟仿真环境里面安装Juniper防火墙,并通过Web做配置
  7. ubuntu 装完系统之后的简单配置
  8. 关系模型的完整性约束
  9. python凯撒密码流程图_python实现凯撒密码、凯撒加解密算法
  10. Python-爬取历史地震数据并可视化
  11. 如何设置谷歌搜索结果点击打开新页面
  12. 【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 c51
  13. Alkyne-PEG-MAL 炔烃PEG马来酰亚胺
  14. kaldi中文语音识别thchs30模型训练
  15. If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
  16. [ORACLE] ORA-03113错误解决方案
  17. glutSwapBuffers()和glFlush()区别
  18. 文件IO---标准输入、标准输出和标准错误
  19. nagios二次开发(四)---nagios监控原理和nagios架构简介
  20. 上传大文件(10G)的解决方案

热门文章

  1. EKF_SLAM简析
  2. RAPI 功能示例与说明
  3. Lingoes对Chrome的支持
  4. html序号自动缩进,word编号后怎么首行缩进
  5. Python办公自动化实战 10 | Python-docx库:Python与Word的完美结合_教你如何管理Word表格中的数据?让你庖丁解牛游刃有余
  6. exce中让两列数据一一对应_EXCEL表格如何匹配两列数据一样-EXCEL让两个表格中的两列数据一一对应...
  7. YYModel高性能 iOS数据模型转换
  8. 电子计算机机房折旧提几年,IDC设备资产运营中四种“折旧率计算”的常见方法...
  9. 分享112个HTML动植食物模板,总有一款适合您
  10. 小红书内容营销的必读推荐 小红书运营策划方案上海氖天