【EasyExcel】excel的导入导出基本用法

EasyExcel教程

1 EasyExcel是什么

在java开发中,我们时常会遇到,excel数据的导入导出,EasyExcel 就是一个能够帮助我们快速导入导出excel文件的工具,他提供了标准的上传文件工具,以及一些文件解析工具。

2 为什么要使用EasyExcel

excel除了最简单的行对行列对列的表格以外,出现的最多的实际上是复杂的、无规律的表格,这之中包含了大量的合并单元格,读取的时候如果没有便捷的工具,处理起来就会很麻烦。

我们知道,java解析excel的工具有很多,比如Apache POI,JXL。但是这些工具也非常的耗内存,当数据达到一定程度的时候,就及其容易造成内存的溢出。但是EasyExcel就不会出现这些问题。一个3Mb的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几Mb,并且再大的excel也不会出现内存溢出,使用起来更加简单方便。

下面是使用POI的流程

1.创建xsshworkbook / hasfwordbook
2.读取sheet
3.拿到sheet所有行row
4.通过当前行去拿到对应的单元格的值

可以发现非常麻烦,所以我们使用EasyExcel。

3 EasyExcel解决的问题

  • 读取excel时产生的内存溢出
  • 解析工具使用复杂麻烦
  • excel格式解析

4 工作原理

【EasyExcel】excel的导入导出基本用法_第1张图片

5 EasyExcel 使用方式

  1. 导入easy excel的依赖

    <dependency>
         <groupId>com.alibabagroupId>
         <artifactId>easyexcelartifactId>
         <version>3.1.1version>
    dependency>
    
  2. 给要导出的实体类添加注解

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class TbGoodsCategory {
      @ExcelProperty(index = 0,value = "分类id")
      private long categoryId;
      @ExcelProperty(index = 1,value = "分类等级")
      private long categoryLevel;
      @ExcelIgnore//不解析到excel
      private long parentId;
      @ExcelProperty(index = 2, value = "分类名称")
      private String categoryName;
      @ExcelProperty(index = 3, value = "分类排序")
    }
    
  3. 使用easy excel 进行数据的写出

    写入相同类型的数据

        @Test
        public void test2() {
            long l = System.currentTimeMillis();
    
            //文件要存放的本地位置
            String path = "C:\\Users\\demo\\Desktop\\test.xlsx";
            Integer count = areaService.getCount();
            
            //创建easy excel的写出类构造器 的参数, 告诉构造器我的excel到时候要写到哪里,以及excel的数据是基于哪个模板创建的
            int sheetNum = count%10 == 0? count/10 : count/10+1;
            ExcelWriter build = EasyExcel.write(path,TbGoodsCategory.class).build();
            for (int i = 1 ;i <=sheetNum ;i++) {
                List<TbGoodsCategory> list = areaService.getGoodsListByPage(i);
                //创建sheet构造器
                WriteSheet sheet = EasyExcel.writerSheet("第"+i+"个test").build();
                //使用excel对象将数据写入到创建的sheet中
                build.write(list,sheet);
            }
            build.finish();
            System.out.println("_______________________________________________________");
            System.out.println("success");
            System.out.println("_______________________________________________________");
            long l1 = System.currentTimeMillis();
            System.out.println(l1-l);
        }
    
    

    写入不同类型的数据

        @Test
        public void test3() {
            long l = System.currentTimeMillis();
    
            //文件要存放的本地位置
            String path = "C:\\Users\\demo\\Desktop\\test1.xlsx";
            Integer count = areaService.getCount();
            
            //创建easy excel的写出类构造器,告诉其输出位置即可
            ExcelWriter build = EasyExcel.write(path,TbGoodsCategory.class).build();
            
            //创建sheet构造器时通过head属性告诉其导出类型的模板
             ExcelWriterSheetBuilder 分类等级  = EasyExcel.writerSheet("分类等级").head(TbNewbeeMallGoodsCategory.class);
             build.write(分类信息源,分类等级);
            
        }
    
  4. 读入sheet中相同类型的数据源

        @Test
        public void test4() {   
            //文件要存放的本地位置
            String path = "C:\\Users\\demo\\Desktop\\test1.xlsx";
           
            
            //创建easy excel的读取类构造器 的参数, 告诉构造器我的excel在本地的位置,以及读取监听器
             ExcelReader build = EasyExcel.read(path,TbGoodsCategory.class, new EasyExcelListenner()).build();
            ReadSheet build1 =  EasyExcel.readSheet(0).build();
            build.read(build1);
            build.finish();
            
        }
    

    创建读取监听器继承AnalysisEventListenner

    public class EasyExcelListenner extends AnalysisEventListenner<TbGoodsCategory>{
        @Override
        //逐行读取excel信息
         public void invoke(TbGoodsCategory tbGoodsCategory, AnalysisContext analysisContext) {
         	 System.out.println(tbGoodsCategory);
         }
         @Override
        //excel读取完毕后触发执行
         public void doAfterAllAnalysed(AnalysisContext analysisContext) {
         	 System.out.println("finish");
         }
    }
    

excel的读取或者写入构造器在使用完毕后一定要调用 finish 方法

你可能感兴趣的:(后端框架学习,1024程序员节)