赞
踩
Java解析、生成Excel比较有名的框架有Apache
poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI
sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便
16M内存23秒读取75M(46W行25列)的Excel(3.2.1+版本)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
创建实体类使用 @ExcelProperty、@ExcelIgnore 等注解标识导出列;
@ExcelIgnore 表示忽略此字段
@ExcelProperty 用于标识列 value属性设置列的名称,index属性设置设置列的序号 从 0 开始
更多注解说明在:前往
@Data @NoArgsConstructor @AllArgsConstructor public class GamesExcelVO { /** * @description: 使用@ExcelIgnore注解忽略此字段 **/ @ExcelIgnore private String id; /** * @description: 使用@ExcelProperty标识列 * value属性设置列的名称,index属性设置设置列的序号 从 0 开始 **/ @ExcelProperty(value = "名称",index = 0) private String name; @ExcelProperty(value = "类型",index = 1) private String type; @ExcelProperty(value = "价格",index = 2) private BigDecimal price; }
@GetMapping("/excelExport") public void excelExport(HttpServletResponse response) throws IOException { try{ //导出数据(这里使用假数据用来测试) List<GamesExcelVO> list = Arrays.asList( new GamesExcelVO( UUID.randomUUID().toString().replace("-", ""), "荒野大镖客:救赎2", "开放世界、剧情", new BigDecimal("299.5") ), new GamesExcelVO( UUID.randomUUID().toString().replace("-", ""), "上古卷轴5:天际", "开放世界、冒险", new BigDecimal("199.5") ), new GamesExcelVO( UUID.randomUUID().toString().replace("-", ""), "塞尔达传说:王国之泪", "开放世界、冒险", new BigDecimal("399.5") ) ); //使用easyExcel导出表格 EasyExcel.write(response.getOutputStream(),GamesExcelVO.class) .sheet("游戏价格") //sheet页名称 .doWrite(list); //将要导出的数据 }catch (Exception e){ log.error("导出失败",e); }finally { //关闭流 response.flushBuffer(); } }
导出的文件:
可将@ExcelProperty注解的value属性指定为一个数组来实现复杂表头的导出
@Data @NoArgsConstructor @AllArgsConstructor public class ClassesExcelVO { /** * @description: 可将@ExcelProperty注解的value属性指定为一个数组来实现复杂表头的导出 **/ @ExcelProperty(value = {"1级表头","2"},index = 0) private Integer title1; @ExcelProperty(value = {"1级表头","3"},index = 1) private Integer title2; @ExcelProperty(value = {"1级表头","4"},index = 2) private Integer title3; @ExcelProperty(value = {"1级表头","5"},index = 3) private Integer title4; @ExcelProperty(value = {"1级表头","2级表头","6"},index = 4) private Integer title5; @ExcelProperty(value = {"1级表头","2级表头","7"},index = 5) private Integer title6; @ExcelProperty(value = {"1级表头","8"},index = 6) private Integer title7; @ExcelProperty(value = {"1级表头","9"},index = 7) private Integer title8; }
/** * @description: easyExcel复杂表头导出 * @author: Vinci * @date: 2023/8/18 13:04 **/ @GetMapping("/complexExcelExport") public void complexExcelExport(HttpServletResponse response) throws IOException { try{ //与简单easyExcel导出的方式一样,仅导出对象方式发生变化 //创建用于测试的假数据 ArrayList<ClassesExcelVO> list = new ArrayList<>(); for (int i = 0; i < 1000; i++) { list.add(new ClassesExcelVO(i,i,i,i,i,i,i,i)); } //使用easyExcel导出表格 EasyExcel.write(response.getOutputStream(),ClassesExcelVO.class) .sheet("复杂表头导出测试") //sheet页名称 .doWrite(list); //将要导出的数据 }catch (Exception e){ log.error("导出失败",e); }finally { //关闭流 response.flushBuffer(); } }
导出的文件:
我们使用 标题2 excel复杂表头导出的excel文件来进行测试,代码如下:
@GetMapping("/excelImport") public void excelImport(@RequestParam("file") MultipartFile file){ //使用刚刚的复杂导入模板来测试easyExcel导入 try { List<ClassesExcelVO> datas = EasyExcel.read(file.getInputStream(), ClassesExcelVO.class, null) .excelType(ExcelTypeEnum.XLSX) //可指定文件的导入类型 .sheet(0)//读取sheet页码,读取多个sheet页可利用循环来进行读取,页码从0开始 .headRowNumber(4) //设置表头,可理解为 读取行 - 1 .autoTrim(false) //读取数据时忽略空格,默认忽略 .doReadSync(); //读取到的数据 datas.forEach(System.out::println); } catch (Exception e) { log.error("导入失败:",e); } }
控制台打印:
案例Git仓库地址:https://gitee.com/vinci99/easy-excel-demo.git
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。