Java实现Excel中插入图片

废话不多说,直接上代码

1. 首先引入图片缩放所需要的依赖(如果不需要对图片进行缩放,则可以省略该步骤)

<dependency>
    <groupId>org.imgscalr</groupId>
    <artifactId>imgscalr-lib</artifactId>
    <version>4.2</version>
</dependency>

2. 主方法,网上随便找一张图片,并将生成的.xlsx文件保存到本地路径

public static void main(String[] args) {
    Workbook workbook = new XSSFWorkbook();
    Sheet sheet = workbook.createSheet("测试");

    sheet.createRow(0);

    String imageUrl = "图片路径";
    insertImageToSheet(sheet, imageUrl, 0, 0);

    saveFile("/Users/xxx/Desktop/test.xlsx", workbook);
}

3. 将图片插入单元格,其中,旋转图片和缩放图片可根据实际需求自行添加或删除 

/**
 * 将图片插入单元格
 */
private static void insertImageToSheet(Sheet sheet, String imageUrl, int rowNum, int colNum) {
    //1. 下载图片
    BufferedImage originalImage = downloadImage(imageUrl);
    if (Objects.isNull(originalImage)) {
        return;
    }

    //2. 旋转图片
    BufferedImage rotatedImage = rotateImage(originalImage);

    //3. 缩放图片
    ScaledImageDataDTO scaledImageData = scaleImage(rotatedImage);

    //4.将缩放后的图片转换为bytes
    byte[] imageBytes = processImageToBytes(scaledImageData.getScaledImage());

    //5.将图片bytes添加到Excel中
    setIntoSheet(sheet, rowNum, colNum, imageBytes, scaledImageData.getHeight());
}
@Data
@AllArgsConstructor
public class ScaledImageDataDTO {

    private int height;

    private BufferedImage scaledImage;
}

 注:缩放图片尺寸可修改desiredWidth值自定义

/**
 * 下载图片
 */
private static BufferedImage downloadImage(String imageUrl) {
    try {
        URL url = new URL(imageUrl);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setConnectTimeout(5000);
        connection.setReadTimeout(5000);

        if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
            log.error("【图片下载失败,url:{}, 链接状态码:{}】", imageUrl, connection.getResponseCode());
            return null;
        }

        InputStream inputStream = connection.getInputStream();
        BufferedImage image = ImageIO.read(inputStream);
        inputStream.close();

        return image;
    } catch (Exception e) {
        log.error("【图片下载失败,url:{}, 错误信息:{}】", imageUrl, e);
        return null;
    }
}

/**
 * 旋转图片
 */
private static BufferedImage rotateImage(BufferedImage targetImage) {
    int w = targetImage.getWidth();
    int h = targetImage.getHeight();

    BufferedImage rotatedImage = new BufferedImage(h, w, targetImage.getType());
    Graphics2D g2d = rotatedImage.createGraphics();

    AffineTransform at = new AffineTransform();
    at.translate(h / 2.0, w / 2.0);
    at.rotate(Math.toRadians(270),0, 0);
    at.translate(-w / 2.0, -h / 2.0);
    g2d.drawRenderedImage(targetImage, at);
    g2d.dispose();

    return rotatedImage;
}

/**
 * 缩放图片
 */
private static ScaledImageDataDTO scaleImage(BufferedImage targetImage) {
    int desiredWidth = 170; // 图片宽度
    double aspectRatio = (double) targetImage.getHeight() / targetImage.getWidth();
    int desiredHeight = (int) (desiredWidth * aspectRatio); // 保持纵横比

    BufferedImage scaledImage = Scalr.resize(targetImage, Scalr.Method.QUALITY, desiredWidth, desiredHeight);
    return new ScaledImageDataDTO(desiredHeight, scaledImage);
}

/**
 * 图片转bytes
 */
private static byte[] processImageToBytes(BufferedImage targetImage) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    try {
        ImageIO.write(targetImage, "png", stream);
        return stream.toByteArray();
    } catch (IOException e) {
        log.error("【图片转bytes异常,错误信息:】", e);
        return new byte[0];
    }
}

/**
 * 将图片bytes添加到Excel中
 */
private static void setIntoSheet(Sheet sheet, int rowNum, int colNum, byte[] imageBytes, int imageHeight) {
    int pictureIdx = sheet.getWorkbook().addPicture(imageBytes, Workbook.PICTURE_TYPE_PNG);
    CreationHelper helper = sheet.getWorkbook().getCreationHelper();
    Drawing<?> drawing = sheet.createDrawingPatriarch();
    ClientAnchor anchor = helper.createClientAnchor();
    anchor.setCol1(colNum);
    anchor.setRow1(rowNum);
    Picture pict = drawing.createPicture(anchor, pictureIdx);

    // 设置行高度以匹配图片高度
    Row row = sheet.getRow(rowNum);
    row.setHeightInPoints((float) (imageHeight * 0.75));

    pict.resize();
}

 代码亲测有效,如有疑问欢迎留言噢~

Dependent on GPT4.0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java使用Apache POI可以实现Excel插入图片。下面我将介绍一下具体实现步骤: 1. 首先需要导入POI相关的jar包。可以从官网上下载最新版本的POI,然后将poi-xxx.jar、poi-ooxml-xxx.jar、poi-ooxml-schemas-xxx.jar、ooxml-lib\dom4j-xxx.jar、ooxml-lib\xmlbeans-xxx.jar这些jar包导入到项目。 2. 创建一个工作簿对象,并在其创建一个工作表对象。 ``` Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); ``` 3. 创建一个文件输入流对象,读取图片文件。 ``` InputStream inputStream = new FileInputStream("图片文件路径"); ``` 4. 将图片数据读取到一个字节数组。 ``` byte[] bytes = IOUtils.toByteArray(inputStream); ``` 5. 创建一个绘图对象,并将图片数据添加到绘图对象。 ``` Drawing<?> drawing = sheet.createDrawingPatriarch(); ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, 0, 0, 1, 1); Picture pic = drawing.createPicture(anchor, workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG)); ``` 6. 将Excel文件保存到本地。 ``` FileOutputStream outputStream = new FileOutputStream("Excel文件保存路径"); workbook.write(outputStream); outputStream.close(); ``` 以上就是使用Java POI向Excel插入图片的具体实现步骤。需要注意的是,这里使用的是XSSFWorkbook和XSSFClientAnchor,所以生成的Excel文件格式是xlsx。如果需要生成xls格式的文件,需要使用HSSFWorkbook和HSSFClientAnchor。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值