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 空,不知道何时算空 空就不要取值了吧

     

  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/MUMO/p/5853496.html
Copyright © 2011-2022 走看看