最近项目中用到了阿里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. 从CPU缓存看缓存的套路

    一.前言 不同存储技术的访问时间差异很大,从 计算机层次结构 可知,通常情况下,从高层往底层走,存储设备变得更慢.更便宜同时体积也会更大,CPU 和内存之间的速度存在着巨大的差异,此时就会想到计算机科 ...

  2. vue学习03 v-html

    vue学习03v-html v-html指令的作用是:设置元素的内部html链接 内容有html 的结构会被解析为标签 v-text指令无论内容是什么,只会解析文本 解析文本使用v-text,需要解析 ...

  3. ARCENGINE 10 开发遇到的一些问题

    许多版友在刚刚使用ArcGIS 10做开发的时候,都会遇到这样那样的问题.在担任实习版主的这一个多月里,看到了这么几个与开发环境相关的问题,重复被提到相当多,于是我就做了这个FAQ.Q:哪儿有10的A ...

  4. Centos-统计文件或目录占用磁盘空间-du

    du 显示文件或目录所占磁盘空间总量 相关选项 -s 显示文件或者整个目录的大小,默认单位为KB -b 指定单位为byte -h     人类友好读方式显示 -m 指定单位为 MB

  5. Go-missing return at end of function

    where? Go程序中函数在执行的时候 why? 函数有返回参数,但是函数没有return关键字,报错 way? 添加return返回函数需要返回的参数

  6. 如何用5000行JS撸一个关系型数据库

    首先声明,我不是标题党,我真的是用5000行左右的JS实现了一个轻量级的关系型数据库JSDB,核心是一个SQL编译器,支持增删改查. 源代码放到github上了:https://github.com/ ...

  7. 06 C语言变量

    C语言变量 变量的本质 变量的本质其实是程序可操作的存储区的名称. C 中每个变量都有特定的类型,类型决定了变量存储的大小的范围,在范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以 ...

  8. Arduino 串行外设接口(SPI)

    时间有限有其他项目工作在忙,感觉作者写的不错,就先记录下来了. 这几天用SPI--Arduino 在供应商的电子原件上游离游走,重要的是可以读写了, 下面是在查资料看到的一篇不错的文章关于用Ardui ...

  9. SQL审核平台Yearning部署

    SQL审核平台Yearning部署  Yearning优势: Yearning SQL 审计平台 基于Vue.js与Django的整套mysql-sql审核平台解决方案.提供基于Inception的S ...

  10. 2-K8S常用命令

    kubectl 命令行管理工具 类型 命令 描述 基础命令 create 通过文件名或标准输入创建资源 expose 为Deployment,Pod创建service run 在集群中运行一个特定的镜 ...