欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EasyExcel读写Excel文件

程序员文章站 2024-03-20 15:21:16
...

一、EasyExcel特点

  • Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。
  • EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是:在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
  • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

二、EasyExcel写入内容到excle文件

1、引入依赖

<dependencies>
        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!--xls-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.17</version>
            </dependency>
    </dependencies>

2、创建实体类

package com.yyds.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 * 实体类
 *
 * 设置表头和添加的数据字段
 */
@Data
public class Student {
    @ExcelProperty("学生姓名")
    private String name;
    @ExcelProperty("学生年龄")
    private int age;
}

3、实现写操作

package com.yyds.excel;

import com.alibaba.excel.EasyExcel;

import java.util.ArrayList;
import java.util.List;

public class WriteToExcel {

    public static void main(String[] args) {
        String fileName = "C:\\Users\\Undo\\Desktop\\student.xlsx";
        EasyExcel.write(fileName,Student.class).sheet("学生信息").doWrite(students());
    }
    // 批量写入
    public static List<Student> students(){
        List<Student> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Student student = new Student();
            student.setName("张三_" + i  );
            student.setAge(i);
            list.add(student);
        }
        return list;
    }
}

三、EasyExcel读取excle文件中的内容

1、创建实体类

package com.yyds.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class ReadStudent {
    // 第一列
    @ExcelProperty(value = "学生姓名",index = 0)
    private String name;
    // 第二列
    @ExcelProperty(value = "学生年龄",index = 1)
    private int age;
}

2、创建监听器

package com.yyds.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 读取excel监听器
 */
public class ReadFromExcelListener extends AnalysisEventListener<ReadStudent> {
    // 封装读出来的数据
    List<ReadStudent> list = new ArrayList<>();

    // 一行一行的读取excel内容
    @Override
    public void invoke(ReadStudent readStudent, AnalysisContext analysisContext) {
        System.out.println(readStudent);
        list.add(readStudent);
    }
    // 读取表头的信息
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头的信息:" + headMap);
    }


    // 读取后才执行
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}

3、读取数据

package com.yyds.excel;


import com.alibaba.excel.EasyExcel;

public class ReadFromExcel {
    public static void main(String[] args) {

        String fileName = "C:\\Users\\Undo\\Desktop\\student.xlsx";
        EasyExcel.read(fileName,ReadStudent.class,new ReadFromExcelListener()).sheet().doRead();

    }
}

结果:
表头的信息:{0=学生姓名, 1=学生年龄}
ReadStudent(name=张三_0, age=0)
ReadStudent(name=张三_1, age=1)
ReadStudent(name=张三_2, age=2)
ReadStudent(name=张三_3, age=3)
ReadStudent(name=张三_4, age=4)
ReadStudent(name=张三_5, age=5)
ReadStudent(name=张三_6, age=6)
ReadStudent(name=张三_7, age=7)
ReadStudent(name=张三_8, age=8)
ReadStudent(name=张三_9, age=9)
相关标签: java java