使用阿里开源的EasyExcel导入导出EXCEL

一、EasyExcel简介

EasyExcel官网

1.作者对easyexcel的介绍是:

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便

2.其他介绍:

EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

二、使用EasyExcel

1.引入依赖

com.alibabaeasyexcel2.1.6
2.创建要导出的实体类

在poi框架中,表头信息要自己设置,使用EasyExcel时,可以用注解代替:com.alibaba.excel.annotation.ExcelProperty

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;import java.util.Date;@Data
public class UserDTO {@ExcelProperty(index = 0,value = "编号")private Long id;@ExcelProperty(index = 1,value = "姓名")private String name;@ExcelProperty(index = 2,value = "年龄")private Integer age;@ExcelProperty(index = 3,value = "性别")private String sex;@ExcelProperty(index = 4,value = "出生日期")private Date birthday;@ExcelIgnoreprivate Boolean isDeleted;
}

alibaba EasyExcel注解使用介绍

3.简单导出示例
/*** 导出excel* @param fileName 导出的文件名* @param response 响应* @param request  请求* @param lists    导出的数据* @param       导出的实体类泛型*/public static <T> void writerExcel(String fileName, HttpServletResponse response, HttpServletRequest request, List<T> lists, Class<T> clazz) {String sheetName = fileName;try {String userAgent = request.getHeader("User-Agent");if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {// 针对IE或者以IE为内核的浏览器:fileName = java.net.URLEncoder.encode(fileName, "UTF-8");} else {// 非IE浏览器的处理:fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);}response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName + ".xlsx"));response.setHeader("Cache-Control", "no-cache");response.setHeader("Pragma", "no-cache");response.setDateHeader("Expires", -1);} catch (UnsupportedEncodingException e1) {log.error("导出excel未知编码异常", e1);}try {EasyExcel.write(response.getOutputStream(), clazz).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet(sheetName).doWrite(lists);} catch (IOException e) {log.error("导出excel文件异常", e);}}
4.简单导入示例
  1. 创建监听器
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Data;import java.util.ArrayList;
import java.util.Map;/*** 监听器,每解析一行会回调invoke方法;* 整个excel解析结束会执行doAfterAllAnalysed方法* @param */
@Data
public class GeneralExcelListener<T> extends AnalysisEventListener<T> {private ArrayList<T> datas = new ArrayList<>();private Map<Integer, String> headMap;/*** 读取表头信息* @param headMap 表头信息* @param context*/@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {this.headMap = headMap;}/*** 一行一行去读取excle内容* @param data  当前行数据*/@Overridepublic void invoke(T data, AnalysisContext context) {datas.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {}}
  1. 实体类同上

  2. 编写导入方法

   /*** 创建对象读取excel* @param    实体类泛型* @param excel 文件流* @param sheet 读取的sheet* @param clazz 实体类* @return 导入的数据集合*/public static <T> ArrayList<T> readerExcel(MultipartFile excel, ReadSheet sheet, Class<T> clazz) throws Exception {if (excel.isEmpty()) {throw new Exception("请选择excel文件");}String fileName = excel.getOriginalFilename();log.info("Excel文件解析:文件名 = " + fileName);if (fileName == null || (!fileName.toLowerCase().endsWith(".xls") && !fileName.toLowerCase().endsWith(".xlsx"))) {throw new Exception("文件格式错误");}sheet.setSheetName(fileName);try(InputStream fileStream = new BufferedInputStream(excel.getInputStream())) {GeneralExcelListener<T> excelListener = new GeneralExcelListener<>();EasyExcel.read(fileStream, clazz, excelListener).autoTrim(true).sheet().doRead();return excelListener.getDatas();} catch (Exception e) {log.error("导入失败, 请检查导入数据的准确性", e);throw new Exception("导入失败, 请检查导入数据的准确性");}}
5.工具类示例


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部