项目中有个需求,需要将四层数据封装成树形结构,然后导出EXCEL,我这里的每层数据结构都是不同类型的实体类。比如A类父类包含B类,也就是A类中会有一个B类的List集合,B类中有C类的集合,以此类推。导出时,需要将当前类的父级进行单元格合并,因为父类可能有多个子类对象。比如像下面这种导出结构:
表头1 | 表头2 | 表头3 | 表头4 |
---|---|---|---|
A类 | B类1 | C类1 | |
C类2 | |||
B类2 | |||
类型于这种导出的样式,但是每一列都是同一种类型的实体类。
实现方式:
一:导入依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
二:使用easy-poi提供的工具类直接调用对应方法即可
工具类名称:
ExcelExportUtil
其里面都是静态方法,可以直接类名调用。我实现的方法是:
public static void excelExport(List<SecurityRiskObjectDto> securityRiskObjectDtoList, HttpServletResponse response, String fileName) throws IOException {
HttpServletResponseUtils.settingResponse(response, fileName);
OutputStream outputStream = response.getOutputStream();
//title:表格名称 sheetName
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(fileName, fileName), SecurityRiskObjectDto.class, securityRiskObjectDtoList);
workbook.write(outputStream);
response.getOutputStream().flush();
response.getOutputStream().close();
}
静态导出方法
public static Workbook exportExcel(ExportParams entity, Class<?> pojoClass,
Collection<?> dataSet) {
Workbook workbook = getWorkbook(entity.getType(), dataSet.size());
(new ExcelExportService()).createSheet(workbook, entity, pojoClass, dataSet);
return workbook;
}
使用这个工具类调用其 excelExport方法,这个方法有很多重载方法,可以根据自己的需求调用其他方法。我调用的这个方法只需要传入三个参数。
第一个参数就固定传入new ExportParams,里面的参数是文件名。
第二个参数是我最外层实体类的类型,也就是上面举例的A的类型。
第三个参数只需要将封装好的实体对象传进去既可,因为人家这个excelExport方法中需要传入对象集合,所以我把封装好的对象又搞了一个voList实体类封装了一次,根据举例,也就是把A类在多封装一次,使用A类的集合形式传入。
三:给对应的实体类加上对应的注解
easy-poi实际上就是基于注解进行导出的,我们这里只需要用到两个注解
@Excel(name = "", needMerge = true),name表示表头名称,needMerge表示是否需要合并,父类的数据需要合并的话就置为true,比如向上面的格式一样
@ExcelCollection(name = "", orderNum = "4")给子类集合上标注,就是在A类中给B类的List上加上这个注解,里面的参数可以不用管,orderNum其实表示的就是当前数据输出在第几行,比如上面的例子表格,B类在第二列,如果B类有其他字段的话,这个orderNum的值就依次往上加,当然也可以不用设置
导出结束后关闭资源即可,这样就可以完成树形结构的数据导出。子类的上一级也会相应的合并空白单元格