刚才看到前段时间写的有关POI导入,时间转换问题。记录下。

二. 问题:

我们在使用POI导入的时候,时间往往是转换成了数值,而这个数值刚好是以一天或24小时为单位计算的。
如果导入的是包含年的,则是从1900年这个原点,开始计算的天数。
如果导入的是月,天,也是天的倍数,但不从那个原点开始了。
如果是小时等,则表达为这一天的百分比小数(根据一天24小时)。

三. 解决方法:

// 将单元格的内容类型设置为字符串
row.getCell(6).setCellType(Cell.CELL_TYPE_STRING);
// 通过 apache 在 HSSFDateUtil 提供的方法将数值转为时间(import org.apache.poi.hssf.usermodel.HSSFDateUtil;)
Date closingTime = HSSFDateUtil.getJavaDate(Double.valueOf(row.getCell(6).getStringCellValue()));
// 使用 hutool 工具转换时间,第一个参数是时间,第二个参数是需要格式化的时间格式
String formatDateTimeString = DateUtil.format(closingTime, LocalDateUtils.defaultHM);

四. 后语:

以上就是小熙本次的分享了,如果有更好的方法,也请分享下哦。

Excel存储日期、时间均以数值类型进行存储,读取时先使用POI判断是否是数值类型,再进行进一步判断是否为日期,最后转化 1.纯数值格式:getNumericCellValue() 直接获取数据 2.日期格式:处理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式 1).判断是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell) 2).判断是日期或者时间 cell.getCellStyle().getDataFormat() == H POI读取Excel单元格的数据,不同的数据类型有不同的读取方法,因此要读取数据必须先判断单元格的数据类型,POI定义了NUMERIC数值型,把日期时间也当作数值进行存储,所以我们读取时先判断为数值NUMERIC类型,再用DateUtil.isCellDateFormatted(cell),来判断是不是日期时间类型,如果返回true则为日期时间类型。在Excel有多种数据类型,还允许自定义,虽然POI在BuiltinFormats类定义了许多格式,但国人的习惯格式还有的没有,如 “yyyy-MM-dd 本文的重点是解决两个问题: 1、POI识别Excel的时间包含文,例如:2021年1月22日 2、POI识别Excel单元格为日期类型或时间类型的时间数据 本文主要以示例解决以上两个问题,为了突出主要解决问题的代码,所以就以xlsx类型表格的识别方式为例。 一、POI识别包含文的时间 主要以 xxxx年xx月xx日 类型时间为例进行演示 自POI 3.X版本开始,poi便无法识别Excel时间了。然而,当我们的Exce   大家好,使用poi解析excel,第二篇来啦。这一篇主要是探讨日期和时间格式的解决。(转载请注明出处,谢谢!) 众所周知,在excel有很多的时间和日期格式。而poi官方在处理时间和日期上面的能力比较弱。网上很多地方都找不到解决的方法,或者说解决的覆盖面太小,解决的格式很少很少。 所以我建议:日期或者时间格式,一定要让用户输出文本格式!!! 如果产品实在没有定义。那么就需要自己解决下。... 当然这前提还是要看时间字段的单元格格式,就像前面所说的,自定义或时间类型的格式,POI就会把数据解析成其他格式,这个时候定义的dateFormat转换样式就需要与实际内容一致,否则解析时就会捕获到异常,那假设单元格格式是常规,则POI不会进行解析,读到是2022-08-16,解析出来也还是2022-08-16,则可以不进行转换。假设表格数据已经初步转换存储到ListdataList集合,但存在部分时间字段的内容与表格的时间内容不一致,需要进行格式转换回原格式,再insert入库。... String csny; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); String registered=getCellTypes(row.getCell(5)); if(StrKit.isNotBlank(registered)){ Excel本身支持很多格式日期,在导入Excel总是容易出问题,这里整理了常用的一些格式,可以有效转化为JAVA的Date类型,其包括Excel的单元格设置里面的“日期”、“时间”和”自定义格式“,君自取。 private static Object getCellValue(Cell cell, Workbook workbook) { Object value = ""; if (cell != null) { try { // 判断类型. //设定自定义格式的内容,以下面这种格式 CellStyle cellStyleDate=workbook.createCellStyle(); DataFormat format= workbook.createDataFormat(); //设定时间格式 cellStyleDate.setDataFormat(format.getFormat("yyyy-mm-dd hh:mm:ss")); //设置值(Date) cell.setCellValue((Date)value); cell.setCel. 项目需求,excel表格里有多种日期的字段,可能单元为date的,也可能为文本的自己手动填写的,要求后台保存为统一格式,yyyy/MM/dd。 因为数据库的日期字段的类型为字符串,所以保存到数据库的实体类,日期必须为String。 这里设置了一个实体 @Excel(name = "Est. Start Date",dateFormat = "yyyy/MM/dd") // 没有也可以 无需纠结于这里 private Date estStrartDate; @Excel(name = case Cell.CELL_TYPE_NUMERIC: //数字 //遇到日期类型进行格式转换 if (HSSFDateUtil.isCellDateFormatted(cell)) { 开发过程处理Excel导入功能,使用的POI工具类,在导入时把日期转换为指定格式的时候报异常,使用debug查看发现导入excel的日期格式竟然转成成了数值格式,不是通常的时间戳,是带小数点的数值。 需要通过以下代码解决,把数值转换成Java的时间类型,HSSFDateUtil是POI包下的一个类,使用getJavaDate方法把Double类型转换成Java日期类型 Date date = ...