EasyExcel处理多工作簿,以及POI冲突问题

前言引入

最近我在后端实习期间碰到了一个需求,让我解决一个报表的导出。
页面数据分为两个部分:上半部分是父表数据要在批量勾选点击导出的时候,生成的EasyExcel可以按照数据名称生成对应的工作簿,工作簿填充的数据内容为下半部分,最后生成一个Excel文件
微信截图_20230714085423.png
下面是我在开发中碰到的一些问题

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();  
}
    

如果有需要的话可以根据自己的需求,更改数据返回的数据即可,而且要注意千万不要忘记加工返回类型和模型类的数据,不适用模型类的数据会导出失败!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值