`
x10232
  • 浏览: 55157 次
  • 来自: 北京
社区版块
存档分类
最新评论

POI读取Excel时数据类型转换的问题

    博客分类:
  • Java
 
阅读更多
1. 数值类型处理

       通过POI取出的数值默认都是double,即使excel单元格中存的是1,取出来的值也是1.0,这就造成了一些问题,如果数据库字段是int,那么就会wrong data type,所以需要对数值类型处理。
    Cell cell = null;// 单元格  
    Object inputValue = null;// 单元格值  
    if(!isEmpty(cell) && cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {  
        long longVal = Math.round(cell.getNumericCellValue());  
        if(Double.parseDouble(longVal + ".0") == doubleVal)  
            inputValue = longVal;  
        else  
            inputValue = doubleVal;
    }  

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

注:由于电子表格只能支持15位数值的显示,当数值大于15位时会造成数据丢失,所以对于处理大于15位的学号身份证号等数值信息,建议以text格式存储,在读取的时候:
Long id=new Long(cell.toSting());




       2. 日期类型处理

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


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


转换成Timestamp格式:
Timestamp time=new Timestamp(inputValue.getTime());


       可以判断得到的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()来判断,这个方法会返回格式字符串,通过这个字符串去匹配,再处理。

       附单元格数据类型:


|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 空,不知道何时算空 空就不要取值了吧|
分享到:
评论

相关推荐

    java poi 读取excel 2007

    java poi读取excel 2007 存贮在list中

    Excel POI读取封装(文件+示范代码)

    Excel POI读取封装(文件+示范代码) package org.excel.service; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java....

    springMVC poi解析ajax上传excel文件,返回json对象\list数组

    将每行数据放入List[]> list = new Array List[]>(),并根据excel数据类型将器转换为字符串、数字、Boolean、公式、空值类型防止出现错误,最后返回一个list. 2. ExcelUtil.java工具类 解析通过MutilpartFile导入的...

    填充Excel列表工具Excel2Entity.zip

    该类库也实现了在创建实体对象时对字段类型进行校验,可以对Excel中的数据类型合法性进行校验,通过实现扩展接口,可以实现自定义校验规则以及自定义实体对象字段类型等更加复杂的校验规则和字段类型转换。...

    asp.net使用npoi读取excel模板并导出下载详解

    为什么要使用NPOI导出Excel? 一、解决传统操作Excel遇到的...Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含

    java开发常用jar包

    Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 commons-logging.jar: Apache Commons包中的一个,包含日志功能 commons-io.jar Apache Commons包中的一个,java.io...

    Java范例开发大全 (源程序)

     实例38 强制类型转换异常(ClassCastException) 56  实例39 索引越界异常(IndexOutOfBoundsException) 57  实例40 空指针异常(NullPointerException) 58  实例41 数字格式转换异常...

    java范例开发大全(pdf&源码)

    实例38 强制类型转换异常(ClassCastException) 56 实例39 索引越界异常(IndexOutOfBoundsException) 57 实例40 空指针异常(NullPointerException) 58 实例41 数字格式转换异常(NumberFornatException) 59 ...

    java范例开发大全源代码

     实例38 强制类型转换异常(ClassCastException) 56  实例39 索引越界异常(IndexOutOfBoundsException) 57  实例40 空指针异常(NullPointerException) 58  实例41 数字格式转换异常...

    java范例开发大全

    实例139 利用POI读取Word文件中的内容 208 7.3 字符流 209 实例140 按顺序创建文件 210 实例141 按顺序读取文件 211 实例142 追加文件内容 211 实例143 只显示文件中指定的字符 214 实例144 读取jar包文件 215 实例...

    Java范例开发大全(全书源程序)

    实例38 强制类型转换异常(ClassCastException) 56 实例39 索引越界异常(IndexOutOfBoundsException) 57 实例40 空指针异常(NullPointerException) 58 实例41 数字格式转换异常(NumberFornatException) ...

Global site tag (gtag.js) - Google Analytics