EasyExcel简单操作

导读:本篇文章讲解 EasyExcel简单操作,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

        一、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。EasyExcel简单操作https://easyexcel.opensource.alibaba.com/docs/current/        

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89032.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!