EasyExcel实现导出图片到excel

pom依赖:

XML 复制代码
<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.0</version>
</dependency>

实体类:

java 复制代码
package com.aicut.monitor.vo;

import com.aicut.monitor.utils.UrlImageConverter;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * 豁口图片视图类
 * @author zhangzhi
 */
@ExcelIgnoreUnannotated
@ContentRowHeight(120)
@Getter
@Setter
@ToString
public class CutterImageVO extends BaseVO{

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @ExcelIgnore
    @Schema(description="主键")
    private Long id;

    /**
     * 工厂编码
     */
    @Schema(description="工厂编码")
    @ExcelProperty(value = "工厂编码")
    private String factoryCode;

    /**
     * 产线编码
     */
    @Schema(description="产线编码")
    @ExcelProperty(value = "产线编码")
    private String productionLineCode;

    /**
     * 设备编号
     */
    @Schema(description="设备编号")
    @ExcelProperty(value = "设备编号")
    private String deviceNumber;

    /**
     * 设备名称
     */
    @Schema(description="设备名称")
    @ExcelProperty(value = "设备名称")
    private String deviceName;

    /**
     * 分切刀编号
     */
    @Schema(description="分切刀编号")
    @ExcelProperty(value = "分切刀编号")
    private String cutterCode;

    /**
     * 是否磨损
     */
    @Schema(description="是否磨损")
    @ExcelProperty(value = "是否磨损")
    private Integer wearOrNot;

    /**
     * 检测时间
     */
    @Schema(description="检测时间")
    @ExcelProperty(value = "检测时间")
    @JsonFormat(timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ColumnWidth(20)
    private Date detectionTime;

    /**
     * 图片路径
     */
    @Schema(description="图片路径")
    @ExcelProperty(value = "豁口图片",converter = UrlImageConverter.class)
    @ColumnWidth(20)
    private String imageUrl;

    /**
     * 建议操作
     */
    @Schema(description="建议操作")
    @ExcelProperty(value = "建议操作")
    private String remark;
}

导出excel部分代码:

java 复制代码
        String fileName = "豁口图片数据.xlsx";
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        try {
            EasyExcel.write(response.getOutputStream(), CutterImageVO.class)
                    .sheet("豁口图片数据")
                    .doWrite(cutterImageVOList);
        }catch (Exception e){
            log.error(e.getMessage());
        }

String类型图片转换器:

java 复制代码
package com.aicut.monitor.utils;

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 15:04
 **/
@Slf4j
public class UrlImageConverter implements Converter<String> {
    public static int urlConnectTimeout = 2000;
    public static int urlReadTimeout = 6000;

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

    @Override
    public WriteCellData<?> convertToExcelData(String url, ExcelContentProperty contentProperty,
                                               GlobalConfiguration globalConfiguration) throws IOException {
        InputStream inputStream = null;
        try {
            URL value = new URL(url);
            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();
            }
        }
    }
}

导出效果:

相关推荐
m0_726965988 分钟前
面面面,面面(1)
java·开发语言
xuhaoyu_cpp_java40 分钟前
过滤器与监听器学习
java·经验分享·笔记·学习
程序员小假1 小时前
我们来说一下 b+ 树与 b 树的区别
java·后端
Meepo_haha2 小时前
Spring Boot 条件注解:@ConditionalOnProperty 完全解析
java·spring boot·后端
sheji34162 小时前
【开题答辩全过程】以 基于springboot的房屋租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
木井巳2 小时前
【递归算法】子集
java·算法·leetcode·决策树·深度优先
行百里er3 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·代码规范
ms_27_data_develop3 小时前
Java枚举类、异常、常用类
java·开发语言
xiaohe073 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot