使用easypoi导出excel简单使用、合并单元格(groupName)
原文参考:https://blog.csdn.net/H900302/article/details/109726240
今天尝试使用easypoi做Excel导出,首先如它的名字一样,导出相比之前使用的poi确实简单了不少,但是它的官方文档是真的不详细,有待完善,拿我导出的文件来说吧(图如下),这个标题合并单元格的效果是@Excel注解的groupName属性实现的,但是在官方文档中说明@Excel注解的时候并没有对groupName属性做说明,而且源码中虽然有这个属性,但是没有对这些属性做一点注释说明,直到我看到文档的这一节2.12 groupname和ExcelEntity的name属性才对groupname属性进行说明,还有错别字真是太多了。
虽然感觉什么都有,但是就是源码的注释太少了,根本不知道这些方法是干啥的,虽然抱怨不是个好现象,但是没忍住。。。吐槽到此结束,说归说,入门还是离不开它的官方文档,计划接下来几篇记录一下使用easypoi完成常用的表格操作。
首先,准备下测试表和数据:
实体类、Mapper接口啥的就不贴了,xml中也只有一个简单的查询:
<select id="selectUsers" resultType="com.example.springbootmp.dto.user.UserMobileDto"> select * from t_user_excel </select>
先看下导出的文件样子和生成导出文件的实体类:
对比上面两张图说明一下使用easypoi导出的实体UserExcelDto,按照官方的使用说明,简单的使用@Excel注解标记一下字段就好,name属性为导出表格的列明,数据库中性别存的字符串类型的man/woman,如果我们导出的时候想显示为男/女,@Excel注解有一个replace属性可以替换值,当然也可以使用枚举,easypoi也有对枚举处理的说明,这个以后再测试,暂且使用replace属性,replace值的写法形如:replace = {"A_a","B_b"},它的意思就是假如实体字段的值为a,那么导出的时候列值替换为A,其它参数同理;@Excel注解还有一个参数groupName可以很容易的实现双行表头的样子,如图中的时间一列,使用groupName可以将多个字段归并到一列。
贴一下controller导出方法代码:
@GetMapping public void export(HttpServletResponse response) throws IOException { List<UserExcelDto> userExcelDtos = userExcelService.selectUsers(); String fileName = "下载的文件名"; String sheetName = "sheet名字"; String title = "sheet页的title"; ExportParams exportParams = new ExportParams(title,sheetName); ExcelUtil.exportExcel(userExcelDtos,UserExcelDto.class,fileName,exportParams,response); }
虽然easypoi提供了导出方法ExcelExportUtil.exportExcel(),不过我这里自定义了一个导出工具类,便于设置参数,从上面的截图可以知道,title、sheetName的作用不啰嗦了,看下导出工具类代码:
/** * excel 导出 * * @param list 要导出的数据 * @param pojoClass pojo类型 * @param fileName 文件名称 * @param exportParams 导出表格参数 * @param response */ public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException { Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list); downLoadExcel(fileName, response, workbook); } /** * 下载文件 * * @param fileName 文件名称 * @param response * @param workbook excel数据 */ private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException { try { response.setCharacterEncoding("UTF-8"); response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xls", "UTF-8")); workbook.write(response.getOutputStream()); } catch (Exception e) { throw new IOException(e.getMessage()); } }
easypoi的体验到此结束,很明显有很多待优化完善的地方,就像是时间显示、枚举类使用、可能一个用户有多笔订单这种需要合并展示的,接下来几天慢慢补充。
补充一下:
ExportParams exportParams = new ExportParams(title,sheetName);
通常我们并不需要导出的表格中带这个这个标题(sheet页的title),那么可以将title设置为null即可,都不传使用空构造器也可以,但是sheetName也会变为默认的sheet0、sheet1这种
还可以用设置二级标题。如:new ExportParams("sheet也title", "日期:2020-11-18","sheet名字");
看下title为null的效果(new ExportParams(null,sheetName)):
看下二级标题的效果:
总结:经测试,groupName是好用的