一、引入的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); }
七、导出文件效果展示
