首页 > 其他分享 >EasyExcel => FastExcel ,导入导出支持多种时间格式

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

时间:2024-12-09 11:57:49浏览次数:6  
标签:FastExcel MM EasyExcel excel SimpleDateFormat yyyy 导入 new import

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);
    }
}

标签:FastExcel,MM,EasyExcel,excel,SimpleDateFormat,yyyy,导入,new,import
From: https://www.cnblogs.com/vipsoft/p/18594558

相关文章

  • #渗透测试#红队攻防 火狐浏览器插件大全并支持一键导入
    目录标题一、前言二、效果1.Hackbar2.FoxyProxy3.FindSomething4.Wappalyzer-Technologyprofiler5.X-Forwarded-ForHeader6.User-AgentSwitcherandManage7.superSearchPlus8.Ctool程序开发常用工具9.fly63工具箱10.Cookie-Editor11.HTTPHeaderLive1......
  • Windows环境下,.lib导入库 详解
    在Windows平台上,.lib 文件可以是静态库或动态链接库(DLL)的导入库。这两种类型的 .lib 文件虽然具有相同的扩展名,但它们的用途和工作方式有所不同。静态库 (.lib)静态库是一种包含一组预编译的函数、变量和数据的库,这些内容在编译时直接整合到最终的可执行文件(EXE)或其他库中。......
  • Windows环境下,动态链接库(DLL)的“导入”与“导出”概念
    在软件开发中,特别是在使用动态链接库(DLL)的Windows环境下,"导入"(Import)和"导出"(Export)是两个关键概念,用于管理函数和变量在DLL之间的可见性和可用性。导出 (Export)当你创建一个DLL时,你可能会希望在这个DLL中定义一些函数或变量,使得其他的程序(客户端程序)或者其他的DLL能够调用或......
  • Source Insight 导入linux内核源码
    参考https://www.cnblogs.com/joezh/p/13894145.html用法将脚本中的ABS_PATH="D:/si_code/linux-6.12/"路径换成在windows上可以访问的路径将源码完整编译一遍在源码目录下执行下面的脚本即可,最后会在当前目录下生成文件si_filelist_ARCH.txt,其中包含的是需要导入的文件列......
  • 从Delphi到Lazarus——在Lazarus中使用ActiveX控件(导入类型库)
    0.前言Lazarus的设计目标是应用FreePascal,所以所有凡是FreePascal能运行的平台,Lazarus都可以运行。通俗地说就是Lazarus追求的是跨平台编程,致力于“一次编写,到处编译”。Lazarus最初是一个基于FreePascal的Delphi仿制品。Lazarus作为一个可能代替Delphi的集成开发环境,从诞生......
  • 基于 easyExcel 3.1.5依赖的包 实现动态表头 动态表格内容
    1.需求:需要导出的EXCEL示例: 2.依赖:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.5</version></dependency>3.工具类:package......
  • 大数据-243 离线数仓 - 电商核心交易 增量数据导入 订单、订单明细、产品明细表
    点一下关注吧!!!非常感谢!!持续更新!!!Java篇开始了!目前开始更新MyBatis,一起深入浅出!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(已更完)Kudu(......
  • 项目功能--批量导入预约设置
    一、需求分析我们需要进行预约设置,就是设置每一天的体检预约最大数量。客户可以通过微信端在线预约,在线预约时需要选择体检的时间,如果客户选择的时间已经预约满则无法进行预约。二、ApachePOI简介ApachePOI是用Java编写的免费开源的跨平台的......
  • Python如何将Excel数据导入到MySQL数据库?详细教程与实战示例
    在数据处理和分析的过程中,我们常常需要将Excel数据导入到MySQL数据库中,以便进行更高效的查询和管理。那么,如何利用Python实现这一过程呢?本文将深入探讨Python将Excel数据导入到MySQL数据库的方法,并提供详细的教程和实战示例。无论您是初学者还是有经验的开发者,都可以通过本文掌......
  • EasyExcel => EasyExcel-Plus => FastExcel
    https://github.com/CodePhiliaX/fastexcelhttps://github.com/CodePhiliaX/fastexcel-dochttps://mvnrepository.com/artifact/cn.idev.excel/fastexcel@psxjoy:还在为第一版的正式发布而努力。文档方面,我们已经完成了第一版的内容。会随着第一个正式版本同时发布。什么是F......