前言引入
最近我在后端实习期间碰到了一个需求,让我解决一个报表的导出。
页面数据分为两个部分:上半部分是父表数据要在批量勾选点击导出的时候,生成的EasyExcel可以按照数据名称生成对应的工作簿,工作簿填充的数据内容为下半部分,最后生成一个Excel文件
下面是我在开发中碰到的一些问题
POI和EasyExcel冲突问题
<!-- csv导出 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
<scope>compile</scope>
</dependency>
<!-- easyExcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.10</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
</exclusion>
</exclusions>
</dependency>
这个问题是在我们导入EasyExcel携带的POI版本和我们本地引入的POI版本不同,一般是由于我们引入的POI比EasyExcel携带的POI版本要低,所以产生了一个No Such Method Error的报错,这个问题需要我们在POM文件中排除EasyExcel的POI即可
多工作簿导出
@PostMapping("/Export")
public void warrantyExport(@RequestBody EquipmentFaultPageRequest request, HttpServletResponse response) throws Exception {
// 设置返回格式为Excel
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 设置名称格式为:质保不合格报表+当前日期
String fileName="质保不合格报表" + DateUtils.format(new Date(), "yyyyMMdd");
// 这里URLEncoder.encode可以防止中文乱码
fileName = URLEncoder.encode(fileName, "UTF-8");
// 设置返回头信息以及文件名
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
// 通过equipmentIds批量查询出设备信息
for (int j = 0; j < request.getEquipmentIds().size(); j++) {
// 这一步是查询每个表格需要的数据
request.setEquipmentId(request.getEquipmentIds().get(j));
// 查询当前id获取的信息集合
List<EquipmentFaultResponse> list = iTEquipmentFaultService.faultPage(request).getList();
// 将返回类型通过Stream流加工成easyExcel对应的model类
List<EquipmentFaultExcelDto> collect = list.stream().map(a -> {
EquipmentFaultExcelDto equipmentFaultExcelDto = new EquipmentFaultExcelDto();
BeanUtils.copyProperties(a, equipmentFaultExcelDto);
return equipmentFaultExcelDto;
}).collect(Collectors.toList());
// 封装工作簿信息,j是我当前id集合对应循环的次数也是工作簿的排序从0开始,后面跟工作簿的名字
WriteSheet sheet = EasyExcel.writerSheet(j, list.get(j).getEquipmentName() + "不合格质保记录").head(EquipmentFaultExcelDto.class).build();
// 写入数据到工作簿中
excelWriter.write(collect, sheet);
}
// 关闭流数据
excelWriter.finish();
}
如果有需要的话可以根据自己的需求,更改数据返回的数据即可,而且要注意千万不要忘记加工返回类型和模型类的数据,不适用模型类的数据会导出失败!!