zoukankan      html  css  js  c++  java
  • POI读取Excel常见问题

       最近在做一个将excel导入到报表中的功能,使用了POI来实现,发现POI使用有诸多不便之处,先记录下来,以后可能考虑使用Openxml。

           1. 数值类型处理

           通过POI取出的数值默认都是double,即使excel单元格中存的是1,取出来的值也是1.0,这就造成了一些问题,如果数据库字段是int,那么就会wrong data type,所以需要对数值类型处理。

    1. Cell cell = null;// 单元格  
    2. Object inputValue = null;// 单元格值  
    3. if(!isEmpty(cell) && cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {  
    4.     long longVal = Math.round(cell.getNumericCellValue());  
    5.     if(Double.parseDouble(longVal + ".0") == doubleVal)  
    6.         inputValue = longVal;  
    7.     else  
    8.         inputValue = doubleVal;  
    9. }  

           这么处理后,单元格中的小数没有变化,如果是整数,也会取到整数。

           2. 日期类型处理

           很遗憾,POI对单元格日期处理很弱,没有针对的类型,日期类型取出来的也是一个double值,所以同样作为数值类型。

    1. Cell cell = null;// 单元格  
    2. Object inputValue = null;// 单元格值  
    3. if(!isEmpty(cell) && cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {  
    4.     if(DateUtil.isCellDateFormatted(c))// 判断单元格是否属于日期格式  
    5.         inputValue = cell.getDateCellValue();//java.util.Date类型  
    6. }  

           可以判断得到的Date是日期时间、日期还是时间,可以通过cell.getCellStyle().getDataFormat()来判断,这个返回 值没有一个常量值来对应,我本机是excel2013,测试结果是日期时间(yyyy-MM-dd HH:mm:ss) - 22,日期(yyyy-MM-dd) - 14,时间(HH:mm:ss) - 21,年月(yyyy-MM) - 17,时分(HH:mm) - 20,月日(MM-dd) - 58,有了这个,可以根据数据库字段类型,处理之后再入库,相当不方便。

           另外,如果单元格数据格式是自定义的日期格式,那么通过DateUtil.isCellDateFormatted(cell)判断不出来,而且该单元 格还是一个数值单元格,返回一个double值,这里比较2。针对这种方式,有两种解决方案,第一种,重写 DateUtil.isCellDateFormatted(cell)方法,开源的都有源码;第二 种,cell.getCellStyle().getDataFormatString()来判断,这个方法会返回格式字符串,通过这个字符串去匹配,再 处理。

           3. 数据有效性

           很奇怪,POI能生成数据有效性(下拉列表),却得不到,或者说我没找到方法去得到,蛋疼。

           附单元格数据类型:

    常量说明取值
    Cell.CELL_TYPE_NUMERIC 数值类型 cell.getNumericCellValue()
    或cell.getDateCellValue()
    Cell.CELL_TYPE_STRING 字符串类型 cell.getStringCellValue()
    或cell.toString()
    Cell.CELL_TYPE_BOOLEAN 布尔类型 cell.getBooleanCellValue()
    Cell.CELL_TYPE_FORMULA 表达式类型 cell.getCellFormula()
    Cell.CELL_TYPE_ERROR 异常类型
    不知道何时算异常
    cell.getErrorCellValue()
    Cell.CELL_TYPE_BLANK 空,不知道何时算空 空就不要取值了吧

     

  • 相关阅读:
    树形结构菜单,递归实现
    基于Vue的日历组件,可以标注重要日子
    关于element-ui级联菜单(城市三级联动菜单)和回显问题
    继承(面试问到)
    vue监听浏览器刷新
    Popover 弹出框,里面的表格点击后关闭弹窗
    el-table表格合并单元格
    对角线
    ElementUI中el-radio再次点击取消选中
    保留文本框换行和空格
  • 原文地址:https://www.cnblogs.com/MUMO/p/5853496.html
Copyright © 2011-2022 走看看