java获取excel中指定列和位置的图片(浮动式和嵌入到单元格都支持)

目录

  1. 通过apache.poi 获取excel中所有的图片(不限制插入的方式是浮动式还是嵌入到单元格)
  2. 通过apache.poi 获取excel中指定列行浮动式(只能是浮动式,其他的获取不到)插入的所有图片
  3. 通过apache.poi 获取excel中指定列嵌入的单元格(只能是嵌入式的,其他的获取不到)插入的所有图片
  4. 结合两种

介绍

插入图片的到excel中的时候,其实是分为两种插入形式的,浮动式和嵌入到单元格,如下图
在这里插入图片描述

通过apache.poi 获取excel中所有的图片(不限制插入的方式是浮动式还是嵌入到单元格)

pic.xlsx内容,共五张图片
在这里插入图片描述
代码大概思路如下,获取pic.xlsx文件中所有图片,然后保存到/picTemp文件夹路径下
依赖包代码:

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>5.1.1</version>
        </dependency>

业务代码:

package org.example.officeexcel;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;


public class ExcelImageExtractorTest {
   
    /**
     * 提取Excel文件中的所有的图片(浮动式的,嵌入式的)
     */
    @Test
    public void test1() {
   
        String excelFilePath = "/Users/luojiwen/Desktop/temp/0919/pic.xlsx";
        String outputDir = "/Users/luojiwen/Desktop/temp/0919/picTemp/";

        try (FileInputStream fis = new FileInputStream(new File(excelFilePath));
             Workbook workbook = new XSSFWorkbook(fis)) {
   

            // 获取工作簿中的所有嵌入图片
            List<? extends PictureData> pictures = workbook.getAllPictures();

            // 导出每个图片
            int pictureIndex = 1;
            for (PictureData pictureData : pictures) {
   
                String ext = pictureData.suggestFileExtension();
                String imageName = "image" + pictureIndex + "." + ext;
                FileOutputStream fos = new FileOutputStream(new File(outputDir + imageName));
                fos.write(pictureData.getData());
                fos.close();
                pictureIndex++;
            }

            System.out.println("图片导出完成!");
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
}

控制台输出:
在这里插入图片描述

五张图片都提取出来了,效果输出:
在这里插入图片描述

通过apache.poi 获取excel中指定列行浮动式(只能是浮动式,其他的获取不到)插入的所有图片

最好设置一下图片的属性,不然你看到的和他实际上所处的单元格可能并不是一致的,比如,你看到的是在第一列第一行的单元格内,实际上,他可能并不在。
在这里插入图片描述
这是我的pic.xlsx内容,共六张图片
在这里插入图片描述
我想获取指定的某一个单元格,如我想获取最下面的盆栽图片,他在第一列(A列)第三行,因为代码中下标是从零开始,所有我们指定的坐标就是(0,2)代表第一列第三行。
在这里插入图片描述
代码大概思路如下,获取pic.xlsx文件中所有图片,然后保存到/picTemp1文件夹路径下,正常来说只会有一张图片
业务功能代码:

/**
     * 提取指定单元格(下标从零开始,(0,1:第一列第二行))中的图片(只有浮动式的且要设置图片的属性为大小和位置随改变)
     */
    @Test
    public void test2(){
   

        String excelFilePath = "/Users/luojiwen/Desktop/temp/0919/pic.xlsx";
        String outputDir = "/Users/luojiwen/Desktop/temp/0919/picTemp1/";

        int targetColumnIndex = 0; // 例如:提取第A列(索引从0开始)
        int targetRowIndex = 2; // 例如:提取第1行(索引从0开始)

        try (FileInputStream fis = new FileInputStream(new File(excelFilePath));
             XSSFWorkbook workbook = new XSSFWorkbook(fis)) {
   

            // 遍历每个工作表
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
   
                XSSFSheet sheet = workbook.getSheetAt(i);

                // 获取每个工作表中的绘图对象
                XSSFDrawing drawing = sheet.getDrawingPatriarch();
                if (drawing == null) continue; // 如果没有绘图对象则跳过

                List<XSSFShape> shapes = drawing.getShapes();

                int pictureIndex = 1;
                for (XSSFShape shape : shapes) {
   
                    if (shape instanceof XSSFPicture) {
   
                        XSSFPicture picture = (XSSFPicture) shape;
                        XSSFPictureData pictureData = picture.getPictureData();
                        XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getAnchor();

                        // 获取图片位置
                        int col1 = anchor.getCol1();
                        int col2 = anchor.getCol2();
                        int row1 = anchor.getRow1();
                        int row2 = anchor.getRow2();

                        // 检查图片是否位于目标单元格中
                        if (targetColumnIndex >= col1 && targetColumnIndex <= col2 && targetRowIndex >= row1 && targetRowIndex <= row2) {
   
                            String ext = pictureData.suggestFileExtension();
                            String imageName = "sheet" + i + "_cell_" + row1 
Java中,Apache POI库是一个广泛用于处理Microsoft Office格式文件(如Excel、Word等)的强大工具。如果你想将浮动图片嵌入Excel单元格中,并将其视为单元格的一部分,而不是作为单独的对象存储,POI提供了一些方法来实现这个目标。 `HSSFCell` `HSSFPatriarch` 类可以用来创建嵌入式图像。以下是基本步骤: 1. 首先,你需要创建一个 `Workbook` 对象并打开工作簿: ```java HSSFWorkbook workbook = new HSSFWorkbook(); ``` 2. 然后,选择一个工作表并获取一个 `Row` 对象来添加新的行: ```java HSSFSheet sheet = workbook.createSheet("Sheet1"); HSSFRow row = sheet.createRow(0); ``` 3. 创建一个新的 `HSSFCell` 对象,通常这是 `HSSFDataFormat` 对象的一个实例,以便设置单元格的格式: ```java HSSFDataFormat df = workbook.createDataFormat(); HSSFCellStyle style = workbook.createCellStyle(); style.setDataFormat(df.getFormat("$#.##;[.-]0.00")); ``` 4. 使用 `HSSFPatriarch` 添加图片,例如从本地路径加载: ```java HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); InputStream inputStream = new FileInputStream("path_to_your_image.jpg"); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, row.getFirstColumn(), row.getRowNum(), row.getLastColumn(), row.getRowNum()); Image image = ImageFactory.createImage(inputStream); patriarch.addPicture(image, anchor); ``` 5. 将包含图片单元格插入行中: ```java HSSFCell cell = row.createCell((short) 0); // 设置第一列 cell.setCellValue(""); cell.setCellStyle(style); // 现在,图片已经被嵌入单元格中了 ``` 6. 最后,记得保存你的工作簿: ```java workbook.write(new FileOutputStream("output.xlsx")); workbook.close(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值