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

Создание презентации MS PowerPoint на Java

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

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. Изменение презентации

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

Давайте посмотрим на тот, который мы создали в предыдущем разделе, а затем мы можем начать его изменять:

./708898eaa7f8bcf19fe4438e2f592115.jpg

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 .