Перейти к основному содержимому

Добавить изображение в ячейку в файле Excel с помощью Java

· 4 мин. чтения

1. Обзор

В этом уроке мы узнаем, как добавить изображение в ячейку в файле Excel с помощью Java.

Мы создадим файл Excel динамически и добавим изображение в ячейку, используя apache-poi .

2. Настройка проекта и зависимости

Приложения Java могут использовать apache-poi для динамического чтения, записи и изменения содержимого электронной таблицы Excel. Он поддерживает форматы Excel как .xls , так и .xlsx .

2.1. Зависимость Maven для Apache Poi API

Во-первых, давайте добавим зависимость poi в наш проект:

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

2.2. Создание книги Excel

Во-первых, давайте создадим рабочую книгу и лист для записи. Мы можем выбрать либо XSSFWorkbook , который работает с файлами .xlsx , либо HSSFWorkbook , который работает с файлами .xls . Давайте используем XSSFWorkbook :

Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Avengers");
Row row1 = sheet.createRow(0);
row1.createCell(0).setCellValue("IRON-MAN");
Row row2 = sheet.createRow(1);
row2.createCell(0).setCellValue("SPIDER-MAN");

Здесь мы создали лист Мстителей и заполнили ячейки A1 и A2 двумя именами. Далее мы добавим изображения Мстителей в ячейки 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 в массив байтов

Далее давайте конвертируем изображения в байтовые массивы. Здесь мы будем использовать IOUtils от apache-poi :

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. Создание контейнера чертежа

Патриарх рисования — это контейнер верхнего уровня для всех фигур. Это вернет интерфейс рисования — в нашем случае объект 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. Добавление объекта привязки и указателя изображения в контейнер чертежа

Теперь давайте вызовем createPicture для патриарха рисования, чтобы добавить изображение. Мы будем использовать ранее созданный объект привязки и индекс изображения наших изображений:

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/foreach-apachepoi.xlsx")) {
workbook.write(saveExcel);
}

Полученный лист Excel должен выглядеть так:

./2dd16005efa30d82ed00ff9aa98ae965.png

6. Заключение

В этой статье мы узнали, как добавить изображение в ячейку рабочего листа Excel на Java с помощью библиотеки apache-poi .

Нам нужно было загрузить изображение, преобразовать его в байты, прикрепить к листу, а затем с помощью инструментов рисования расположить изображение в нужных ячейках. Наконец, мы смогли изменить размер столбцов и сохранить нашу книгу.

Как всегда, пример кода для этой статьи доступен на GitHub .