EasyExcel简单操作

        一、EasyExcel是较轻量级的Excel操作框架,由阿里开源的项目。

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

        引入依赖:

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

        二、EasyExcel的简单读写操作,工具类如下:

package XX.XX.XX.XX.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSONObject;
import com.southfund.risk.test.model.Student;
import org.apache.poi.ss.formula.functions.T;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
 * @Author xiarg
 * @CreateTime 2022/10/28  15:12
 */
public class ExcelUtil<T> {

    private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);

    public List<T> readExcel(T t,String filePath){
        List<T> returnList = new ArrayList<>();
        // 匿名内部类 不用额外写一个DemoDataListener
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(filePath, t.getClass(), new ReadListener<T>() {
            /**
             * 单次缓存的数据量
             */
            public static final int BATCH_COUNT = 100;
            /**
             *临时存储
             */
            private List<T> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

            @Override
            public void invoke(T t, AnalysisContext context) {
                cachedDataList.add(t);
                returnList.add(t);
                if (cachedDataList.size() >= BATCH_COUNT) {
                    saveData();
                    // 存储完成清理 list
                    cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
                }
            }

            /**
             * 执行到最后如果数据不满 BATCH_COUNT
             */
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                saveData();
            }
            /**
             * 加上存储数据库
             */
            private void saveData() {
                logger.info("{}条数据,开始存储数据库!", cachedDataList.size());
                logger.info("存储数据库成功!");
            }
        }).sheet().doRead();

        return returnList;
    }

    public void writerExcel(T t,String filePath,String sheetName,List<T> dataList){
        // 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(filePath, t.getClass())
                .sheet(sheetName)
                .doWrite(dataList);
    }

}

        读取数据可以有两种选择,1、根据泛型T的不同,分批次的saveData保存数据。2、保存在returnList中,并且进行返回,但是如果数据量大,容易OOM。

        写入数据就很简单,把dataList中的数据写入Excel,也可以循环调用写入方法,而不是一次全部写入。

        三、页面的上传和下载

    @PostMapping("upload")
    @ResponseBody
    public String upload(MultipartFile file) throws IOException {
        EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
        return "success";
    }

    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
    }

        上传:UploadData 是上传数据的实体类,UploadDataListener 是监听器(实现 ReadListener<T>,里面可以确认读多少数据写一次数据,还是做点其他的什么),uploadDAO 是操作数据库的Dao。

        下载:DownloadData 是写入数据实体类,data() 是写入的数据。

        官方API地址:关于Easyexcel | Easy ExcelEasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目,在尽可能节约内存的情况下支持读写百M的Excel。https://easyexcel.opensource.alibaba.com/docs/current/        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值