前言
今天玩了一下springboot利用easypoi实现excel的导出,以前没玩过导入导出,只不过听说过看别人用过,怎么说呢,想玩就玩一下吧,毕竟结合自己业务场景需要才会考虑是否使用。先简单介绍一下easypoi。
一、easypoi是什么?
1.不太熟悉poi的
2.不想写太多重复太多的
3.只是简单的导入导出的
4.喜欢使用模板的
若poi都不知道的童鞋请自行百度。。。
easypoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成excel和word的各种操作,而不是看很多api才可以完成这样工作。
二、使用步骤
1.传送门
因为我也是第一次使用,这里还是先将easypoi的文档放这儿吧:
2.后端springboot
首先引入easypoi所需依赖:
<!--easypoi导入导出--> <dependency> <groupid>cn.afterturn</groupid> <artifactid>easypoi-base</artifactid> <version>4.1.3</version> </dependency> <dependency> <groupid>cn.afterturn</groupid> <artifactid>easypoi-web</artifactid> <version>4.1.3</version> </dependency> <dependency> <groupid>cn.afterturn</groupid> <artifactid>easypoi-annotation</artifactid> <version>4.1.3</version> </dependency>
或者使用这个:
<dependency> <groupid>cn.afterturn</groupid> <artifactid>easypoi-spring-boot-starter</artifactid> <version>4.0.0</version> </dependency>
2.1编写实体类(我这里是dto,也一样)
package top.wangxingjun.separate.dto; import cn.afterturn.easypoi.excel.annotation.excel; import top.wangxingjun.separate.dto.base.outputconverter; import top.wangxingjun.separate.entity.adminrole; import top.wangxingjun.separate.entity.user; import lombok.data; import lombok.tostring; import java.util.list; /** * @author wxj * @date 2020/8/10 */ @data @tostring public class userdto implements outputconverter<userdto, user> { @excel(name = "编号") private int id; @excel(name = "账号") private string username; @excel(name = "真实姓名") private string name; @excel(name = "手机号") private string phone; @excel(name = "邮箱") private string email; @excel(name = "状态",replace = {"启用_true","禁用_false"}) private boolean enabled; }
简单看一下这个 @excel 注解主要的值:
关于图片路径
着重说明一下这个图片路径,当 type 取值为 2 的时候表示导出为图片,同时配合使用的是 imagetype 参数,该参数决定是从 file 读取,还是去数据库读取,默认为从 file 中读取,记得很早之前,有小伙伴图片是直接 base64 存数据库的,不过现在是没有人干这种事了
2.2控制层
直接看代码:
/** * 用户信息导出 */ @getmapping("api/exportuser") public void exportuser(httpservletresponse response) throws exception { list<userdto> list = userservice.list(); excelutil.exportexcel(list, null, "sheet1", userdto.class, "用户信息", response); }
没错,就这么几行代码,当然了,还要有个工具类,是我封装好的,网上也有很多的咯。下面看工具类:
package top.wangxingjun.separate.util; import cn.afterturn.easypoi.excel.excelexportutil; import cn.afterturn.easypoi.excel.excelimportutil; import cn.afterturn.easypoi.excel.entity.exportparams; import cn.afterturn.easypoi.excel.entity.importparams; import cn.afterturn.easypoi.excel.entity.enmus.exceltype; import lombok.extern.log4j.log4j2; import lombok.extern.slf4j.slf4j; import org.apache.commons.collections4.collectionutils; import org.apache.commons.lang3.objectutils; import org.apache.commons.lang3.stringutils; import org.apache.poi.ss.usermodel.workbook; import org.springframework.web.multipart.multipartfile; import javax.servlet.http.httpservletresponse; import java.io.file; import java.net.urlencoder; import java.util.list; import java.util.map; import java.util.nosuchelementexception; /** * @projectname: separate * @package: top.wangxingjun.separate.util * @classname: excelutil * @author: wxj * @description: excel导入导出工具类 * @date: 2020/8/25 10:07 * @version: 1.0 */ @log4j2 public class excelutil { /** * map集合导出 * * @param list 需要导出的数据 * @param filename 导出的文件名 * @param response httpservletresponse对象 */ public static void exportexcel(list<map<string, object>> list, string filename, httpservletresponse response) throws exception{ defaultexport(list, filename, response); } /** * 复杂导出excel,包括文件名以及表名(不创建表头) * * @param list 需要导出的数据 * @param title 表格首行标题(不需要就传null) * @param sheetname 工作表名称 * @param pojoclass 映射的实体类 * @param filename 导出的文件名(如果为null,则默认文件名为当前时间戳) * @param response httpservletresponse对象 */ public static void exportexcel(list<?> list, string title, string sheetname, class<?> pojoclass, string filename, httpservletresponse response) throws exception{ defaultexport(list, pojoclass, filename, response, new exportparams(title, sheetname)); } /** * 复杂导出excel,包括文件名以及表名(创建表头) * * @param list 需要导出的数据 * @param title 表格首行标题(不需要就传null) * @param sheetname 工作表名称 * @param pojoclass 映射的实体类 * @param filename 导出的文件名 * @param iscreateheader 是否创建表头 * @param response httpservletresponse对象 */ public static void exportexcel(list<?> list, string title, string sheetname, class<?> pojoclass, string filename, boolean iscreateheader, httpservletresponse response) throws exception{ exportparams exportparams = new exportparams(title, sheetname); exportparams.setcreateheadrows(iscreateheader); defaultexport(list, pojoclass, filename, response, exportparams); } /** * 默认导出方法 * * @param list 需要导出的数据 * @param pojoclass 对应的实体类 * @param filename 导出的文件名 * @param response httpservletresponse对象 * @param exportparams 导出参数实体 */ private static void defaultexport(list<?> list, class<?> pojoclass, string filename, httpservletresponse response, exportparams exportparams) throws exception{ workbook workbook = excelexportutil.exportexcel(exportparams, pojoclass, list); downloadexcel(filename, workbook, response); } /** * 默认导出方法 * * @param list map集合 * @param filename 导出的文件名 * @param response httpservletresponse对象 */ private static void defaultexport(list<map<string, object>> list, string filename, httpservletresponse response)throws exception { workbook workbook = excelexportutil.exportexcel(list, exceltype.hssf); if (null != workbook) { downloadexcel(filename, workbook, response); } } /** * excel导出 * * @param filename excel导出 * @param workbook excel对象 * @param response httpservletresponse对象 */ public static void downloadexcel(string filename, workbook workbook, httpservletresponse response) throws exception{ try { if (stringutils.isempty(filename)) { throw new runtimeexception("导出文件名不能为空"); } string encodefilename = urlencoder.encode(filename, "utf-8"); response.setheader("content-type", "application/vnd.ms-excel; charset=utf-8"); response.setheader("content-disposition", "attachment;filename=" + encodefilename); response.setheader("filename", encodefilename); response.setheader("access-control-expose-headers", "filename"); workbook.write(response.getoutputstream()); } catch (exception e) { log.error(e.getmessage(), e); } } /** * 根据文件路径来导入excel * * @param filepath 文件路径 * @param titlerows 表标题的行数 * @param headerrows 表头行数 * @param pojoclass 映射的实体类 * @return */ public static <t> list<t> importexcel(string filepath, integer titlerows, integer headerrows, class<t> pojoclass) throws exception{ //判断文件是否存在 if (stringutils.isblank(filepath)) { return null; } importparams params = new importparams(); params.settitlerows(titlerows); params.setheadrows(headerrows); list<t> list = null; try { list = excelimportutil.importexcel(new file(filepath), pojoclass, params); } catch (nosuchelementexception e) { log.error("模板不能为空", e); } catch (exception e) { log.error(e.getmessage(), e); } return list; } /** * 根据接收的excel文件来导入excel,并封装成实体类 * * @param file 上传的文件 * @param titlerows 表标题的行数 * @param headerrows 表头行数 * @param pojoclass 映射的实体类 * @return */ public static <t> list<t> importexcel(multipartfile file, integer titlerows, integer headerrows, class<t> pojoclass) throws exception{ if (file == null) { return null; } importparams params = new importparams(); params.settitlerows(titlerows); params.setheadrows(headerrows); list<t> list = null; try { list = excelimportutil.importexcel(file.getinputstream(), pojoclass, params); } catch (nosuchelementexception e) { log.error("excel文件不能为空", e); } catch (exception e) { log.error(e.getmessage(), e); } return list; } /** * 文件转list * * @param file * @param pojoclass * @param <t> * @return */ public static <t> list<t> filetolist(multipartfile file, class<t> pojoclass) throws exception{ if (file.isempty()) { throw new runtimeexception("文件为空"); } list<t> list = excelutil.importexcel(file, 1, 1, pojoclass); if (collectionutils.isempty(list)) { throw new runtimeexception("未解析到表格数据"); } return list; } }
excel导出所需要的都准备好了,下面来看一下我的效果:
到此这篇关于springboot利用easypoi实现简单导出的文章就介绍到这了,更多相关springboot easypoi导出内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论