我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧!
前言
一直都想用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试试吧。