前言
一直都想用Easypoi实现导出/导入Excel和Word文件,可是项目里一直没有用上,很多时候都是自己写方法去实现,所以今天跟大家一起来看看这个号称很Easy又好用的开源框架EasyPoi到底是不是真的很easy上手。
首先,思考一个问题,在没有开源框架的辅助下我们是如何完成Excel表格数据的生成以及导出的?
我们得绘制表格,然后依次创建sheet、row、cell,然后通过与数据库的字段映射,填充数据,最后将生成的Excel文件以流或者文件的方式提供出去,这种方法的缺点显而易见,每增加或者减少字段我们都得从service层改到mapper层,下图是生成手动自定义生成Excel文件的部分代码。
上面的代码杂又乱,虽然说可以很灵活的使用,但是还是有一定的局限性,那有没有更加简单实现方案呢?当然有,EasyPoi就能,那接下来我们看看Easypoi是如何实现Excel数据的导出的。
我们先来认识一下关于 @Excel 里的一些注解,我们可以看到,注解里有针对数字,时间以及列或行合并的,使用起来很方便
EasyPoi具体实现:
一.引用easypoi的依赖,现在的easypoi已经有支持spring boot的starter了
<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.1.2</version> </dependency> 复制代码
二.注解及映射实体
/** * @ExcelTarget即数据对应的表 */ @Data @ExcelTarget("user") public class User { @Excel(name="编号") private String id; @Excel(name="姓名") private String user_name; //可以直接对数据库的字段进行时间格式化 @Excel(name="生日",format = "yyyy-MM-dd",width = 15.0) private Date birthday; @Excel(name="联系地址",width=20.0) private String address; } 复制代码
三.调用其封装的方法,进行Excel生成,包括标题,sheet以及数据填充导出
@RequestMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { List<User> userList = userService.findAll(); Workbook workbook = null; ServletOutputStream outputStream = null; //生成excel //对应三 执行结果里的标题,sheet名称 try { workbook = ExcelExportUtil.exportExcel(new ExportParams("测试标题", "测试用户信息"), User.class, userList); //浏览器下载及乱码处理 response.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode("用户信息列表.xls", "UTF-8")); outputStream = response.getOutputStream(); workbook.write(outputStream); } catch (Exception e) { throw new IOException(e); } finally { outputStream.close(); workbook.close(); } } } 复制代码
四.执行结果
五.注意事项
目前Easypoi在大数据导入导出方面有点缺陷,数据量过多,容易OOM,问题出在文件流部分,如果数据量过大的话可以将这部分改为多线程或异步执行。
小结
从上面可以看到,想要导出一个Excel使用Easypoi只需要两步,而且EasyPoi里还提供了很多对数据处理的注解,真的是处理起来方便又简洁,Easypoi是真的easy,项目里有导入导出功能的话就用Easypoi试试吧。