超方便.使用EasyExcel导入excel

简介: 超方便.使用EasyExcel导入excel

背景


说到导出Excel文档,我们一般会想到很多放方式,比如简单的EasyPoi,采用注解的方式,直接导出,使用template模板方式,然后将数据写入模板,将数据转换成Map或是List集合写入Excel。


EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。


github地址:https://github.com/alibaba/easyexcel


使用demo


导入依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.1.2</version>
</dependency>

demo入口

public class TestExecel {
    public static void main(String[] args) {
      //文件绝对路径
      String name = "/Users/test/src/mytest/test.xlsx";
      //read方法可以传递文件名也可以传递File
      EasyExcel.read(name, UserTest.class, new CustomerExcelDataListener())
                .sheet()
                .headRowNumber(1)
                .doRead();
    }
}

模版类

@Data
public class UserTest {
    /**
     * 用户姓名
     */
    @ExcelProperty(value = "用户姓名", index = 0)
    private String name;
    /**
     * 用户手机号
     */
    @ExcelProperty("用户手机号")
    private String phone;
    /**
     * 用户年龄
     */
    @ExcelProperty("用户年龄")
    private Integer age;
}

自定义监听处理类

public class CustomerExcelDataListener implements ReadListener<DetectSyncToCarEntity> {
    /**
     * 每隔200条存储数据库然后清理list ,方便内存回收
     */
    private final int BATCH_COUNT = 200;
    private final List<UserTest> cacheList = new ArrayList<>();
    @SneakyThrows
    @Override
    public void onException(Exception exception, AnalysisContext context) {
        //异常时需要做的处理
        //log.error("load file row data error! info:{}", exception);
    }
    /**
     * 这里会一行行的返回头
     *
     * @param headMap
     * @param context
     */
    @SneakyThrows
    @Override
    public void invokeHead(Map<Integer, ReadCellData<?>> headMap, AnalysisContext context) {
    }
    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data
     * @param context
     */
    @Override
    public void invoke(UserTest data, AnalysisContext context) {
        if (null != data){
            //将数据暂存到缓存中,到达处理数量时进行处理
            cacheList.add(data);
            if (detectSyncToCarEntityList.size() >= BATCH_COUNT){
                doProcess(false);
            }
        }
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //收尾阶段,最后一批次没处理的数据进行处理
        doProcess(true);
    }
    public CustomerExcelDataListener() {
       //可以将外边的service传入构造方法进行使用
    }
    /**
     * 
     * @param isFinal 是否为最后一批数据
     */
   // @Transactional(rollbackFor = Exception.class)
    public void doProcess(Boolean isFinal) {
       //一批次的数据进行逻辑处理
      //业务处理
      //处理完成之后清理cache
      cacheList.clear();
    }
}
相关文章
|
1月前
|
easyexcel
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
|
1月前
|
SQL 缓存 easyexcel
面试官问10W 行级别数据的 Excel 导入如何10秒处理
面试官问10W 行级别数据的 Excel 导入如何10秒处理
178 0
|
2月前
|
easyexcel Java 测试技术
读取Excel还用POI?试试这款开源工具EasyExcel
读取Excel还用POI?试试这款开源工具EasyExcel
70 0
|
7天前
|
存储 API C#
C# 实现格式化文本导入到Excel
C# 实现格式化文本导入到Excel
|
19天前
|
数据库
如何把Excel导入到数据库中
如何把Excel导入到数据库中
10 0
|
23天前
|
easyexcel 数据库
公司大佬对excel导入、导出的封装,那叫一个秒啊
封装公司统一使用的组件的主要目标是为了简化开发人员的调用流程,避免各个项目组重复集成和编写不规范的代码。文中提到对阿里EasyExcel进行了二次封装,提供了导入和导出功能,并支持模板的导入和导出。此外,还处理了读取数据与实际保存数据不一致的情况,通过提供自定义转换器来解决。
118 0
|
1月前
|
easyexcel 数据库
【EasyExcel】第一篇:动态导入excel,生成对应数据库表
【EasyExcel】第一篇:动态导入excel,生成对应数据库表
|
1月前
|
数据库
关于用NPOI导入Excel
关于用NPOI导入Excel
|
2月前
|
存储 数据处理 数据格式
Python中导入Excel数据:全面解析与实践
Python中导入Excel数据:全面解析与实践
76 0
|
2月前
|
存储 关系型数据库 MySQL
Python导入Excel数据到MySQL数据库
Python导入Excel数据到MySQL数据库
126 0