EasyExcel使用心得

最近项目中用到了阿里easyExcel做导入导出功能
下面是我写的一个工具类,带泛型的。拿来即用,有需求的小伙伴可以看看。
同时也欢迎大佬提出修改意见。

一、首先先写一个生成Excel表头的DTO类,也可以直接在自己的要处理的实体类加上@ExcelProperty注解。
value表示表头,index表示第几列。0等于第一列


public class ElecsignCertExcelDTO{
   /**
    * R3编码
    */
   @ApiModelProperty("R3编码")
   @ExcelProperty(value = "R3编码", index = 0)
   private String r3Code;

   /**
    * R3名称
    */
   @ApiModelProperty("R3名称")
   @ExcelProperty(value = "R3名称", index = 1)
   private String r3Name;

   /**
    * 用户名
    */
   @ApiModelProperty("用户名")
   @ExcelProperty(value = "用户名", index = 2)
   private String userName;
}

二、进行写操作所需的Listener类,需要继承easyExcel自带的监听器AnalysisEventListener。
我是参照官方文档进行编写,详情可以参照官方文档https://www.yuque.com/easyexcel/doc/easyexcel
也可以看其github演示地址https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/read/ReadTest.java

/**
 * @author hhb
 * @date :2020/10/27 8:57
 */
@Slf4j
public class ReadExcelListener<t> extends AnalysisEventListener<t> {

    List<t> list = new ArrayList<>();
    /**
     * &#x8FD9;&#x4E2A;&#x6BCF;&#x4E00;&#x6761;&#x6570;&#x636E;&#x89E3;&#x6790;&#x90FD;&#x4F1A;&#x6765;&#x8C03;&#x7528;
     *
     * @param data
     *            one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(T data, AnalysisContext context) {
        log.info("&#x89E3;&#x6790;&#x5230;&#x4E00;&#x6761;&#x6570;&#x636E;:{}", JSON.toJSONString(data));
        list.add(data);
    }
    /**
     * &#x6240;&#x6709;&#x6570;&#x636E;&#x89E3;&#x6790;&#x5B8C;&#x6210;&#x4E86; &#x90FD;&#x4F1A;&#x6765;&#x8C03;&#x7528;
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        //&#x6E05;&#x9664;&#x6570;&#x636E;
        log.info("&#x6240;&#x6709;&#x6570;&#x636E;&#x89E3;&#x6790;&#x5B8C;&#x6210;&#xFF01;");
    }

    public List<t> getDatas() {
        return list;
    }

</t></t></t></t>

三、这一步就可以开始写Excel工具类了,


/**
 *
 *  &#x7528;&#x963F;&#x91CC;easyExcel&#x5B9E;&#x73B0;&#x5BF9;Excel&#x7684;&#x8BFB;&#x3001;&#x5199;&#x64CD;&#x4F5C;
 * @author hhb
 * @date :2020/10/14 15:55
 */

public class ExcelUtils {

