# springBoot-ExcelImplement **Repository Path**: juniorshy/springBootExcelImplement ## Basic Information - **Project Name**: springBoot-ExcelImplement - **Description**: 基于EasyExce,poi实现Excel批量文件打包成压缩成zip下载,附layui伪下载进度效果. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2019-08-05 - **Last Updated**: 2021-08-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springBootExcelImplement easyexcel 项目地址 :https://github.com/alibaba/easyexcel # easyexcel 分支已去除.切换为poi4的版本 #### 对 easyexcel 进行了方法的封装,可以做到一个函数完成简单的读取和导出 目前 easyexcel 版本已经更新至 1.1.2-beta4 poi4超过指定行数自动压缩下载 # 五.压缩下载 ### 1. 导出的 Excel 只拥有一个 sheet,xlsx单个sheet行数在1000000左右,需要下载的行数超过这个数目后添加Excel并打包压缩下载 ### 工具类FileDownloadUtils ### 删除temp文件夹和其中的excel和zip文件 ``` /** * 导出 ExcelZip(一个 sheet) */ @RequestMapping(value = "writeExcelZip", method = RequestMethod.GET) public void writeExcelZip(HttpServletResponse response,HttpServletRequest request,@RequestParam(value = "num")Integer num) { // String realPath = request.getSession().getServletContext().getRealPath("/"+RandomUtil.generateMixString(5)+"-"); String realPath ="D:/Temp/"+RandomUtil.generateMixString(5)+"-"; // String realPathZip = request.getSession().getServletContext().getRealPath("/"); String realPathZip ="D:/Temp"; int n=num/1000000; int u=num%1000000; try { FileDownloadUtils.createFile(realPathZip); if(n == 0){ writeExcel(response,request,num); }else{ String fileName = "批量" + num + ".zip"; List list = getList(u); ExcelUtil.writeExcelByPath(realPath+"0.xlsx",list,new ExportInfo()); for(int i=1;i<=n;i++){ ExcelUtil.writeExcelByPath(realPath+i+".xlsx",getList(1000000),new ExportInfo()); } List files = new ArrayList(); for(int i=0;i<=n;i++){ files.add(new File(realPath+i+".xlsx")); } request.getSession().setAttribute("percent", "100"); //下载zip FileDownloadUtils.downloadZip(request,response,fileName,files,realPathZip); //删除tempDir文件夹和其中的excel和zip文件 boolean b = FileDownloadUtils.deleteDir(new File(realPathZip)); if (!b) { throw new RuntimeException("Temp文件夹及其中的临时Excel和zip文件删除失败"); } } }catch (Exception e) { try { if (!response.isCommitted()) { response.setContentType("text/html;charset=utf-8"); response.setHeader("Content-Disposition", ""); String html = FileDownloadUtils.getErrorHtml("下载失败"); response.getOutputStream().write(html.getBytes("UTF-8")); } } catch (IOException e1) { e1.printStackTrace(); } } } ``` 添加 扩展 layui 的导出插件 layui.excel ------------------------------------------------------------------------------------------------------------------------------ 已废弃 #原 ### 该项目转自 https://github.com/HowieYuan/easyexcel-encapsulation ### 在原项目基础上扩展了压缩下载 --- --- # 一. 依赖 首先是添加该项目的依赖,目前的版本是 1.1.2-beta4 ``` com.alibaba easyexcel 1.1.2-beta4 ``` # 二. 需要的类 ## 1. ExcelUtil 工具类,可以直接调用该工具类的方法完成 Excel 的读或者写 ## 2. ExcelListener 监听类,可以根据需要,自定义处理获取到的数据 ``` public class ExcelListener extends AnalysisEventListener { //自定义用于暂时存储data。 //可以通过实例获取该值 private List datas = new ArrayList<>(); /** * 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据 */ @Override public void invoke(Object object, AnalysisContext context) { //数据存储到list,供批量处理,或后续自己业务逻辑处理。 datas.add(object); //根据自己业务做处理 doSomething(object); } private void doSomething(Object object) { } @Override public void doAfterAllAnalysed(AnalysisContext context) { /* datas.clear(); 解析结束销毁不用的资源 */ } public List getDatas() { return datas; } public void setDatas(List datas) { this.datas = datas; } } ``` ## 3. ExcelWriterFactroy 用于导出多个 sheet 的 Excel,通过多次调用 write 方法写入多个 sheet ## 4. ExcelException 捕获相关 Exception # 三. 读取 Excel 读取 Excel 时只需要调用 ```ExcelUtil.readExcel()``` 方法 ``` @RequestMapping(value = "readExcel", method = RequestMethod.POST) public Object readExcel(MultipartFile excel) { return ExcelUtil.readExcel(excel, new ImportInfo()); } ``` 其中 excel 是 MultipartFile 类型的文件对象,而 new ImportInfo() 是该 Excel 所映射的实体对象,需要继承 **BaseRowModel** 类,如: ``` public class ImportInfo extends BaseRowModel { @ExcelProperty(index = 0) private String name; @ExcelProperty(index = 1) private String age; @ExcelProperty(index = 2) private String email; /* 作为 excel 的模型映射,需要 setter 方法 */ public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } ``` 作为映射实体类,通过 @ExcelProperty 注解与 index 变量可以标注成员变量所映射的列,同时不可缺少 setter 方法 # 四. 导出 Excel ### 1. 导出的 Excel 只拥有一个 sheet 只需要调用 ```ExcelUtil.writeExcelWithSheets()``` 方法: ``` @RequestMapping(value = "writeExcel", method = RequestMethod.GET) public void writeExcel(HttpServletResponse response) throws IOException { List list = getList(); String fileName = "一个 Excel 文件"; String sheetName = "第一个 sheet"; ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName, new ExportInfo()); } ``` fileName,sheetName 分别是导出文件的文件名和 sheet 名,new ExportInfo() 为导出数据的映射实体对象,list 为导出数据。 对于映射实体类,可以根据需要通过 @ExcelProperty 注解自定义表头,当然同样需要继承 BaseRowModel 类,如: ``` public class ExportInfo extends BaseRowModel { @ExcelProperty(value = "姓名" ,index = 0) private String name; @ExcelProperty(value = "年龄",index = 1) private String age; @ExcelProperty(value = "邮箱",index = 2) private String email; @ExcelProperty(value = "地址",index = 3) private String address; } ``` value 为列名,index 为列的序号 如果需要复杂一点, 对应的实体类写法如下: ``` public class MultiLineHeadExcelModel extends BaseRowModel { @ExcelProperty(value = {"表头1","表头1","表头31"},index = 0) private String p1; @ExcelProperty(value = {"表头1","表头1","表头32"},index = 1) private String p2; @ExcelProperty(value = {"表头3","表头3","表头3"},index = 2) private int p3; @ExcelProperty(value = {"表头4","表头4","表头4"},index = 3) private long p4; @ExcelProperty(value = {"表头5","表头51","表头52"},index = 4) private String p5; @ExcelProperty(value = {"表头6","表头61","表头611"},index = 5) private String p6; @ExcelProperty(value = {"表头6","表头61","表头612"},index = 6) private String p7; @ExcelProperty(value = {"表头6","表头62","表头621"},index = 7) private String p8; @ExcelProperty(value = {"表头6","表头62","表头622"},index = 8) private String p9; } ``` ### 2. 导出的 Excel 拥有多个 sheet 调用 ```ExcelUtil.writeExcelWithSheets()``` 处理第一个 sheet,之后调用 ```write()``` 方法依次处理之后的 sheet,最后使用 ```finish()``` 方法结束 ``` public void writeExcelWithSheets(HttpServletResponse response) throws IOException { List list = getList(); String fileName = "一个 Excel 文件"; String sheetName1 = "第一个 sheet"; String sheetName2 = "第二个 sheet"; String sheetName3 = "第三个 sheet"; ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName1, new ExportInfo()) .write(list, sheetName2, new ExportInfo()) .write(list, sheetName3, new ExportInfo()) .finish(); } ``` write 方法的参数为当前 sheet 的 list 数据,当前 sheet 名以及对应的映射类