Java使用FastExcel导入支持多种时间格式

 更新时间:2024年12月17日 08:20:06   作者:VipSoft  
FastExcel 是一个采用纯 java 开发的 excel 文件读写组件,支持 Excel'97(-2003)(BIFF8)文件格式,本文主要介绍了如何使用FastExcel导入支持多种时间格式,感兴趣的可以了解

简介

FastExcel 是一个采用纯 java 开发的 excel 文件读写组件。支持 Excel'97(-2003)(BIFF8)文件格式。FastExcel 主要关注 excel 内容的处理,所以 FastExcel 只能读取单元格的字符 信息,而其它属性如颜色,字体等就不支持了。由于不读取,解析和存储这些额外信息,因此 FastExcel 只需很小的内存。

示例代码:

public void testDump() throws ParserException, ReadException {
	Workbook workBook;
	workBook = FastExcel.createReadableWorkbook(new File("test.xls"));
	workBook.open();
	Sheet s;
	s = workBook.getSheet(0);
	System.out.println("SHEET:"+s);
	for (int i = s.getFirstRow(); i <= s.getLastRow(); i++) {
	System.out.print(i+"#");
	for (int j = s.getFirstColumn(); j <=s.getLastColumn(); j++) {
		System.out.print(","+s.getCell(i, j));
	}
	System.out.println();
	}
	workBook.close();
}

EasyExcel => FastExcel ,导入支持多种时间格式

InfoExcelDTO

/**
 * 合作开始日期*
 */
@ExcelProperty(index  = 22,converter = ExcelDateConverter.class)
private Date cooperationDate;

ExcelDateConverter

package com.vipsoft.base.util;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

import cn.idev.excel.converters.Converter;
import cn.idev.excel.enums.CellDataTypeEnum;
import cn.idev.excel.metadata.GlobalConfiguration;
import cn.idev.excel.metadata.data.ReadCellData;
import cn.idev.excel.metadata.property.ExcelContentProperty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 日期格式转换器
 */
public class ExcelDateConverter implements Converter<Date> {
    private static final Logger log = LoggerFactory.getLogger(ExcelDateConverter.class);
    // 定义所有要尝试的日期格式
    SimpleDateFormat[] formats = {
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
            new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"),
            new SimpleDateFormat("yyyy/MM/dd"),
            new SimpleDateFormat("yyyy-MM-dd"),
            new SimpleDateFormat("yyyy/MM"),
            new SimpleDateFormat("yyyy/MM"),
            new SimpleDateFormat("yyyyMMdd")
    };

    @Override
    public Class<Date> supportJavaTypeKey() {
        return Date.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }


    @Override
    public Date convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
                                  GlobalConfiguration globalConfiguration) throws Exception {
        String cellValue = "";
        if (cellData.getType().equals(CellDataTypeEnum.NUMBER)) {
            long cellIntValue = cellData.getNumberValue().longValue();
            if (cellIntValue > 19900100) {
                try {
                    // 1. 第一种解析,传入的是数字形式的日期,形如yyyyMMdd
                    SimpleDateFormat originalFormat = new SimpleDateFormat("yyyyMMdd");
                    return originalFormat.parse(String.valueOf(cellIntValue));
                } catch (Exception e) {
                    log.warn("exception when parse numerical time with format yyyyMMdd");
                    cellValue=String.valueOf(cellIntValue);
                }
            }

            // 2. 第二种解析, excel是从1900年开始计算,最终通过计算与1900年间隔的天数计算目标日期
            LocalDate localDate = LocalDate.of(1900, 1, 1);

            //excel 有些奇怪的bug, 导致日期数差2
            localDate = localDate.plusDays(cellIntValue - 2);

            // 转换为ZonedDateTime(如果需要时区信息)
            ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
            return Date.from(zonedDateTime.toInstant());
        } else if (cellData.getType().equals(CellDataTypeEnum.STRING)) {
            // 3. 第三种解析
            Date date = null;
            cellValue = cellData.getStringValue();
            for (SimpleDateFormat format : formats) {
                try {
                    date = format.parse(cellValue);
                    if (date != null) {
                        // 这一步是将日期格式化为Java期望的格式
                        return date;
                    }
                } catch (Exception e) {
                    // 如果有异常,捕捉异常后继续解析
                    log.error(e.getMessage(), e);
                }
            }
        }
        // 如果有异常,捕捉异常后继续解析
        throw new UnsupportedOperationException("The current operation is not supported by the current converter." + cellValue);
    }
 

    @Override
    public WriteCellData<?> convertToExcelData(Date value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String dateValue = sdf.format(value);
        return new WriteCellData<>(dateValue);
    }	
}

到此这篇关于Java使用FastExcel导入支持多种时间格式的文章就介绍到这了,更多相关Java FastExcel时间格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go Java算法之交错字符串示例详解

    Go Java算法之交错字符串示例详解

    这篇文章主要为大家介绍了Go Java算法之交错字符串示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 详解 Java 中 equals 和 == 的区别

    详解 Java 中 equals 和 == 的区别

    这篇文章主要介绍了详解 Java 中 equals 和 == 的区别的相关资料,equals 和 == 都是用来检测两个字符串是否相等,返回值也都是布尔型,但是两者在内部比较的处理中却不尽相同需要的朋友可以参考下
    2017-03-03
  • Java中NullPointerException的异常解决

    Java中NullPointerException的异常解决

    本文解释了Java中的NullPointerException是如何产生的,及使用Optional和Objects.requireNonNull()来避免此类异常的方法,感兴趣的可以了解一下
    2025-12-12
  • 一文秒懂IDEA中每天都在用的Project Structure知识

    一文秒懂IDEA中每天都在用的Project Structure知识

    这篇文章主要介绍了一文秒懂IDEA中每天都在用的Project Structure知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • spring对JDBC和orm的支持实例详解

    spring对JDBC和orm的支持实例详解

    这篇文章主要介绍了spring对JDBC和orm的支持实例详解,需要的朋友可以参考下
    2017-09-09
  • 解决mybatis-plus3.1.1版本使用lambda表达式查询报错的方法

    解决mybatis-plus3.1.1版本使用lambda表达式查询报错的方法

    这篇文章主要介绍了解决mybatis-plus3.1.1版本使用lambda表达式查询报错的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • java微信开发API第三步 微信获取以及保存接口调用凭证

    java微信开发API第三步 微信获取以及保存接口调用凭证

    这篇文章主要为大家详细介绍了java微信开发API第二步,微信获取以及保存接口调用凭证,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java中如何截取字符串最后一位

    java中如何截取字符串最后一位

    这篇文章主要介绍了java中如何截取字符串最后一位的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • SpringBoot项目jar依赖问题报错解析

    SpringBoot项目jar依赖问题报错解析

    本文主要介绍了Spring Boot项目中常见的依赖错误类型、报错内容及解决方法,依赖冲突包括类找不到、方法找不到、类型转换异常等,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • SpringBoot中的main方法注入service

    SpringBoot中的main方法注入service

    这篇文章主要介绍了SpringBoot中的main方法注入service操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论