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时间格式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java网络编程之UDP网络通信详解

    Java网络编程之UDP网络通信详解

    这篇文章主要为大家详细介绍了Java网络编程中的UDP网络通信的原理与实现,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2022-09-09
  • SpringBoot如何实现持久化登录状态获取

    SpringBoot如何实现持久化登录状态获取

    这篇文章主要介绍了SpringBoot 如何实现持久化登录状态获取,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Mybatis-Mapper.xml文件前缀详解

    Mybatis-Mapper.xml文件前缀详解

    这篇文章主要介绍了Mybatis-Mapper.xml文件前缀,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java多线程之Callable接口的实现

    Java多线程之Callable接口的实现

    这篇文章主要介绍了Java多线程之Callable接口的实现,Callable和Runnbale一样代表着任务,区别在于Callable有返回值并且可以抛出异常。感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Spring Security OAuth2 实现登录互踢的示例代码

    Spring Security OAuth2 实现登录互踢的示例代码

    这篇文章主要介绍了Spring Security OAuth2实现登录互踢的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Spring整合Quartz实现动态定时器的示例代码

    Spring整合Quartz实现动态定时器的示例代码

    本篇文章主要介绍了Spring整合Quartz实现动态定时器的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • 浅谈java 字符串,字符数组,list间的转化

    浅谈java 字符串,字符数组,list间的转化

    下面小编就为大家带来一篇浅谈java 字符串,字符数组,list间的转化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java 调整格式日志输出

    Java 调整格式日志输出

    本文主要介绍Java 的日志输出格式,在开发java的时候会经常看日志进行调试或者查看错误,这里给大家介绍日志输出调整格式,以便大家看日志的时候更加方便,
    2016-07-07
  • Java循环队列与非循环队列的区别总结

    Java循环队列与非循环队列的区别总结

    今天给大家带来的是关于Java的相关知识总结,文章围绕着Java循环队列与非循环队列的区别展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java中的可变参数常见用法实例总结

    Java中的可变参数常见用法实例总结

    这篇文章主要介绍了Java中的可变参数常见用法,结合实例形式总结分析了java可变参数的常见功能、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-10-10

最新评论