最近在做一个将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 空,不知道何时算空 空就不要取值了吧

POI读取Excel常见问题的更多相关文章

  1. 使用jxl,poi读取excel文件

    作用:在java后台添加一个方法,读取导入的excel内容,根据需要返回相应的sql语句,以完成对临时表的插入操作. 使用jxl读取excel文件 package com.sixthf.bi.sapp ...

  2. POI读取Excel内容格式化

    在用POI读取Excel内容时,经常会遇到数据格式化的问题. 比如:数字12365会变为12365.0;字符串数字123也会变为123.0,甚至会被变为科学计数法.另外日期格式化也是一个头疼的问题.其 ...

  3. java使用poi读取ppt文件和poi读取excel、word示例

    java使用poi读取ppt文件和poi读取excel.word示例 http://www.jb51.net/article/48092.htm

  4. JAVA使用POI读取EXCEL文件的简单model

    一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...

  5. java用poi读取Excel表格中的数据

    Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...

  6. Java开发小技巧(六):使用Apache POI读取Excel

    前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...

  7. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  8. 使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10

    使用POI 读取 Excel 文件,读取手机号码 变成 1.3471022771E10 [问题点数:40分,结帖人xieyongqiu]             不显示删除回复             ...

  9. Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决

    Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...

随机推荐

  1. Div 定时移动

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  2. R语言环境安装与基本使用

    R语言安装包可以从这个地址选择合适的URL去下载:https://cran.r-project.org/mirrors.html,这里使用这个https://mirrors.tuna.tsinghua ...

  3. Maven创建工程 WEB

    http://www.zuidaima1.com/blog/1618180875144192.htm http://www.zuidaima1.com/blog/1618162161323008.ht ...

  4. C 标准库系列之float.h

    float.h 内部主要包含了一系列的浮点数宏.指明可移植程序必要的常量:浮点数格式一般为Spxbe;其中S表示+-:p表示底数.b表示基数如2.8.10.16等进制,e为指数标识E或e: 在一般情况 ...

  5. UWP学习记录5-设计和UI之控件和模式2

    UWP学习记录5-设计和UI之控件和模式2 1.应用栏和命令栏 CommandBar 控件是一款通用.灵活.轻型的控件,可显示复杂内容(如图像或文本块)以及简单的命令(如 AppBarButton.A ...

  6. maven 速度快的镜像

    <mirrors> <mirror> <id>CN</id> <name>UK Central</name> <url&g ...

  7. Xcode8控制台乱码的解决方式

    Xcode8里边 Edit Scheme-> Run -> Arguments, 在Environment Variables里边添加 OS_ACTIVITY_MODE = Disable ...

  8. hypermesh 之 interface操作

  9. AC自动机+DP HDOJ 2457 DNA repair(DNA修复)

    题目链接 题意: 给n串有疾病的DNA序列,现有一串DNA序列,问最少修改几个DNA,能使新的DNA序列不含有疾病的DNA序列. 思路: 构建AC自动机,设定end结点,dp[i][j]表示长度i的前 ...

  10. WebApi防重复提交方案

    使用Redis锁机制. 偽代碼: void post { var key = GetKey(); var value = Redis.Incre(key); if(value == 1) { var ...