文章目录

  • 一、EasyExcel简介
  • 二、EasyExcel使用介绍
  • 三、EasyExcel常用注解介绍
  • 四、EasyExcel常见报错解决

一、EasyExcel简介

1.EasyExcel介绍:EasyExcel是阿里巴巴开源的一个excel处理框架。
2.特性:使用简单、节省内存、适合处理大数据量的Excel。
数据解析时,不像之前的Apache poi、jxl等Excel解析框架将数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。EasyExcel重写了poi对07版本Excel的解析,在数据量大时不容易内存溢出。
3.使用场景
(1)数据导入:减轻录入工作量
(2)数据导出:统计信息归档
(3)数据传输:异构系统之间数据传输
4.官方文档:https://alibaba-easyexcel.github.io/index.html

二、EasyExcel使用介绍

这里我也是参照官方文档做的,但也踩过坑,我这里介绍的会比官方文档更细致一些。我这里重点关注写的使用。
1.首先就是需要一个SpringBoot的项目,引入依赖,我这里用的最新的版本,注意如果有poi的依赖,会有冲突,需要移除掉。

 <!-- easyexcel依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency>

2.实现多sheet的写功能
注意这里不要和web的写弄混淆了。这里的往指定文件写入数据。
(1)创建一个Controller,这里需要一个实体类,一个程序入口,为了方便我就写在一起了。数据方面使用官网给的默认数据。有区别的是,我没使用lombok的@Data注释。新增的sheetName字段,不然按官方的例子全写到一个sheet页了。
(2)创建文件demoData.xlsx,并放入指定目录里面。

package com.example.springb_web.easyexcel;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.metadata.WriteSheet;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;@RestController
public class EasyExcelController {private String templatePath = "D:/Tools/easyExcelTemplate/";@RequestMapping(value="/exportTest")public void export_multi_sheet(HttpServletResponse response){String template = templatePath+"demoData.xlsx";// 指定模板文件ExcelWriter excelWriter = EasyExcel.write(template, DemoData.class).build();for (int i = 0; i < 5; i++) {// 每次都要创建writeSheet 这里注意必须指定sheetNo和sheetNameString sheetName = "模板"+(i+1);WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName).build();// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);}// 千万别忘记finish 会帮忙关闭流excelWriter.finish();}private List<DemoData> data() {List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}
}class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;public String getString() {return string;}public void setString(String string) {this.string = string;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public Double getDoubleData() {return doubleData;}public void setDoubleData(Double doubleData) {this.doubleData = doubleData;}public String getIgnore() {return ignore;}public void setIgnore(String ignore) {this.ignore = ignore;}
}

(3)验证,进入http://localhost:8080/exportTest,在查看demoData.xlsx,结果如下。

3.实现web的写功能
直接使用官方的方法,我测试过没有问题,需要引入fastJson的依赖

 <!--fastJson-->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.28</version>
</dependency>
@GetMapping("downloadFailedUsingJson")public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmantry {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), DemoData.class).autoCloseStream(Boolean.FALSE).sheet("模板").doWrite(data());} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<String, String>();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}

4.实现web的多sheet写功能
(1)完整代码如下,新增实现方法webMultiSheetWrite、增加标题的getHead和切割list的方法subListUtil。

