1. Введение
В этой статье мы увидим, как мы можем создать презентацию с помощью Apache POI .
Эта библиотека дает нам возможность создавать презентации PowerPoint, читать существующие и изменять их содержимое.
2. Зависимости Maven
Для начала нам нужно добавить следующие зависимости в наш pom.xml
:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
Последнюю версию обеих библиотек можно загрузить с Maven Central.
3. Апач POI
Библиотека Apache POI поддерживает файлы .ppt
и .pptx
и предоставляет реализацию HSLF для формата файлов Powerpoint '97 (-2007) и XSLF для формата файлов PowerPoint 2007 OOXML.
Поскольку для обеих реализаций не существует общего интерфейса, мы должны помнить об использовании классов XMLSlideShow
, XSLFSlide
и XSLFTextShape
при работе с более новым форматом файла .pptx
.
А когда требуется работать со старым форматом .ppt , используйте
классы HSLFLideShow
, HSLFSLide
и HSLFTextParagraph
.
В наших примерах мы будем использовать новый формат файла .pptx
, и первое, что нам нужно сделать, это создать новую презентацию, добавить в нее слайд (возможно, с использованием предопределенного макета) и сохранить ее.
Как только эти операции понятны, мы можем начать работать с изображениями, текстом и таблицами.
3.1. Создать новую презентацию
Давайте сначала создадим новую презентацию:
XMLSlideShow ppt = new XMLSlideShow();
ppt.createSlide();
3.2. Добавить новый слайд
При добавлении нового слайда в презентацию мы также можем создать его из предопределенного макета. Для этого нам сначала нужно получить XSFSlideMaster
, который содержит макеты (первый является мастером по умолчанию):
XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0);
Теперь мы можем получить XSFSlideLayout
и использовать его при создании нового слайда:
XSLFSlideLayout layout
= defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
XSLFSlide slide = ppt.createSlide(layout);
Давайте посмотрим, как заполнить заполнители внутри шаблона:
XSLFTextShape titleShape = slide.getPlaceholder(0);
XSLFTextShape contentShape = slide.getPlaceholder(1);
Помните, что у каждого шаблона есть свои заполнители, экземпляры подкласса XSLFAutoShape
, количество которых может отличаться от одного шаблона к другому.
Давайте посмотрим, как мы можем быстро получить все заполнители со слайда:
for (XSLFShape shape : slide.getShapes()) {
if (shape instanceof XSLFAutoShape) {
// this is a template placeholder
}
}
3.3. Сохранение презентации
После того, как мы создали слайд-шоу, следующим шагом будет его сохранение:
FileOutputStream out = new FileOutputStream("powerpoint.pptx");
ppt.write(out);
out.close();
4. Работа с объектами
Теперь, когда мы увидели, как создать новую презентацию, добавить в нее слайд (с использованием или без предопределенного шаблона) и сохранить его, мы можем начать добавлять текст, изображения, ссылки и таблицы.
Начнем с текста.
4.1. Текст
При работе с текстом внутри презентации, как в MS PowerPoint, нам нужно создать текстовое поле внутри слайда, добавить абзац, а затем добавить текст в абзац:
XSLFTextBox shape = slide.createTextBox();
XSLFTextParagraph p = shape.addNewTextParagraph();
XSLFTextRun r = p.addNewTextRun();
r.setText("ForEach");
r.setFontColor(Color.green);
r.setFontSize(24.);
При настройке XSLFTextRun
можно настроить его стиль, выбрав семейство шрифтов и выделение текста полужирным шрифтом, курсивом или подчеркиванием.
4.2. Гиперссылки
При добавлении текста в презентацию иногда бывает полезно добавить гиперссылки.
После того, как мы создали объект XSLFTextRun
, теперь мы можем добавить ссылку:
XSLFHyperlink link = r.createHyperlink();
link.setAddress("http://www.foreach.com");
4.3. Картинки
Мы также можем добавить изображения:
byte[] pictureData = IOUtils.toByteArray(
new FileInputStream("logo-leaf.png"));
XSLFPictureData pd
= ppt.addPicture(pictureData, PictureData.PictureType.PNG);
XSLFPictureShape picture = slide.createPicture(pd);
Однако без правильной настройки изображение будет помещено в верхний левый угол слайда . Чтобы разместить его правильно, мы должны настроить его точку привязки:
picture.setAnchor(new Rectangle(320, 230, 100, 92));
XSLFPictureShape принимает Rectangle в качестве точки
привязки
, что позволяет нам настроить координаты x/y с помощью первых двух параметров и ширину/высоту изображения с помощью последних двух. ``
4.4. Списки
Текст внутри презентации часто представляется в виде списка, нумерованного или нет.
Давайте теперь определим список маркеров:
XSLFTextShape content = slide.getPlaceholder(1);
XSLFTextParagraph p1 = content.addNewTextParagraph();
p1.setIndentLevel(0);
p1.setBullet(true);
r1 = p1.addNewTextRun();
r1.setText("Bullet");
Точно так же мы можем определить нумерованный список:
XSLFTextParagraph p2 = content.addNewTextParagraph();
p2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1);
p2.setIndentLevel(1);
XSLFTextRun r2 = p2.addNewTextRun();
r2.setText("Numbered List Item - 1");
В случае, если мы работаем с несколькими списками, всегда важно определить уровень отступа
, чтобы добиться правильного отступа элементов.
4.5. Столы
Таблицы — еще один ключевой объект в презентации, и они полезны, когда мы хотим отобразить данные.
Начнем с создания таблицы:
XSLFTable tbl = slide.createTable();
tbl.setAnchor(new Rectangle(50, 50, 450, 300));
Теперь мы можем добавить заголовок:
int numColumns = 3;
XSLFTableRow headerRow = tbl.addRow();
headerRow.setHeight(50);
for (int i = 0; i < numColumns; i++) {
XSLFTableCell th = headerRow.addCell();
XSLFTextParagraph p = th.addNewTextParagraph();
p.setTextAlign(TextParagraph.TextAlign.CENTER);
XSLFTextRun r = p.addNewTextRun();
r.setText("Header " + (i + 1));
tbl.setColumnWidth(i, 150);
}
После завершения заголовка мы можем добавить строки и ячейки в нашу таблицу для отображения данных:
for (int rownum = 1; rownum < numRows; rownum++) {
XSLFTableRow tr = tbl.addRow();
tr.setHeight(50);
for (int i = 0; i < numColumns; i++) {
XSLFTableCell cell = tr.addCell();
XSLFTextParagraph p = cell.addNewTextParagraph();
XSLFTextRun r = p.addNewTextRun();
r.setText("Cell " + (i*rownum + 1));
}
}
При работе с таблицами важно помнить, что можно настроить границу и фон каждой отдельной ячейки.
5. Изменение презентации
Не всегда при работе над слайд-шоу приходится создавать новое, а приходится переделывать уже существующее.
Давайте посмотрим на тот, который мы создали в предыдущем разделе, а затем мы можем начать его изменять:
5.1. Чтение презентации
Чтение презентации довольно просто и может быть выполнено с помощью перегруженного конструктора XMLSlideShow
, который принимает FileInputStream
:
XMLSlideShow ppt = new XMLSlideShow(
new FileInputStream("slideshow.pptx"));
5.2. Изменение порядка слайдов
При добавлении слайдов в нашу презентацию рекомендуется располагать их в правильном порядке, чтобы обеспечить правильный поток слайдов.
Если этого не происходит, можно изменить порядок слайдов. Давайте посмотрим, как мы можем переместить четвертый слайд на второй:
List<XSLFSlide> slides = ppt.getSlides();
XSLFSlide slide = slides.get(3);
ppt.setSlideOrder(slide, 1);
5.3. Удаление слайда
Также можно удалить слайд из презентации.
Давайте посмотрим, как мы можем удалить 4-й слайд:
ppt.removeSlide(3);
6. Заключение
В этом кратком руководстве показано, как использовать API-интерфейс Apache POI
для чтения и записи файла PowerPoint с точки зрения Java.
Полный исходный код этой статьи, как всегда, можно найти на GitHub .