使用EasyExcel实现Excel表格的导入导出
文章目录
- 使用EasyExcel实现Excel表格的导入导出
- 1.集成easyExcel
- 2.简单导出示例
- 实体与excel列的映射
- 导出excel的代码
- 3.Excel复杂表头导出
- 与实体的映射
- 导出代码
- 3.Excel导入
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+版本)
1.集成easyExcel
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version>
</dependency>
2.简单导出示例
实体与excel列的映射
创建实体类使用 @ExcelProperty、@ExcelIgnore 等注解标识导出列;
@ExcelIgnore 表示忽略此字段
@ExcelProperty 用于标识列 value属性设置列的名称,index属性设置设置列的序号 从 0 开始
更多注解说明在:前往
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GamesExcelVO {/*** @description: 使用@ExcelIgnore注解忽略此字段**/@ExcelIgnoreprivate 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;}
导出excel的代码
@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();}}
导出的文件:
3.Excel复杂表头导出
可将@ExcelProperty注解的value属性指定为一个数组来实现复杂表头的导出
与实体的映射
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ClassesExcelVO {/*** @description: 可将@ExcelProperty注解的value属性指定为一个数组来实现复杂表头的导出**/@ExcelProperty(value = {"1级表头","2级表头"},index = 0)private Integer title1;@ExcelProperty(value = {"1级表头","2级表头","3级表头"},index = 1)private Integer title2;@ExcelProperty(value = {"1级表头","2级表头","3级表头"},index = 2)private Integer title3;@ExcelProperty(value = {"1级表头","2级表头","3级表头","4级表头"},index = 3)private Integer title4;@ExcelProperty(value = {"1级表头","2级表头"},index = 4)private Integer title5;@ExcelProperty(value = {"1级表头","2级表头"},index = 5)private Integer title6;@ExcelProperty(value = {"1级表头","2级表头","3级表头"},index = 6)private Integer title7;@ExcelProperty(value = {"1级表头","2级表头","3级表头"},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();}}
导出的文件:
3.Excel导入
我们使用 标题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