读取Excel表格日期类型数据的时候
用POI读取Excel数据:(版本号:POI3.7)
1、读取Excel
2、Excel数据处理:
Excel存储日期、时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化
1、数值格式(CELL_TYPE_NUMERIC):
1.纯数值格式:getNumericCellValue() 直接获取数据
2.日期格式:处理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式
1).判断是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell)
2).判断是日期或者时间
- cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")
- 或者: cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("yyyy-MM-dd")
3.自定义日期格式:处理yyyy年m月d日,h时mm分,yyyy年m月等含文字的日期格式
判断cell.getCellStyle().getDataFormat()值,解析数值格式
yyyy年m月d日----->31
m月d日---->58
h时mm分--->32
2、字符格式(CELL_TYPE_STRING):直接获取内容
*万能处理方案:
所有日期格式都可以通过getDataFormat()值来判断
yyyy-MM-dd----- 14
yyyy年m月d日--- 31
yyyy年m月------- 57
m月d日 ---------- 58
HH:mm----------- 20
h时mm分 ------- 32
Java 读取Excel表格日期类型数据的时候,读出来的是这样的 13-十二月-2017,而Excel中输入的是 2017/12/13 或 2017-12-13
还有Excel中输入的是整型 5,java 读取出来的是5.0
这可怎么整?
解决方法:
日期转换
- import org.apache.poi.ss.usermodel.DateUtil;
- import org.apache.poi.ss.usermodel.Workbook;
- import org.apache.poi.ss.usermodel.Sheet;
- import org.apache.poi.ss.usermodel.Row;
- import org.apache.poi.ss.usermodel.Cell;
- Workbook workBook = (Workbook)ModelUtils.getRequestContext().getActionContext().getParameter("excel");
- Sheet sheet = workBook.getSheetAt(0);
- int fr = sheet.getPhysicalNumberOfRows() - 4;
- for(int i=0;i<fr;i++){
- int r = 4+i;
- org.apache.poi.ss.usermodel.Row rowDetail = sheet.getRow(r);
- String guarantee_date = "";
- Cell dateCell = rowDetail.getCell(2);
- //判断是否为日期类型
- if(0==dateCell.getCellType()){
- if(DateUtil.isCellDateFormatted(dateCell)){
- //用于转化为日期格式
- Date d = dateCell.getDateCellValue();
- DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
- guarantee_date = formater.format(d);
- }
- }
- System.out.println(guarantee_date);
- //------------整型数量格式处理--------------
- String countStr = rowDetail.getCell(3).toString();
- Integer count = 0;
- System.out.println("入库数量:"+countStr);
- if(countStr.indexOf(".")>=0){
- System.out.println(". 位数: "+ countStr.indexOf("."));
- countStr = countStr.substring(0, countStr.indexOf("."));
- count = Integer.valueOf(countStr);
- }
- }
Apache poi 版本:3.12
今天在用poi解析excel文件时,碰到一个蛋疼的问题。
在我的excel文件中有一列是日期类型,例如有以下这么一行数据(日期中月份前面的0会自动去掉):
在读取注册日期这个数据时,返回了一串数字,变成了 42149,
断点调试到读取数据的代码,发现poi是正确识别的,但是在读取具体数据时发生了变化:
从上图可以看到,poi把日期数据也归类为 Cell.CELL_TYPE_NUMERIC
数字类型,
并且在cell中是正确读取到了 2015-05-25,但是在使用cell.getNumericCellValue()
方法获取时却发生了变化,返回了42149.0
,
不知道它在里面进行了怎样的处理,但这不是我们想要的结果。
既然如此,我直接用字符串的方式获取可不可以呢?
把代码改为:
- case Cell.CELL_TYPE_NUMERIC:
- value = cell.getStringCellValue();
- DecimalFormat df = new DecimalFormat("0");
- value = df.format(value);
- break;
抛出如下异常:
- Caused by: java.lang.IllegalStateException: Cannot get a text value from a numeric cell
- at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:888)
- at org.apache.poi.xssf.usermodel.XSSFCell.getRichStringCellValue(XSSFCell.java:310)
- at org.apache.poi.xssf.usermodel.XSSFCell.getStringCellValue(XSSFCell.java:261)
说明不可以把它当作字符串类型来处理,
看方法倒是有个cell.getDateCellValue()
,可是在什么时候进行调用呢,我要怎么能知道它是date类型?
通过查询资料发现,poi在Cell.CELL_TYPE_NUMERIC
中又具体区分了类型,Date
类型就是其中一种,把代码再做处理:
- case Cell.CELL_TYPE_NUMERIC:
- if (HSSFDateUtil.isCellDateFormatted(cell)) {
- Date date = cell.getDateCellValue();
- value = DateFormatUtils.format(date, "yyyy-MM-dd");
- } else {
- value = cell.getNumericCellValue();
- DecimalFormat df = new DecimalFormat("0");
- value = df.format(value);
- }
- break;
成功解决问题。
另外如果日期中有精确到日,精确到秒不同精度的,可以用cell.getCellStyle().getDataFormat()
或cell.getCellStyle().getDataFormatString()
来获取格式。
读取Excel表格日期类型数据的时候的更多相关文章
- java用poi读取Excel表格中的数据
Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...
- 利用java反射机制实现读取excel表格中的数据
如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来. 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>.Lis ...
- python读取excel表格中的数据
使用python语言实现Excel 表格中的数据读取,需要用到xlrd.py模块,实现程序如下: import xlrd #导入xlrd模块 class ExcelData(): def __init ...
- python2读取EXCEL表格内的数据时碰到的问题
一,今天在剥离自动化的测试数据时,发生了一个错误,错误显示读取不到某个单元格的数据. 因为我使用的是python2,正好那一个单元格出现的是中文汉字,再者通过查看报错日志,让我了解到错误的原因. di ...
- c# 解决读取Excel混合文本类型,数据读取失败的解决方法
错误重现: ----------------------------------------------------------------------- 在导入Excel读取数据时,其中的一个字段保 ...
- java读取Excel表格中的数据
1.需求 用java代码读取hello.xls表格中的数据 2.hello.xls表格 3.java代码 package com.test; import java.io.File; import j ...
- java通过poi读取excel中的日期类型数据或自定义类型日期
Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2019,而Excel中输入的是 2019/10/12 或 2019-10-12 poi处理excel时,当excel没 ...
- 读取Excel表格中数据原型
写下这篇博客来记录自己的工作,这部分功能是读取Excel表格中的数据,并通过c#中的datagridview控件将读取的数据显示出来.为了方便用户,我设计了一个read按钮,用户点击这个按钮,会弹出打 ...
- C#读取Excel表格的数据
1.创建工程后,需要下载 EPPlus.dll 添加到工程中,这里有一个下载地址:https://download.csdn.net/download/myunity/10784634 2.下面仅实现 ...
随机推荐
- C++ 重载操作符- 02 重载输入输出操作符
重载输入输出操作符 本篇博客主要介绍两个操作符重载.一个是 <<(输出操作符).一个是 >> (输入操作符) 现在就使用实例来学习:如何重载输入和输出操作符. #include ...
- java的web.xml中<url-pattern>配置[转]
<servlet-mapping> <servlet-name>downLoadFile</servlet-name> <url-pattern>*.l ...
- Scala入门学习随笔
推荐学习视频:慕课网http://www.imooc.com/learn/613,讲师:辰风 ScalaAPI:http://www.scala-lang.org/api/current/#packa ...
- 设计模式(java)--中介者模式之同事的关联
转自:http://blog.csdn.net/zhengzhb/article/details/7430098 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使 ...
- 拖拽demo--兼容--全局捕获
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 实践作业4---DAY2阶段一。
由于CSDN博客没有班级博客栏目,所以在该项功能上无法与博客园进行对比,我们将就CSDN和博客园的博文发布功能进行对比.我们就CSDN和博客园的博文发布页面.后台管理界面.发布新博客及界面进行了全面的 ...
- HTTP Debugger Pro使用教程
相关链接:HTTP Debugger Pro安装教程 1.设置过滤器,只监控指定地址的数据 选择仅显示匹配的记录 输入监控地址 控件传输的数据 服务器返回的数据
- Ubuntu建立WIFI热点
网络共享 http://www.linuxidc.com/Linux/2014-07/104624.htm
- CodeForces 408E Curious Array(组合数学+差分)
You've got an array consisting of n integers: a[1], a[2], ..., a[n]. Moreover, there are m queries, ...
- [修正] Firemonkey 中英文混排折行,省略字符,首字避开标点
问题:FMX 在移动平台的文字显示并非由该平台的原生 API 来显示,而是由 FMX.TextLayout.GPU 来处理,也许是官方没留意到中文字符的问题,造成在中英文混排折行时,有些问题. 修正: ...