package com.example.springb_web.easyexcel;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.*;@RestController
public class EasyExcelController {private String templatePath = "D:/Tools/easyExcelTemplate/";@RequestMapping(value="/exportTest")public void export_multi_sheet(HttpServletResponse response){String template = templatePath+"demoData.xlsx";// 指定模板文件ExcelWriter excelWriter = EasyExcel.write(template, DemoData.class).build();for (int i = 0; i < 5; i++) {// 每次都要创建writeSheet 这里注意必须指定sheetNo和sheetNameString sheetName = "模板"+(i+1);WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName).build();// 分页去数据库查询数据 这里可以去数据库查询每一页的数据List<DemoData> data = data();excelWriter.write(data, writeSheet);}// 千万别忘记finish 会帮忙关闭流excelWriter.finish();}@GetMapping("downloadFailedUsingJson")public void downloadFailedUsingJson(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmantry {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");// 这里需要设置不关闭流EasyExcel.write(response.getOutputStream(), DemoData.class).autoCloseStream(Boolean.FALSE).sheet("模板").doWrite(data());} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<String, String>();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}@GetMapping("webMultiSheetWrite")public void webMultiSheetWrite(HttpServletResponse response) throws IOException {// 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postmantry {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("多sheet写测试", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");//设置每个sheet存3条数据int n = 3;//将数据拆分成多个sheet页List<List<DemoData>> userlistBysheet = subListUtil(data(),n);ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(getHead("大标题")).build();for (int i = 0; i < userlistBysheet.size(); i++) {// 每次都要创建writeSheet 这里注意必须指定sheetNoString sheetName = "模板"+(i+1);WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName).build();List<DemoData> data = userlistBysheet.get(i);excelWriter.write(data, writeSheet);}excelWriter.finish();} catch (Exception e) {// 重置responseresponse.reset();response.setContentType("application/json");response.setCharacterEncoding("utf-8");Map<String, String> map = new HashMap<String, String>();map.put("status", "failure");map.put("message", "下载文件失败" + e.getMessage());response.getWriter().println(JSON.toJSONString(map));}}private  List<List<String>> getHead(String bigTitle){List<List<String>> head = new ArrayList<List<String>>();List<String> head0 = new ArrayList<>();head0.add(bigTitle);head0.add("字符串标题");List<String> head1 = new ArrayList<>();head1.add(bigTitle);head1.add("日期标题");List<String> head2 = new ArrayList<>();head2.add(bigTitle);head2.add("数字标题");head.add(head0);head.add(head1);head.add(head2);return head;}//切割list方法public  <T> List<List<T>> subListUtil(List<T> source, int n) {List<List<T>> result = new ArrayList<>();//(先计算出余数)int remainder = source.size() % n;//然后是商int number = source.size() / n;//偏移量int offset = 0;List<T> value;for (int i = 0; i < number; i++) {value = source.subList(offset, offset + n);offset += n ;result.add(value);}value = source.subList(offset, offset + remainder);result.add(value);return result;}private List<DemoData> data() {List<DemoData> list = new ArrayList<DemoData>();for (int i = 0; i < 10; i++) {DemoData data = new DemoData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}
}class DemoData {@ExcelProperty("字符串标题")private String string;@ExcelProperty("日期标题")private Date date;@ExcelProperty("数字标题")private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;public String getString() {return string;}public void setString(String string) {this.string = string;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public Double getDoubleData() {return doubleData;}public void setDoubleData(Double doubleData) {this.doubleData = doubleData;}public String getIgnore() {return ignore;}public void setIgnore(String ignore) {this.ignore = ignore;}
}

(2)测试
进入http://localhost:8080/webMultiSheetWrite,可以看到十条数据,每三条一个sheet页,被正确拆分了。

三、EasyExcel常用注解介绍

1.@ExcelProperty

@ExcelProperty("标题")
@ExcelProperty(value="标题",index=0)

value用来自定义表头(二级表头只需要使用 {一级表头,二级表头} 来实现),index用来选择excel中的顺序(第一排为0)
2.@ExcelIgnore
在实际应用中,修改存量的程序,对象中不需要导出的多余的属性,需要使用@ExcelIgnore注解,否则会导出很多你不需要的字段。
4.@DateTimeFormat
日期格式转换
4.@ColumnWidth
设置此属性的行宽

四、EasyExcel常见报错解决

1.ExcelDataConverException:Cannot find ‘Converter’ support class
比如提示你日期格式无法导出
解决方案:
在需要转换字段较少的情况下使用方案1较为简便,长久考虑还是方案2比较好。
(1)在对象中新增一个字段,以字符串存储,修改如下:

@ExcelProperty
private Date date;

改成这个,然后在list中转行给date_str赋值

@ExcelIgnore
private Date date;
@ExcelProperty
private String date_str;

(2)创建一个类,实现 Converter<> 接口,泛型为需要转换的类型 ,并重写其中的方法。

public class LocalDateTimeConverter implements Converter<LocalDateTime> {@Overridepublic Class<LocalDateTime> supportJavaTypeKey() {return LocalDateTime.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}//将格式化后的日期转换为字符串@Overridepublic LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}//将LocalDateTime类型格式化@Overridepublic CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,GlobalConfiguration globalConfiguration) {return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));}
}

然后在@ExcelProperty标签下增加该Converter类

 @ExcelProperty(converter = LocalDateTimeConverter.class)

EasyExcel使用教程相关推荐

  1. easyexcel使用教程-导出篇

    easyExcel使用教程–导出篇 开始准备工作 1.导入Maven依赖 <dependency><groupId>com.alibaba</groupId>< ...

  2. EasyExcel全面教程快速上手

    EasyExcel教程 本文使用的技术是Alibaba集团开源的EasyExcel技术,该技术是针对Apache POI技术的封装和优化,主要解决了POI技术的耗内存问题,并且提供了较好的API使用. ...

  3. EasyExcel基本教程

    前言 easyexcel的github地址为:https://github.com/alibaba/easyexcel,目前的最新版本是v2.2.10.Java解析.生成Excel比较有名的框架有Ap ...

  4. EasyExcel详细教程

    目录 1.Excel导入导出的应用场景 2.EasyExcel特点 3.Excel进行写操作 4.Excel进行读操作 本篇文章为你详细介绍EasyExcel如何进行读取操作 1.Excel导入导出的 ...

  5. Springboot 下 EasyExcel 的数据导入导出

    文章目录 1.环境准备 1.0. excel数据 1.1. pom 1.2. excle映射实体 1.3. 自定义日期转换器 1.4.自定义异常 2. 数据导出 3. 数据导入 3.1. excel解 ...

  6. SpringBoot集成阿里EasyExcel导出excel高级实战

    目录 参考 一.引入包 二.导出到文件并输出到后台 三.过滤字段 方式1:类上加注解 @ExcelIgnoreUnannotated,过滤属性没有@ExcelProperty注解的字段 方式2:指定字 ...

  7. Jsoup:使用Java将爬虫得到的数据写入Excel,Jsoup得到的数据进行持久化,爬虫数据保存到本地Excel中

    Jsoup:使用Java将爬虫得到的数据写入Excel,Jsoup得到的数据进行持久化,爬虫数据保存到本地Excel中 一.资源 EasyExcel使用教程 Jsoup爬虫教程 二.代码 xml依赖 ...

  8. BAT 开发工具汇总

    BAT 程序员们常用的开发工具汇总 阿里篇 一.Java 线上诊断工具 Arthas 使用场景: 使用教程: 基础教程: 进阶教程: 开源地址: 二.IDE 插件 Cloud Toolkit 使用场景 ...

  9. Excel导入导出详细教程------EasyExcel功能整合

    最详细的教程------EasyExcel导入与导出功能整合 1.开发环境参数 name Value 开发工具 Intellij IDEA 2018 框架 SpringBoot(maven项目也可以) ...

最新文章

  1. TensorFlow Lite:TensorFlow在移动设备与嵌入式设备上的轻量级跨平台解决方案 | Google 开发者大会 2018...
  2. sign函数的功能 oracle,Oracle中sign函数和decode函数的使用
  3. 创意总监分享:我是如何做一款手游地图的
  4. Jenkins发布spring boot到hub.Docker 方法
  5. LeetCode 1899. 合并若干三元组以形成目标三元组
  6. 新服务器打包运营级价值几千的H5商城源码
  7. 移动端实现蓝牙打印机打印_MBrush世界上最小的移动彩色打印机
  8. FZU2105 Digits Count(按位建线段树)题解
  9. 对JS中变量的浅微认识
  10. Vijos——T 1092 全排列
  11. svn将本地项目传到svn
  12. ArcGIS拓扑功能的应用:将点的数据落入面内
  13. Duilib之挑战2048
  14. AuthorizingRealm中的两大方法
  15. 大图书馆 #5 纳瓦尔宝典
  16. vSphere虚拟网络02 - 虚拟交换机
  17. 计算机保持在线的几种方法,获取网络电影实际地址的几种方法.doc
  18. 免费空间去广告(统计代码)方法:
  19. ps界面为啥突然变大了_PS教程丨皮肤美白修饰
  20. 分享抖音账号初期运营技巧,直接可复制的运营流程

热门文章

  1. Linux3:基本语法
  2. LeetCode每日一题——904. 水果成篮
  3. ESP32学习笔记(45)——DAC接口使用
  4. centos安装shutter
  5. Linux——服务器文件备份(一)
  6. 数据库系统-存储过程
  7. mysql commit阶段,MySQL 基本架构与日志两阶段提交
  8. Linux服务器通过X11实现图像化界面显示
  9. C# 设计原则 之 迪米特 原则
  10. ui培训学校哪个比较好?