多sheet导出并批量下载附件
前言
最近浏览语雀社区官网,里面有一篇 easyexcel 里面 图片导出,对此,我产生了浓厚兴趣。恰巧公司有这么一个BT 需求,但是作为有追求的人,图片放在 excel 单元格是不是太不美观了,万一图片很大,那不是奇丑无比了! 有没有什么办法让图片下载到指定的本地文件路径,这样excel 既美观,又不影响图片查看。
上一次写了一篇: EasyExcel3.0.5导出多个sheet,含查询优化,竟然无人问津,这篇写的非常完整,既实现了多个 sheet 导出,也实现了附件下载。但是批量下载附件有几个问题点
- 附件地址解析的局限性。我是存储在 OSS,OSS 返回的路径可以用流直接下载,但是如果有人不用OSS 呢,五花八门的附件 URL 防不胜防,就会导致解析出错!例如遇到下面的 URL 地址,该怎么玩?现实中就有!
https://label1.cmscentertech.com/Label/Print?coNumber=NC2022040700374618&type=MainLabel&childForecastNumber=YT2203721272081883-1&labelformat=PDF
http://yunexpress-fileupload.oss-cn-shenzhen.aliyuncs.com/eddfbbe9c142456f9984d706e10a01e4.Jpeg
- 保存附件地址的问题。创建一个本地文件目录,貌似好像没啥毛病,但是上线部署到服务器的时候,却不能下载到本地了,因为服务器上没有 D盘、C盘,而且只会在服务器创建个目录,egg pain 吗?如下图,服务器上产生了目录并没有下载到你的本地目录。
好了,遇到问题解决问题,才能帮助自己成长。话不多说,开干!
源码
链接:https://pan.baidu.com/s/1q7s6JisKKJ-F_ffN6Uifhg?pwd=1234
提取码:1234
代码实现
为了让读者可以轻松读懂读通,并可以参照实现,还是贴完整一点。
Controller
package cn.com.easyExcel.controller;
import cn.com.easyExcel.param.OrderExportParam;
import cn.com.easyExcel.service.OrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Api(tags = "订单表")
@RestController
@RequestMapping(value = "/order")
public class OrderController {
@Autowired
private OrderService orderService;
@ApiOperation(value = "多sheet导出并下载附件")
@PostMapping(value = "moreSheetAndDownloadUrlFile")
public void moreSheetAndDownloadUrlFile(HttpServletRequest request,
HttpServletResponse response,
OrderExportParam param){
orderService.moreSheetAndDownloadUrlFile(request, response, param);
}
}
接口类
package cn.com.easyExcel.service;
import cn.com.easyExcel.param.OrderExportParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface OrderService {
/**
* 多sheet导出并且下载附件
*/
void moreSheetAndDownloadUrlFile(HttpServletRequest request, HttpServletResponse response, OrderExportParam param);
}
实现类 (重中之重)
package cn.com.easyExcel.service.impl;
import cn.com.easyExcel.enums.InvoiceTypeEnum;
import cn.com.easyExcel.enums.SourceTypeEnum;
import cn.com.easyExcel.excel.listener.ExportListener;
import cn.com.easyExcel.mapper.OrderDetailMapper;
import cn.com.easyExcel.mapper.OrderMapper;
import cn.com.easyExcel.param.OrderExportParam;
import cn.com.easyExcel.pojo.Order;
import cn.com.easyExcel.pojo.OrderDetail;
import cn.com.easyExcel.pojo.OrderImage;
import cn.com.easyExcel.service.OrderService;
import cn.com.easyExcel.util.InitDataUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.tomcat.util.http.fileupload.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import