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<>();
/**
* 这个每一条数据解析都会来调用
*
* @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使用心得的更多相关文章
- 阿里出品Excel工具EasyExcel使用小结
前提 笔者做小数据和零号提数工具人已经有一段时间,服务的对象是运营和商务的大佬,一般要求导出的数据是Excel文件,考虑到初创团队机器资源十分有限的前提下,选用了阿里出品的Excel工具EasyExc ...
- 海量数据Excel报表利器——EasyExcel(开场篇)
EasyExcel 简介篇 互联网的精髓就是共享,可以共享技术.共享经验.共享情感.共享快乐~ 很多年前就有这个想法了,从事IT行业时间也不短了,应该把自己工作和业余所学习的东西记录并分享出来,和有缘 ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- NoSql数据库使用半年后在设计上面的一些心得
NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...
- 我的MYSQL学习心得(二) 数据类型宽度
我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(三) 查看字段长度
我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(四) 数据类型
我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...
- 我的MYSQL学习心得(五) 运算符
我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
随机推荐
- Java随谈(一)魔术数字、常量和枚举
本文适合对 Java 或 C 有一些了解的用户阅读,推荐阅读时间15分钟. 导言 写这个系列的原因? 我曾经听过一种说法,如果不了解Liunx的网络通讯,就很难理解理解Java的IO:如果不知道Jav ...
- 关于TCP建立连接
TCP大家大多称之为"三次握手".今天看了一篇文章,学到了"三步握手". TCP建立连接,客户端发送SYN给服务端,服务端接收到请求回应ACK.服务端发送SYN ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- 帮你理清React的生命周期
这是一个从印记中文 | react官方文档提取总结的,算是帮自己理清并且强化记忆React的生命周期,以便以后编写组件的时候能够有更清晰的思路.本文如有纰漏,欢迎指正 整体上来讲,React生命周期分 ...
- Servlet3.x部署描述符
简介 web.xml即部署描述符,位于WEB-INF目录下.在Servlet3以上版本有提供了注解的方式部署Servlet,因此web.xml是可选的.web.xml大概框架如下: <?xml ...
- 基于GAN的特征抽取 Feature Extraction by GAN
InfoGAN 期望的是 input 的每一个维度都能表示输出数据的某种特征.但实际改变输入的一个特定维度取值,很难发现输出数据随之改变的规律. InfoGAN 就是想解决这个问题.在 GAN 结构以 ...
- 我把这个贼好用的Excel导出工具开源了!!
写在前面 不管是传统软件企业还是互联网企业,不管是管理软件还是面向C端的互联网应用.都不可避免的会涉及到报表操作,而对于报表业务来说,一个很重要的功能就是将数据导出到Excel.如果我们在业务代码中, ...
- 03 ArcPython实战篇一
1.自增计算 (字段计算器) total = 0 def accumulate(increment): global total if total: ...
- Arduino 多线程简单代码
转载: 1. https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html 2. https://v.youku.com/v_show/id ...
- Arduino 寻找I2C地址address
参考:http://henrysbench.capnfatz.com/henrys-bench/arduino-projects-tips-and-more/arduino-quick-tip-fin ...