    /**
     * &#x8BFB;Excel&#x64CD;&#x4F5C;
     * @param file
     * @param cls
     * @param listener
     * @param <t>
     * @return
     */
    public static <t> List<t> readExcel(MultipartFile file,Class<t> cls,ReadExcelListener<t> listener){
//        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
        List<t> data=new ArrayList<>();
        try {
            EasyExcel.read(file.getInputStream(),cls,listener).sheet().doRead();
            //&#x6839;&#x636E;&#x5B9E;&#x9645;&#x4E1A;&#x52A1;&#x9700;&#x6C42;&#x6765;&#x9009;&#x62E9;&#xFF0C;&#x662F;&#x5426;&#x6709;&#x8FD4;&#x56DE;&#x503C;
            data=listener.getDatas();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }

    /**
     * &#x5199;Excel&#x64CD;&#x4F5C;
     *
     *
     * @param response
     * @param fileName
     * @param cls
     * @param dataList
     * @param <t>
     */
    public static <t> void wirteExcel(HttpServletResponse response,String fileName,Class<t> cls,List<t> dataList){
//        EasyExcel.write(fileName, cls).sheet("sheet1").doWrite(dataList);
        try {
            EasyExcel.write(getOutputStream(fileName,response),cls).sheet("sheet1").doWrite(dataList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * &#x5BFC;&#x51FA;&#x6587;&#x4EF6;&#x65F6;&#x4E3A;Writer&#x751F;&#x6210;OutputStream
     * @param fileName
     * @param response
     * @return
     * @throws Exception
     */
    private static OutputStream getOutputStream(String fileName, HttpServletResponse response)
        throws Exception{
        try{
            fileName = URLEncoder.encode(fileName,"utf-8");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            //&#x6B64;&#x5904;&#x6307;&#x5B9A;&#x4E86;&#x6587;&#x4EF6;&#x7C7B;&#x578B;&#x4E3A;xls&#xFF0C;&#x5982;&#x679C;&#x662F;xlsx&#x7684;&#xFF0C;&#x8BF7;&#x81EA;&#x884C;&#x66FF;&#x6362;&#x4FEE;&#x6539;
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "no-store");
            response.addHeader("Cache-Control", "max-age=0");
            return response.getOutputStream();
        } catch (IOException e){
            throw new Exception("&#x5BFC;&#x51FA;&#x6587;&#x4EF6;&#x5931;&#x8D25;&#xFF01;");
        }
    }

</t></t></t></t></t></t></t></t></t></t>

最后,你可以根据项目实际情况调用工具类,和对其进行修改。
需要注意的是!!!!!!
在写处理Excel数据的DTO类时需要保证类里面有一个无参构造器。我就是当时只写了一个将数据库实体类转化为DTO的有参构造器然后报错,浪费了半天时间。

Original: https://www.cnblogs.com/ydmysm/p/study_in_easyExcel.html
Author: 樱岛麻衣Ss
Title: EasyExcel使用心得

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609271/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 260_RabbitMQ面试题分析

    Rabbitmq 为什么需要信道,为什么不是TCP直接通信 queue队列到底在消费者创建还是生产者创建? Rabbitmq 为什么需要信道,为什么不是TCP直接通信 :::inf…

    Java 2023年6月7日
    0125
  • springboot @ConfigurationProperties注册源码解析-松散绑定

    参考:https://wenku.baidu.com/view/ccfcf417598102d276a20029bd64783e09127def.html https://blog…

    Java 2023年5月30日
    081
  • mybatis-plus的BaseMapper入门使用

    入门使用BaseMapper完成增删改查 根据数据库表制作相应实体类 @TableName(value = "user") @Date public class…

    Java 2023年6月9日
    085
  • 什么是前缀索引?

    一、什么是前缀索引? 所谓前缀索引,说白了就是对文本的前几个字符建立索引( 具体是几个字符在建立索引时去指定),比如以产品名称的前 10 位来建索引,这样建立起来的索引更小,查询效…

    Java 2023年6月9日
    086
  • 好玩Python——PIL项目实训(四)——美白磨皮

    1 # 图像基础调整: 图像的亮度、对比度、色度,还可以用于增强图像的锐度,美白 2 # """ 3 4 from PIL import Image …

    Java 2023年6月6日
    079
  • Java面向对象(三)

    Java面向对象(三) Java面向对象(三) – 六、面向对象特征之一:封装性 6.1 封装性的引入: 6.2 封装性的体现: 6.3 封装性的体现, 需要权限修饰符…

    Java 2023年6月9日
    079
  • SpringBoot整合Redis–RedisTemplate

    1、导入依赖 org.springframework.boot spring-boot-starter-data-redis 2、编写配置文件 spring: redis: hos…

    Java 2023年6月8日
    085
  • Spring 中经典的 9 种设计模式,打死也要记住啊!

    来源:blog.csdn.net/caoxiaohong1005 转载: https://mp.weixin.qq.com/s/HdOKIp_rFgX-h65M0pRK9Q 1.简…

    Java 2023年5月30日
    074
  • 遇到的一道算法题

    题目是给定一个字符串, 该字符串是一种简单的类似于Javascript函数调用。 比如 func1(123, 456) 或者 func1(123, 456, func2(78, &…

    Java 2023年6月5日
    083
  • rabbitmq 安装

    rabbitmq 安装 官网地址 https://rabbitmq.com/download.html 前言 RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang…

    Java 2023年6月9日
    095
  • java学习之JSP

    JSP:全拼写:java Server pages:java 服务器端页面可以理解为一个特殊的页面:可以定义html代码也可以定义java的代码定义:JSP是简化Servlet编写…

    Java 2023年6月13日
    072
  • JS input输入框字数超出长度显示省略号…..

    样式添加: overflow:hidden; white-space:nowrap; text-overflow:ellipsis; Original: https://www.c…

    Java 2023年6月9日
    074
  • JAVA字符串格式化-String.format()的使用

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。form…

    Java 2023年5月29日
    062
  • ReentrantLock的原理解析

    重入锁(ReentrantLock)是一种可重入无阻塞的同步机制。性能同synchronized接近(老版本jdk中性能很差)。 下面重点看下常用的lock()和unlock()方…

    Java 2023年6月6日
    081
  • 【全网最全】springboot整合JSR303参数校验与全局异常处理

    一、前言 我们在日常开发中,避不开的就是参数校验,有人说前端不是会在表单中进行校验的吗?在后端中,我们可以直接不管前端怎么样判断过滤,我们后端都需要进行再次判断, &#x4…

    Java 2023年6月15日
    077
  • 设计模式 — Observer(观察者模式)

    在软件构建的过程中,我们需要为某些对象建立一种”通知依赖关系”——一个对象(目标对象)的状态发生改变,其他对象(观察者对象)都将得到通知。如果这样的依赖关系…

    Java 2023年6月16日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球