最近项目中用到了阿里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的有参构造器然后报错,浪费了半天时间。

最新文章

  1. js,jq新增元素 ,on绑定事件无效
  2. CentOS7下安装MySQL5.7安装与配置(转)
  3. How To Use FETCH_RECORDS In Oracle Forms
  4. Lingo 做线性规划 - Revenue Management
  5. 骨牌铺方格[HDU2046]
  6. 安装pypcap = 安装flex:the fast lexical analyser + 安装libpcap-1.7.4
  7. java中的@Override是否需要
  8. busbox编译出错,arm-linux-未找到命令
  9. 转:PHP非阻塞模式
  10. 使用APMServ本地搭建多个网站
  11. Oracle触发器trigger3利用时间限制用户输入
  12. BEGINNING SHAREPOINT&amp;#174; 2013 DEVELOPMENT 第3章节--SharePoint 2013 开发者工具 站点设置
  13. 三菱Q系列PLC基本指令讲解
  14. JDK1.8源码(二)——java.lang.Integer 类
  15. Android为TV端助力 电影栏目移动到底部或者顶部时抖动动画
  16. Android Native crash日志分析
  17. tqdm介绍及常用方法
  18. Shell脚本中的 测试开关 和 特殊参数
  19. Qt Xml Dom
  20. MySQL——SQL Mode详解

热门文章

  1. CUMTCTF&#39;2020 已做wp
  2. Linux 文件系统之入门必看!
  3. 深入总结Javascript原型及原型链
  4. 第一次面试linux后台岗位
  5. matlab中figure 创建图窗窗口
  6. matlab中ceil朝正无穷大四舍五入
  7. 正则表达式查找“不包含XXX字符串”
  8. iPhone手机越狱-逆向砸壳-代码注入
  9. 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】
  10. javascript 原型与原型链浅析