利用 EasyExcel 进行Excel读写


简介

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

准备

引入maven

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

开始使用

1、创建Excel对应的实体类对象,DemoData

public class DemoData implements Serializable{
    /**
     * @ExcelProperty({"主标题","编码"})
     * 可以通过 @ExcelProperty 实现多行表头的读写(如:主标题为一级表头,编码为二级表头)
     */
    @ExcelProperty({"编码"})
    private Integer id;
    @ExcelProperty({ "手机号"})
    private String phone;

    public Integer getId() {
        return id;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

2、创建读取Excel的回调监听器,DemoDataListener

public class DemoDataListener extends AnalysisEventListener<DemoData> {

    /**
     * 每隔5条存储数据库,然后清理list,方便内存回收
     */
    private static final int BATCH_COUNT = 5;

    List<DemoData> list = new ArrayList<DemoData>();

    /**
     * 自定义service,也可以是dao,处理读取到的excel数据
     */
    private DemoDataService demoDataService;

    // 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
    public DemoDataListener(DemoDataService demoDataService){
        this.demoDataService = demoDataService;
    }

    // 这个每一条数据解析都会来调用
    @Override
    public void invoke(DemoData demoData, AnalysisContext analysisContext) {
        list.add(demoData);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条放在内存,容易oom
        if(list.size() >= BATCH_COUNT){
            saveData();
            list.clear();
        }
    }

    // 存储到数据库
    private void saveData(){
        log.info("{}条数据,开始存储数据库",list.size());
        demoDataService.save(list);
        log.info("存储数据成功");
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        log.info("所有数据解析完成");
    }
}

读Excel-单个sheet

    /**
     * 1、创建Excel对应的实体类对象,DemoData
     * 2、创建读取Excel的回调监听器,DemoDataListener
     */
    public void read(){
        String fileName = filePath + "demo.xlsx";//文件路径
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener(demoDataService)).sheet().doRead();
    }

读Excel-多个sheet

    /**
     * 1、创建Excel对应的实体类对象,DemoData
     * 2、创建读取Excel的回调监听器,DemoDataListener
     */
    public void repeatRaad(){
        String fileName = filePath + "demo.xlsx";//文件路径

        // 读取部分sheet
        ExcelReader excelReader = null;
        try {
            excelReader = EasyExcel.read(fileName).build();

            ReadSheet readSheet1 =
                    EasyExcel.readSheet(0).head(DemoData.class)
                            .registerReadListener(new DemoDataListener(demoDataService)).build();
            ReadSheet readSheet2 =
                    EasyExcel.readSheet(1).head(DemoData.class)
                            .registerReadListener(new DemoDataListener(demoDataService)).build();
            excelReader.read(readSheet1, readSheet2);
        }finally {
            if (excelReader != null){
                excelReader.finish();
            }
        }
    }

写Excel

    public void write(){
        String fileName = filePath + "demo.xlsx";//文件路径
        List<DemoData> list = demoDataService.select();
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(list);
    }

从数据库导出Excel,文件下载

    public void download(HttpServletResponse response) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("UTF-8");
        String fileName = URLEncoder.encode("demo", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        List<DemoData> list = demoDataService.select();
        EasyExcel.write(response.getOutputStream(), DemoData.class).sheet("模板").doWrite(list);
    }

最后

通过 EaseExcel 可以优雅的对Excel进行读写操作,方便快捷,简单好用。本文只是介绍了最简单的读写方法,详情使用方法请参考EasyExcel使用说明, github地址:https://github.com/alibaba/easyexcel


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM