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 должен выглядеть так:
6. Заключение
В этой статье мы узнали, как добавить изображение в ячейку рабочего листа Excel на Java с помощью библиотеки apache-poi .
Нам нужно было загрузить изображение, преобразовать его в байты, прикрепить к листу, а затем с помощью инструментов рисования расположить изображение в нужных ячейках. Наконец, мы смогли изменить размер столбцов и сохранить нашу книгу.
Как всегда, пример кода для этой статьи доступен на GitHub .