SpringBoot 导出数据带图片

发布时间 2023-03-30 11:29:58作者: 遇见你真好。

一、引入的maven依赖

 <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

二、导出的实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.net.URL;

/**
 * @Description 导出实体类
 * @Author songwp
 * @Date 2023/3/30 11:13
 **/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ContentRowHeight(60)
public class BlacklistExportVo implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 用户名称
     */
    @ExcelProperty(value = "姓名")
    private String userName;
    /**
     * 身份证
     */
    @ColumnWidth(value = 20)
    @ExcelProperty(value = "身份证")
    private String identityCard;
    /**
     * 所属项目名称
     */
    @ExcelProperty(value = "所属项目")
    private String belongProjectName;

    /**
     * 所属公司名称(单位+班组)
     */
    @ColumnWidth(value = 15)
    @ExcelProperty(value = "所属单位")
    private String belongCompanyName;
    /**
     * 黑名单起始时间
     */
    @ColumnWidth(value = 20)
    @ExcelProperty(value = "黑名单起始时间")
    private String validityTime;
    /**
     * 加入理由
     */
    @ExcelProperty(value = "加入黑名单原因")
    @ColumnWidth(value = 50)
    private String reason;
    /**
     * 创建时间
     */
    @ColumnWidth(value = 10)
    @ExcelProperty(value = "创建时间")
    private String createTime;
    /**
     * 创建人名称
     */
    @ColumnWidth(value = 10)
    @ExcelProperty(value = "创建人")
    private String creatorName;
    /**
     * 黑名单状态
     */
    @ExcelProperty(value = "黑名单状态")
    private String validityStatus;
    @ExcelProperty(value = "附件1",converter = SxjgUrlImageConverter.class)
    private URL attachment1;
    @ExcelProperty(value = "附件2",converter = SxjgUrlImageConverter.class)
    private URL attachment2;
    @ExcelProperty(value = "附件3",converter = SxjgUrlImageConverter.class)
    private URL attachment3;
}

三、图片处理类

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.IoUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ObjectUtils;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

/**
 * @Description 图片处理
 * @Author songwp
 * @Date 2023/3/30 11:14
 **/
@Slf4j
public class SxjgUrlImageConverter  implements Converter<URL> {
    public static int urlConnectTimeout = 2000;
    public static int urlReadTimeout = 6000;

    @Override
    public Class<?> supportJavaTypeKey() {
        return URL.class;
    }

    @Override
    public WriteCellData<?> convertToExcelData(URL value, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) throws IOException {
        InputStream inputStream = null;
        try {
            if (ObjectUtils.isEmpty(value)){
                return new WriteCellData<>("图片链接为空");
            }
            URLConnection urlConnection = value.openConnection();
            urlConnection.setConnectTimeout(urlConnectTimeout);
            urlConnection.setReadTimeout(urlReadTimeout);
            inputStream = urlConnection.getInputStream();
            byte[] bytes = IoUtils.toByteArray(inputStream);
            return new WriteCellData<>(bytes);
        }catch (Exception e){
            log.info("图片获取异常",e);
            return new WriteCellData<>("图片获取异常");
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
        }
    }
}

四、导出的业务方法

 /**
     * 获取导出数据
     * @param blacklistParam 查询条件
     * @return 返回导出数据
     * @throws BizException 异常
     */
List<BlacklistExportVo> list(BlacklistParam blacklistParam) throws BizException;

五、导出的业务实现

