使用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是好用的

 

posted @ 2021-09-02 16:57  super超人  阅读(4997)  评论(0编辑  收藏  举报