最近项目中用到了阿里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<>();
/**
* 这个每一条数据解析都会来调用
*
* @param data
* one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(T data, AnalysisContext context) {
log.info("解析到一条数据:{}", JSON.toJSONString(data));
list.add(data);
}
/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
//清除数据
log.info("所有数据解析完成!");
} public List<T> getDatas() {
return list;
}

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


/**
*
* 用阿里easyExcel实现对Excel的读、写操作
* @author hhb
* @date :2020/10/14 15:55
*/ public class ExcelUtils { /**
* 读Excel操作
* @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();
//根据实际业务需求来选择,是否有返回值
data=listener.getDatas();
} catch (IOException e) {
e.printStackTrace();
}
return data;
} /**
* 写Excel操作
*
*
* @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();
}
} /**
* 导出文件时为Writer生成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");
//此处指定了文件类型为xls,如果是xlsx的,请自行替换修改
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("导出文件失败!");
}
}

最后,你可以根据项目实际情况调用工具类,和对其进行修改。

需要注意的是!!!!!!

在写处理Excel数据的DTO类时需要保证类里面有一个无参构造器。我就是当时只写了一个将数据库实体类转化为DTO的有参构造器然后报错,浪费了半天时间。

EasyExcel使用心得的更多相关文章

  1. 阿里出品Excel工具EasyExcel使用小结

    前提 笔者做小数据和零号提数工具人已经有一段时间,服务的对象是运营和商务的大佬,一般要求导出的数据是Excel文件,考虑到初创团队机器资源十分有限的前提下,选用了阿里出品的Excel工具EasyExc ...

  2. 海量数据Excel报表利器——EasyExcel(开场篇)

    EasyExcel 简介篇 互联网的精髓就是共享,可以共享技术.共享经验.共享情感.共享快乐~ 很多年前就有这个想法了,从事IT行业时间也不短了,应该把自己工作和业余所学习的东西记录并分享出来,和有缘 ...

  3. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  4. NoSql数据库使用半年后在设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...

  5. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  6. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  7. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  8. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  9. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

随机推荐

  1. explain为mysql关键字,不能作为表字段创建

    在用jpa自动建表时,字段名命名为了explain,发现报实体类与数据库表字段不一致的错,查询才发现explain是mysql的关键字,无法作为表字段建立,特此记录

  2. spring+springmvc+mybatis+shiro

    创建maven框架https://blog.csdn.net/Ajax_mt/article/details/78549119 具体下边 https://blog.csdn.net/w2222288/ ...

  3. jpa基本常识

    1.hibernate更新表结构配置 jpa hibernate框架配置 spring.jpa.properties.hibernate.hbm2ddl.auto = create-drop 其意思是 ...

  4. Java基础——缓存

    1.缓存 将程序或系统中常用的数据对象存储在像内存这样特定的介质中,以避免在每次程序调用时,重新创建或组织数据所带来的性能损耗,从而提高了系统的整体运行速度 以目前的系统架构来说,用户的请求一般会先经 ...

  5. windows 10 启动修复无法自动修复此计算机

    1. 失败后有两个选项卡:关机和高级选项,选择高级选项 2. 然后选择疑难解答 3. 选择高级选项 4. 选择回退到以前的版本 接下来需要登录,选择恢复到上一次正常启动的状态,注意选择保留数据,会有提 ...

  6. Numpy-数组array操作

    array是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的. 每个数组都有一个shape(一个表示各维度大小的元组)和一个dtype(一个用于说明数组数据类型的对象). 数组的形 ...

  7. 深入研究RocketMQ消费者是如何获取消息的

    前言 小伙伴们,国庆都过的开心吗?国庆后的第一个工作日是不是很多小伙伴还沉浸在假期的心情中,没有工作状态呢? 那王子今天和大家聊一聊RocketMQ的消费者是如何获取消息的,通过学习知识来找回状态吧. ...

  8. Java中的对象都是在堆上分配的吗?

    作者:LittleMagic https://www.jianshu.com/p/8377e09971b8 为了防止歧义,可以换个说法: Java对象实例和数组元素都是在堆上分配内存的吗? 答:不一定 ...

  9. golang拾遗:指针和接口

    这是本系列的第一篇文章,golang拾遗主要是用来记录一些遗忘了的.平时从没注意过的golang相关知识.想做本系列的契机其实是因为疫情闲着在家无聊,网上冲浪的时候发现了zhuihu上的go语言爱好者 ...

  10. CMD/ENTROYPOINT区别

    CMD/ENTROYPOINT区别 相同点:都是指定一个容器:启动时要运行的命令 不同点(重点): CMD: dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker ...