0
点赞
收藏
分享

微信扫一扫

EasyExcel实现读写操作

(1)Excel导入导出的应用场景

① 数据导入:减轻录入工作量

② 数据导出:统计信息归档

③ 数据传输:异构系统之间数据传输

(2)EasyExcel 简介

EasyExcel的特点:

Java 领域解析、生成 Excel 比较有名的框架有 Apache poi、jxl 等。但他们都存在一个严重的问题就是非常的耗内存。 如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会 OOM 或者JVM频繁的 full gc。

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。 EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

(3)GitHub 地址:

EasyExcel实现读写操作_实体类

https://github.com/alibaba/easyexcel

(4)测试 EasyExcel 写操作

① 引入 EasyExcel 依赖,EasyExcel 对 poi 的封装

注意:单独使用,还需要引入 poi 的依赖

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

② 在 src/test/java 下创建包:com.xzy.edu.service.edu.excel

创建包:model

创建实体类 DemoData,与 Excel 数据对应

@Data
@AllArgsConstructor
@NoArgsConstructor
public class DemoData {
    // 设置 Excel 表头名称
    @ExcelProperty("id")
    private int id;
    @ExcelProperty("name")
    private String name;
    @ExcelProperty("sex")
    private String sex;
    @ExcelProperty("age")
    private int age;
}

创建包:main

public class MyTest {
    public static void main(String[] args) {
        // 实现 excel 写操作
        // 1、设置写入excel数据的文件夹路径和名称
        String filePath = "D:\\student.xls";
        /*
         * 2、调用 EasyExcel 中的方法实现写操作
         *  参数 1:文件路径名称
         *  参数 2:实体类的 class 类型
         */
        EasyExcel.write(filePath, DemoData.class).sheet("学生信息列表").doWrite(getData());
    }

    // 实现 excel 写操作
    public static void readFromExcel(){
        // 1、设置写入excel数据的文件夹路径和名称
        String filePath = "D:\\student.xls";
        EasyExcel.read(filePath, DemoData.class, new ExcelListener()).sheet().doRead();
    }
    // 方法:返回 List 集合
    private static List<DemoData> getData(){
        List<DemoData> list = new ArrayList<DemoData>();
       List<DemoData> list = new ArrayList<DemoData>();
        DemoData data1 = new DemoData(1001,"博","男",21);
        DemoData data2 = new DemoData(1002,"博博","男",23);
        DemoData data3 = new DemoData(1003,"啵啵啵","女",20);
        DemoData data4 = new DemoData(1004,"博博博博","男",22);
        list.add(data1);
        list.add(data2);
        list.add(data3);
        list.add(data4);
        return list;
    }
}

(5)测试 EasyExcel 读操作

① 在 src/test/java 下创建包:com.xzy.edu.service.edu.excel.listener

创建监听类 ExcelListener

public class ExcelListener extends AnalysisEventListener<DemoData> {
    // 一行一行读取 excel 表格中的数据
    @Override
    public void invoke(DemoData demoData, AnalysisContext analysisContext) {
        System.out.println("***** " + demoData);
    }
    // 读取表头内容
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        System.out.println("表头:" + headMap);
    }
    // 读取完成之后
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}

② 修改实体类 DemoData


@Data
@AllArgsConstructor
@NoArgsConstructor

public class DemoData {

    // 设置 Excel 表头名称

    @ExcelProperty("id")

    private int id;

    @ExcelProperty("name")

    private String name;

    @ExcelProperty("sex")

    private String sex;

    @ExcelProperty("age")

    private int age;

}

③ 修改主类 MyTest

public class ReadTest {
    public static void main(String[] args) {
        // writeToExcel();
        readFromExcel();
    }
    // 实现 excel 写操作
    public static void writeToExcel(){
        // 1、设置写入excel数据的文件夹路径和名称
        String filePath = "D:\\student.xls";
        /*
         * 2、调用 EasyExcel 中的方法实现写操作,流对象会自动关闭
         *  参数 1:文件路径名称
         *  参数 2:实体类的 class 类型
         */
        EasyExcel.write(filePath, DemoData.class).sheet("学生信息列表").doWrite(getData());
    }
    // 实现 excel 写操作
    public static void readFromExcel(){
        // 1、设置写入excel数据的文件夹路径和名称
        String filePath = "D:\\student.xls";
        EasyExcel.read(filePath, DemoData.class, new ExcelListener()).sheet().doRead();
    }
    // 方法:返回 List 集合
    private static List<DemoData> getData(){
        List<DemoData> list = new ArrayList<DemoData>();
        DemoData data1 = new DemoData(1001,"博","男",21);
        DemoData data2 = new DemoData(1002,"博博","男",23);
        DemoData data3 = new DemoData(1003,"啵啵啵","女",20);
        DemoData data4 = new DemoData(1004,"博博博博","男",22);
        list.add(data1);
        list.add(data2);
        list.add(data3);
        list.add(data4);
        return list;
    }
}

举报

相关推荐

0 条评论