public List<BlacklistExportVo> list(BlacklistParam blacklistParam) throws BizException {
        try {//列表查询
            List<BlacklistDO> blacklistS =  blacklistMapper.paging(blacklistParam);
            List<BlacklistExportVo> blacklistExportVos = new ArrayList<>();
            //查询结果为空直接返回
            if (CollectionUtils.isEmpty(blacklistS)){
                return blacklistExportVos;
            }
            //收集黑名单id
            List<Long> ids = blacklistS.stream().map(BlacklistDO::getId).collect(Collectors.toList());
            //根据一组id查询附件
            List<Attachment> educationRecord = iBlacklistAttachService.queryListByReferenceIdS(ids);
            //根据黑名单id对附件做分组处理
            Map<Long,List<Attachment>> listMap = Optional.ofNullable(educationRecord).orElse(new ArrayList<>())
                    .stream().collect(Collectors.groupingBy(Attachment::getReferenceId));
            Optional.of(blacklistS).orElse(new ArrayList<>()).forEach(t->{
                BlacklistExportVo blacklistExportVo = new BlacklistExportVo();
                BeanUtils.copyProperties(t,blacklistExportVo);
                blacklistExportVo.setBelongCompanyName((StringUtils.isEmpty(t.getBelongCompanyName()) ? "" : t.getBelongCompanyName())
                        + "-" + (StringUtils.isEmpty(t.getBelongGroupName()) ? "" : t.getBelongGroupName()));// 当前系统时间的时间戳 (YYYY-MM-dd)
                long todayStart = DateUtil.parse(DateUtil.today()).getTime();
                // 开始时间的时间戳 (YYYY-MM-dd)
                long rowStartDate = t.getStartTime().getTime();
                // 结束时间的时间戳 (YYYY-MM-dd)
                long rowEndDate = t.getEndTime().getTime();
                String blackStatus = "";
                if ((rowStartDate <= todayStart && todayStart <= rowEndDate) || rowStartDate >= todayStart) {
                    blackStatus = "有效期内";
                } else {
                    blackStatus = "已过期";
                }
                blacklistExportVo.setValidityStatus(blackStatus);

                blacklistExportVo.setValidityTime(DateUtil.format(t.getStartTime(),"YYYY-MM-dd") + "~"
                        + DateUtil.format(t.getEndTime(),"yyyy-MM-dd"));
                blacklistExportVo.setCreateTime(DateUtil.format(t.getStartTime(),"YYYY-MM-dd"));
                List<Attachment> attachments = listMap.get(t.getId());
                if (!CollectionUtils.isEmpty(attachments)){
                    //图片封装
                    try {
                        if (attachments.size() ==1){
                            blacklistExportVo.setAttachment1(new URL(attachments.get(0).getSmallImgUrl()));
                        }else if (attachments.size()==2){
                            blacklistExportVo.setAttachment1(new URL(attachments.get(0).getSmallImgUrl()));
                            blacklistExportVo.setAttachment2(new URL(attachments.get(1).getSmallImgUrl()));
                        }else if (attachments.size()>=3){
                            blacklistExportVo.setAttachment1(new URL(attachments.get(0).getSmallImgUrl()));
                            blacklistExportVo.setAttachment2(new URL(attachments.get(1).getSmallImgUrl()));
                            blacklistExportVo.setAttachment3(new URL(attachments.get(2).getSmallImgUrl()));
                        }
                    } catch (MalformedURLException e) {
                        throw new RuntimeException(e);
                    }
                }
                blacklistExportVos.add(blacklistExportVo);
            });
            return blacklistExportVos;
        } catch (BizException e) {
            log.error(e.getBusiMessage(), e);
            throw e;
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            throw new BizException(BasicBizUtil.getReturnErrorEnum(e));
        }
    }

六、导出的控制器-方法

 /**
     * 黑名单明细导出
     * @param response 相应结果
     * @param blacklistParam 查询参数
     * @throws BizException 异常信息
     */
    @PostMapping("")
    public void export(HttpServletResponse response, @RequestBody  BlacklistParam blacklistParam) throws BizException {
        long start = System.currentTimeMillis();
        blacklistParam.setPage(false);
        List<BlacklistExportVo> blacklistExportVos = iBlacklistService.list(blacklistParam);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = null;
        try {
            fileName = URLEncoder.encode("黑名单导出", "UTF-8").replaceAll("\\+", "%20");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        try {
            EasyExcel.write(response.getOutputStream(), BlacklistExportVo.class).sheet("黑名单").doWrite(blacklistExportVos);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        long end = System.currentTimeMillis();
        log.info("黑名单明细导出耗时,{}",start-end);

    }

七、导出文件效果展示