我是靠谱客的博主 体贴小甜瓜,最近开发中收集的这篇文章主要介绍java:EasyExcel实现多sheet页导入导出,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第一次使用easyExcel,记一次SpringBoot实现的demo。一个文件多个sheet页操作。多sheet多实体(不同的实体导出到不同的sheet,不同的sheet导入到不同的表)

写在前面:demo里有些重复的代码,如果有大佬看到并能帮忙改进,感激不尽。希望能帮到需要的人。上代码顺序:工具类--实体--mapper-service--controller--演示结果

 easyExcel官方地址: Alibaba Easy Excel - 简单、省内存的Java解析Excel工具 | 首页

先上导入

工具类

package com.example.easyexcel.utils;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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

/**
 * @ClassName:
 * @author: jiangze
 * @create: 2021-11-22 16:07
 * @description:
 */
@Slf4j
@Data
public class DemoDataListener<E> extends AnalysisEventListener<E> {
    private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
    private List<E> list = new ArrayList<E>();

    @Override
    public void invoke(E data, AnalysisContext context) {
        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
        list.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        LOGGER.info("当前sheet数据解析完成!");
    }
}

实体类

导入的实体类就是普通的实体类,

 

 mapper

 service

    @Override
    @Transactional
    public boolean inputEmpeInfo(MultipartFile file) throws IOException {
        boolean b = false;
        ExcelReader excelReader = EasyExcel.read(file.getInputStream()).build();
        /* 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,
         然后里面用到spring可以构造方法传进去*/
        DemoDataListener<EmpeInfo> listener = new DemoDataListener<>();
        /*
        * readsheet:从第几个sheet开始读
        * head:实体类.class
        * registerReadListener:新建的listenter
        * headRowNumber:从第几行开始读
        * */
        ReadSheet readSheet1 =
                EasyExcel.readSheet(0).head(EmpeInfo.class).registerReadListener(listener).headRowNumber(1).build();
        excelReader.read(readSheet1);
        List<EmpeInfo> empeInfos = listener.getList();//读取到的数据集合
        for (int j = 0; j < empeInfos.size(); j++) {
            b = easyExcelMapper.addEmpeINfo(empeInfos.get(j));//添加数据到库里
        }

        DemoDataListener<EdauInfo> listener1 = new DemoDataListener<>();
        ReadSheet readSheet2 =
                EasyExcel.readSheet(1).head(EdauInfo.class).registerReadListener(listener1).headRowNumber(1).build();
        excelReader.read(readSheet2);
        List<EdauInfo> edauInfos = listener1.getList();
        for (int j = 0; j < edauInfos.size(); j++) {
            b = easyExcelMapper.addEdauInfo(edauInfos.get(j));
        }

        DemoDataListener<WorkInfo> listener2 = new DemoDataListener<>();
        ReadSheet readSheet3 =
                EasyExcel.readSheet(2).head(WorkInfo.class).registerReadListener(listener2).headRowNumber(1).build();
        excelReader.read(readSheet3);
        List<WorkInfo> workInfos = listener2.getList();
        for (int j = 0; j < workInfos.size(); j++) {
            b = easyExcelMapper.addWorkInfo(workInfos.get(j));
        }
        // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
        excelReader.finish();
        return b;
    }
Controller
    @RequestMapping(value = "/inputEmpeInfo")
    @ResponseBody
    public String inputEmpeInfo(MultipartFile file) throws IOException {
        easyExcelService.inputEmpeInfo(file);
        return "true";
    }

演示结果

postman测试:

 文档格式

 导入结果

 接着上导出

 导出没有用到工具类

实体类

mapper 

 service

public void WriteEmpeInfo(HttpServletResponse response) throws IOException {
        String fileName = "EmpeInfo" + System.currentTimeMillis();
        ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();//创建文件
        /*创建sheet页
        * writerSheet:第几个sheet页,sheet页名
        * head:继承了BaseRowModel的实体类 .class
        * */
        WriteSheet empeInfo = EasyExcel.writerSheet(0, "empeInfo").head(EmpeInfoExcel.class).build();
        List<EmpeInfoExcel> empe = easyExcelMapper.selectEmpe();//查询数据库数据
        excelWriter.write(empe, empeInfo);//把查到的数据写进sheet页

        WriteSheet edauInfo = EasyExcel.writerSheet(1, "edauInfo").head(EdauInfoExcel.class).build();
        List<EdauInfoExcel> edau = easyExcelMapper.selectEdau();
        excelWriter.write(edau, edauInfo);

        WriteSheet workInfo = EasyExcel.writerSheet(2, "workInfo").head(WorkInfoExcel.class).build();
        List<WorkInfoExcel> work = easyExcelMapper.selectWork();
        excelWriter.write(work, workInfo);

        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");

        // 千万别忘记finish 会帮忙关闭流
        excelWriter.finish();
    }

controller

 演示结果

postman演示:因为我查询全部,所以没有传参,有需要可以自己传参

 接着是浏览器直接访问的方式

 总结

easyExcel确实很好用啊,但是我自己能力有限,结果就是有成功,有失败,瑕疵不分请各位不吝赐教!!拜托啦

最后

以上就是体贴小甜瓜为你收集整理的java:EasyExcel实现多sheet页导入导出的全部内容,希望文章能够帮你解决java:EasyExcel实现多sheet页导入导出所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部