1. 概述

在这个教程中,我们将学习如何使用Java在Excel文件的单元格中添加图片。我们将动态创建一个Excel文件,并使用*Apache POI*库来实现。

2. 项目设置与依赖

Java应用可以利用Apache POI库动态读取、写入和修改Excel电子表格的内容。它支持.xls.xlsx两种Excel格式。

2.1. Apache POI API的Maven依赖

首先,我们需要将*poi*依赖添加到我们的项目中:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.5</version>
</dependency>

2.2. 创建Excel工作簿

这里我们创建了一个名为“Avengers”的工作表,并在A1A2单元格中填充了两个名字。接下来,我们将把Avengers的角色图片添加到B1B2单元格中。

3. 在工作簿中插入图片

3.1. 从本地文件读取图片

为了添加图片,我们首先需要从项目目录中读取它们。在我们的项目中,资源目录下有两个图片:

  • /src/main/resources/ironman.png
  • /src/main/resources/spiderman.png
InputStream inputStream1 = TestClass.class.getClassLoader()
    .getResourceAsStream("ironman.png");
InputStream inputStream2 = TestClass.class.getClassLoader()
    .getResourceAsStream("spiderman.png");

3.2. 将图片 InputStream 转换为字节数组

接下来,我们将图片转换为字节数组。这里我们将使用Apache POIIOUtils

byte[] inputImageBytes1 = IOUtils.toByteArray(inputStream1);
byte[] inputImageBytes2 = IOUtils.toByteArray(inputStream2);

3.3. 在工作簿中添加图片

现在,我们将使用字节数组向工作簿中添加图片。支持的图片类型有PNG、JPG和DIB。这里我们使用PNG格式:

int inputImagePictureID1 = workbook.addPicture(inputImageBytes1, Workbook.PICTURE_TYPE_PNG);
int inputImagePictureID2 = workbook.addPicture(inputImageBytes2, Workbook.PICTURE_TYPE_PNG);

这个步骤完成后,我们将得到每个图片的索引,用于创建Drawing对象。

3.4. 创建Drawing容器

绘制的宗师是所有形状的顶级容器。这将返回一个Drawing接口——在我们的例子中,是XSSFDrawing对象。我们将使用这个对象在定义好的单元格中放置图片。

让我们创建绘制的宗师:

XSSFDrawing drawing = (XSSFDrawing) sheet.createDrawingPatriarch();

4. 在单元格中添加图片

现在,我们准备好将图片添加到单元格中。

4.1. 创建锚点对象

首先,我们将创建一个客户端锚点对象,它附着在Excel工作表上,用于设置图片在Excel工作表中的位置。它会固定在左上角和右下角的单元格上。

我们将为每个图片创建两个锚点对象:

XSSFClientAnchor ironManAnchor = new XSSFClientAnchor();
XSSFClientAnchor spiderManAnchor = new XSSFClientAnchor();

接下来,我们需要指定图片相对于锚点对象的位置。

让我们将第一个图片放在B1单元格中:

ironManAnchor.setCol1(1); // Sets the column (0 based) of the first cell.
ironManAnchor.setCol2(2); // Sets the column (0 based) of the Second cell.
ironManAnchor.setRow1(0); // Sets the row (0 based) of the first cell.
ironManAnchor.setRow2(1); // Sets the row (0 based) of the Second cell.

同样地,我们将第二个图片放在B2单元格中:

spiderManAnchor.setCol1(1);
spiderManAnchor.setCol2(2);
spiderManAnchor.setRow1(1);
spiderManAnchor.setRow2(2);

4.2. 将锚点对象和图片索引添加到绘制容器

drawing.createPicture(ironManAnchor, inputImagePictureID1);
drawing.createPicture(spiderManAnchor, inputImagePictureID2);

5. 保存工作簿

在保存之前,我们确保列宽足够容纳添加的图片,使用autoSizeColumn方法:

for (int i = 0; i < 3; i++) {
    sheet.autoSizeColumn(i);
}

最后,保存工作簿:

try (FileOutputStream saveExcel = new FileOutputStream("target/baeldung-apachepoi.xlsx")) {
    workbook.write(saveExcel);
}

最终的Excel工作表应该看起来像这样:

xlavengers

6. 总结

在这篇文章中,我们学习了如何使用Apache POI库在Java中将图片添加到Excel工作表的单元格中。

我们需要加载图片,将其转换为字节,将其附加到工作表上,然后使用绘图工具在正确的单元格中定位图片。最后,我们能够调整列宽并保存工作簿。

如往常一样,本文的示例代码可以在GitHub上找到。