easyexcel

EasyExcel是一款轻量级的Java Excel处理框架,解决了Apache POI在处理大量数据时的内存消耗问题。它提供了读取和写入Excel的功能,如自动映射Java模型、支持多sheet读写、自定义样式等。适用于处理03和07版Excel,且在读取时通过监听器进行业务处理,降低了内存占用,避免了内存溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、为什么用?

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便

2、easyexcel核心功能

*读任意大小的03、07版Excel不会OO]
*读Excel自动通过注解,把结果映射为java模型
*读Excel支持多sheet
*读Excel时候是否对Excel内容做trim()增加容错
*写小量数据的03版Excel(不要超过2000行)
*写任意大07版Excel不会OOM
*写Excel通过注解将表头自动写入Excel
*写Excel可以自定义Excel样式 如:字体,加粗,表头颜色,数据内容颜色
*写Excel到多个不同sheet
*写Excel时一个sheet可以写多个Table
*写Excel时候自定义是否需要写表头

3、版本

稳定版本为1.1.1,测试版到1.1.2,引入版本注意,如果有引入poi jar包的话不要和poi版本冲突,不然会有问题(已踩过坑,建议都用新版本就不会有问题)

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>easyexcel</artifactId>
    <version>1.1.1</version>
</dependency>

4、快速开始

1、创建项目,这里已 springboot 为例(目录结构和pom文件)
在这里插入图片描述
2、ExcelModel.java
其中 @ExcelProperty(value = “”, index = 0) index 代表该字段与 excel 对应列号做映射,
value 代表字段表头名称,支持层级表头

package com.easyexcel.demo;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;

public class ExcelModel extends BaseRowModel {
    @ExcelProperty(value = "工号", index = 0)
    private String id;

    @ExcelProperty(value = "名字", index = 1)
    private String name;

    @ExcelProperty(value = "地址", index = 2)

    private String address;

    public void setId(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;

    }

    public String getName() {
        return name;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getAddress() {
        return address;
    }
}

3、ExcelListerner.java
读取文件时候通过这个文件进行业务处理

package com.easyexcel.demo;

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

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

/**
 * 解析监听器,
 * 每解析一行会回调invoke()方法。
 * 整个excel解析结束会执行doAfterAllAnalysed()方法
 */
public class ExcelListerner extends AnalysisEventListener {

    private List<Object> datas = new ArrayList<>();

    @Override
    public void invoke(Object object, AnalysisContext context) {
        System.out.println("当前行:" + context.getCurrentRowNum());
        System.out.println(object);
        //数据存储到list,供批量处理,或后续自己业务逻辑处理。
        datas.add(object);
        //根据自己业务做处理
        doSomething(object);
    }

    private void doSomething(Object object) {
        //1、入库调用接口
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //解析结束销毁不用的资源
        datas.clear();
    }

    public List<Object> getDatas() {
        return datas;
    }

    public void setDatas(List<Object> datas) {
        this.datas = datas;
    }
}

4、ExcelModelTest.java
读和写测试

package com.easyexcel.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;

@RunWith(SpringJUnit4ClassRunner.class)
public class ExcelModelTest {
    @Test
    public void write() throws IOException {
        OutputStream out = new FileOutputStream("E:\\123.xlsx");
        try {
            List<ExcelModel> list = new ArrayList<>();
            ExcelModel excelModel = new ExcelModel();
            excelModel.setId("123456");
            excelModel.setName("你好");
            excelModel.setAddress("中国");
            list.add(excelModel);
            ExcelWriter excelWriter = new ExcelWriter(out, ExcelTypeEnum.XLSX);
            Sheet sheet = new Sheet(1, 0, ExcelModel.class);
            excelWriter.write(list, sheet);
            excelWriter.finish();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            out.close();
        }
    }

    @Test
    public void read() throws IOException {
        InputStream inputStream = new FileInputStream(new File("E:\\123.xlsx"));
        try {
            AnalysisEventListener listener = new ExcelListerner();
            ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null, listener);
            excelReader.read(new Sheet(1, 1, ExcelModel.class));
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            inputStream.close();
        }
    }
}

以上就是对 excel 读写简单实用,自己再实用过程中还可以进行封装,在项目中更实用,还请各位大佬多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值