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”的工作表,并在A1和A2单元格中填充了两个名字。接下来,我们将把Avengers的角色图片添加到B1和B2单元格中。
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 POI的IOUtils:
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工作表应该看起来像这样:
6. 总结
在这篇文章中,我们学习了如何使用Apache POI库在Java中将图片添加到Excel工作表的单元格中。
我们需要加载图片,将其转换为字节,将其附加到工作表上,然后使用绘图工具在正确的单元格中定位图片。最后,我们能够调整列宽并保存工作簿。
如往常一样,本文的示例代码可以在GitHub上找到。