Apache POI PPT - PowerPoint в Java

Часто бывает так, что приложению необходимо генерировать отчеты в формате Microsoft Office ppt или pptx, точно так же, как ему нужно редактировать и читать файлы Power Point. Java-программист, который хочет создавать файлы MS Office, должен использовать библиотеку Java, и среди них есть библиотека Apache, известная своей эффективностью.

Apache POI — это API, который позволяет создавать, изменять и отображать файлы MS Office. Этот книжный магазин с открытым исходным кодом разработан и распространяется Apache Software Foundation.

Это учебное пособие предназначено для тех, кому необходимо читать, создавать и редактировать файлы Power Point с помощью Java. В нем объясняются основные возможности библиотеки Apache POI и ее основные функции для выполнения операций с файлами Power Point.

Загрузите и установите Apache POI PPT

Загрузите последнюю версию Apache POI с официального сайта (Download Apache POI PPT) и распакуйте содержимое в папку проекта, чтобы затем связать необходимые библиотеки с приложением. Нам понадобится следующий .jar файлов:
  • poi.jar
  • poi-oxml.jar
  • poi-oxml-schema.jar
  • log4j.jar
  • xmlbeans.jar

Классы и методы

Apache POI содержит классы и методы для работы с файлами Excel, Word и Power Point. Мы уже объясняли эти классы для excel и word в предыдущих статьях. Мы покажем вам классы, связанные с Power Point:
  • XMLSlideShow: Для создания презентации и управления ею у вас есть следующий класс XMLSlideShow в org.apache.poi.xslf.usermoder.
  • XSLFSlide: создает слайд в презентации и управляет им.
  • XSLFSlideMaster: для презентации, содержащей различные макеты слайдов. Класс XSLFSlideMaster предоставляет доступ к следующим макетам.
  • XSLFSlideLayout: позволяет управлять макетами слайда.
  • XSLFTextParagraph: вы можете написать текст на слайде с помощью класса XSLFTextParagraph.
  • XSLFTextRun: этот класс обрабатывает форматирование текста (гиперссылки, цвета, шрифты и т.д.).
  • XSLFTextShape: Этот класс обрабатывает фигуры, содержащие текст.
  • XSLFHyperlink: позволяет создавать гиперссылки в презентации.

Создайте пустую презентацию Power Point

Теперь давайте посмотрим, как создать презентацию с помощью Java. Чтобы создать пустую презентацию, необходимо создать экземпляр XMLSlideShow class:

XMLSlideShow ppt = new XMLSlideShow(); 
Сохраните изменения в документе PPT с помощью FileOutputStream:

File file=new File("C://POIPPT//Examples//example1.pptx"); 
FileOutputStream out = new FileOutputStream(file);
ppt.write(out);
Приведенный ниже код представляет собой полную программу для создания пустого документа PowerPoint:

import java.io.File; 
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class PowerPoint {

public static void main(String args[]) выбрасывает IOException{

//создаем новое пустое слайд-шоу
XMLSlideShow ppt = new XMLSlideShow();

//создаем объект FileOutputStream для сохранения документа PPT
File file =new File("exemple.pptx");
FileOutputStream fis = new FileOutputStream(file);

//сохраняем файл
ppt.write(fis);
System.out.println("файл успешно создан");
fis.close();
}
}
Компиляция и выполнение этого кода создает пустой файл exemple.pptx в каталоге проекта, который выглядит следующим образом:

Измените или отредактируйте существующий файл PowerPoint

Чтобы открыть существующую презентацию, создайте экземпляр класса XMLSlideShow и передайте объект FileInputStream файла, который вы хотите изменить, в качестве аргумента в конструкторе XMLSlideShow.

File file=new File("C://POIPPT//Examples//example1.pptx"); 
FileInputstream inputstream =new FileInputStream(файл);
XMLSlideShow ppt = new XMLSlideShow(inputstream);
Вы можете добавить слайды в презентацию с помощью метода createSlide() класса XMLSlideShow.

XSLFSlide slide1= ppt.createSlide(); 
Откроется следующая программа, которая добавит слайды в уже созданный файл exemple.pptx:

import java.io.File; 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class EditPresentation {

public static void main(String ar[]) выбрасывает IOException{

//открываем существующий файл powerpoint
File file = new File("exemple.pptx");
FileInputStream inputstream=new FileInputStream(файл);
XMLSlideShow ppt = new XMLSlideShow(inputstream);

//добавляем слайды в presentation
XSLFSlide slide1 = ppt.createSlide();
XSLFSlide slide2 = ppt.createSlide();
XSLFSlide slide3 = ppt.createSlide();

//сохранить изменения
FileOutputStream fis = new FileOutputStream(file);
ppt.write(fis);

System.out.println("Изменения выполнены успешно");
fis.close();
}
}
Программа выдает следующий результат:

Изменения сделаны успешно
Документ изменен тремя новыми слайдами:


После добавления новых слайдов вы можете читать, записывать и выполнять операции с этими слайдами.

Доступные макеты

Презентации PowerPoint имеют макеты для каждого слайда, которые можно выбрать. Для начала давайте найдем список всех доступных макетов.
Существуют различные слайды, называемые мастер-слайдами, и в каждом образце слайдов есть несколько макетов слайдов.
- Вы можете получить список слайдов с помощью метода  getSlideMasters()  класса  XMLSlideShow.
- Вы можете получить список макетов слайдов из каждого образца слайдов, вызвав метод getSlideLayouts()  класса  XSLFSlideMaster.
- Вы можете получить имя макета из объекта  layout  С помощью метода getType()  класса  XSLFSlideLayout.

Приведенная ниже программа отображает все доступные макеты в формате PPT:

import java.io.IOException; 
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;

public class SlideLayouts {

public static void main(String args[]) выбрасывает IOException{

XMLSlideShow ppt = new XMLSlideShow();
System.out.println("Доступные макеты");

//получаем список всех слайдов masters
for(XSLFSlideMaster master: ppt.getSlideMasters()){

//получаем список всех макетов слайдов в каждом слайде master
for(XSLFSlideLayout layout : master.getSlideLayouts()){

//получает имя layout
System.out.println(layout.getType());
}
}
}
}
Output:

Available layouts
BLANK
TITLE_ONLY
SECTION_HEADER
PIC_TX
TITLE_AND_CONTENT
TITLE
VERT_TX< br />VERT_TITLE_AND_TX
TWO_TX_TWO_OBJ
TWO_OBJ
OBJ_TX
На рисунке ниже показаны некоторые макеты, доступные в MS Office 2007:


Создайте слайд, использующий макет заголовка

Давайте создадим слайд, использующий макет Title:

1- Создайте пустую презентацию, создав экземпляр класса  XMLSlideShow:

XMLSlideShow ppt=new XMLSlideShow(); 
2- Получить список образцов слайдов с помощью метода  getSlideMasters(). затем выберите нужный образец слайдов с его индексом:

XSLFSlideMaster slideMaster = ppt.getSlideMasters().get(0); 
Здесь мы получаем образец слайдов по умолчанию, который находится в позиции 0 массива.

3- Выбираем макет с помощью метода  getLayout()  класса XSLFSlideMaster. Этот метод принимает параметр, который является статической переменной, представляющей требуемый макет. В этом классе есть несколько переменных, каждая из которых представляет макет слайда.

В следующем коде показано, как создать макет заголовка:

XSLFSlideLayout titleLayout = slideMaster.getLayout(SlideLayout.TITLE); 
4- Создайте новый слайд, передав объект макета слайда в качестве параметра.

XSLFSlide slide = ppt.createSlide(titleLayout); 

5- Выберите заполнитель с помощью метода getPlaceholder() класса XSLFSlide. Этот метод принимает целочисленный параметр. При передаче значения 0 получается объект XSLFTextSlide, используемый для доступа к области текста заголовка на слайде. Измените заголовок с помощью setText():

XSLFTextShape title = slide.getPlaceholder(0); 
title.setText("JavaCoder");

Вот полная программа:

import java.io.File; 
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

public class TitleLayout {

public static void main(String args[]) выбрасывает IOException{

XMLSlideShow ppt = new XMLSlideShow();

//получаем объект slidemaster
XSLFSlideMaster slideMaster = ppt.getSlideMasters().get(0);

//получаем нужный макет слайда
XSLFSlideLayout titleLayout = slideMaster.getLayout(SlideLayout.TITLE);

//создаем слайд с выбранным slidelayout
XSLFSlide slide = ppt.createSlide(titleLayout);

//изменить заполнитель 0, который является заголовком
XSLFTextShape title = slide.getPlaceholder(0);

//edit title
title.setText("JavaCoder");

//создаем новый файл pptx
File file=new File("Exemple.pptx");
FileOutputStream fos = new FileOutputStream(file);

//сохранить изменения
ppt.write(fos);
System.out.println("слайд успешно создан");
fos.close();
}
}
Output:

slide создан успешно

Измените заголовок и содержимое макета

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

1- Создайте пустую презентацию, создав экземпляр класса  XMLSlideShow.
2- Получить список всех образцов слайдов с помощью метода  getSlideMasters()
3- Получаем нужный макет с помощью метода  getLayout()  класса  XSLFSlideMaster:
4- Создайте новый слайд, передав объект макета в качестве параметра:

XSLFSlide slide = ppt.createSlide(SlideLayout.TITLE_AND_CONTENT); 
5- Выберите заполнитель с помощью getPlaceholder():

XSLFTextShape title = slide.getPlaceholder(1); 
title1.setText("Введение");
6 - Очистите текст слайда, вызвав метод clearText() класса XSLFTextShape.

body.clearText(); 
7- Добавить новый абзац с помощью метода addNewTextParagraph(). Теперь вы можете добавить текст с помощью метода addNewTextRun(), затем setText().

body.addNewTextParagraph().addNewTextRun().setText("это мое первое тело слайда"); 
Вот полный код:

import java.io.File; 
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

public class TitleAndBodyLayout {

public static void main(String args[]) выбрасывает IOException{

XMLSlideShow ppt = new XMLSlideShow();

//получаем объект slidemaster
XSLFSlideMaster slideMaster = ppt.getSlideMasters().get(0);

//получаем нужный макет слайда
XSLFSlideLayout titleLayout = slideMaster.getLayout(SlideLayout.TITLE);

//создаем слайд с выбранным slidelayout
XSLFSlide slide = ppt.createSlide(titleLayout);

//изменить заполнитель 0, который является заголовком
XSLFTextShape title = slide.getPlaceholder(0);

//edit title
title.setText("Введение");

//выбираем заполнитель 1, который является text
XSLFTextShape body = slide.getPlaceholder(1);

//удаляем старый контент
body.clearText();

//добавляем абзац
body.addNewTextParagraph().addNewTextRun().setText("Мой первый слайд");

//создаем новый файл pptx
File file=new File("Exemple.pptx");
FileOutputStream fos = new FileOutputStream(file);

//сохранить изменения
ppt.write(fos);
System.out.println("слайд успешно создан");
fos.close();
}
}
Output:

slide создан успешно

Получение и изменение размера слайда

Размер слайда получается с помощью метода getPageSize() команды XMLSlideShow.

java.awt.Dimension pgsize = ppt.getPageSize(); 
Чтобы изменить размер слайда в java, используйте метод setPageSize() файла XMLSlideShow.

ppt.setPageSize(new java.awt.Dimension(1024, 768)); 
Вот полная программа:

import java.awt.Dimension; 
импорт java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow;

public class ChangingSlide {

public static void main(String args[]) выбрасывает IOException{

File file = new File("Exemple.pptx");
XMLSlideShow ppt = new XMLSlideShow();

//получаем текущее измерение
Измерение pptsize = ppt.getPageSize();

System.out.println("Текущий размер слайда:");
System.out.println("width:" + pptsize.width);
System.out.println("height:" + pptsize.height);

//изменить dimension
ppt.setPageSize(new java.awt.Dimension(1024,400));

FileOutputStream out = new FileOutputStream(file);
ppt.write(out);
System.out.println("изменен размер слайда");
out.close();
}
}
Output:

Текущий размер слайда:
ширина:720
height:540
размер слайда был изменен
После изменения размера слайд выглядит следующим образом:

Изменить порядок слайдов

Вы можете изменить порядок с помощью метода setSlideOrder(). Извлеките все слайды с помощью метода getSlides(), затем выберите из таблицы слайдов и измените порядок с помощью метода setSlideOrder():

//выберите третий слайд
XSLFSlide slide = slides.get(2);

//ставим первым
ppt.setSlideOrder(slide, 1);
В следующем коде показан пример:

import java.io.File; 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class ReorderSlide {

public static void main(String args[]) выбрасывает IOException{

File file=new File("exemple.pptx");
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(file));

//получить список слайдов
java.util.List slides = ppt.getSlides();

//выбираем 3-й слайд
XSLFSlide selectesdslide = slides.get(2);

//ставим на первую позицию
ppt.setSlideOrder(selectesdslide, 0);

FileOutputStream fos = new FileOutputStream(file);
ppt.write(fos);
fos.close();
}
}
Отображение до и после переключения между слайдами 1 и 3:

Front
После

Delete slides

Вы можете удалить слайды, вызвав метод removeSlide(). Этот метод принимает целое число, представляющее позицию удаляемого слайда.

 
File file=new File("fichier1.pptx");
XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(file));

//удалить слайд в позиции 0
ppt.removeSlide(0);
.
.
.
Если мы применим эту операцию удаления к примеру выше, который содержит три слайда (1, 2 и 3), мы получим следующий вывод:

Add Image

Вы можете добавить изображения в презентацию с помощью метода createPicture() класса XSLFSlide. Метод createPicture() принимает изображение в формате массива байтов или bytes.

Вы должны прочитать файл изображения, которое будет добавлено, и преобразовать его в массив байтов с помощью метода IOUtils.toByteArray().

//read image
File image=new File("C://logo.jpg");

//преобразуем изображение в байт array
byte[] bimage = IOUtils.toByteArray(new FileInputStream(image));
Теперь нам нужно добавить созданное изображение в презентацию с помощью метода addPicture(). этот метод принимает байтовую переменную, полученную в результате преобразования image.

PictureData picdata = ppt.addPicture(picture, PictureData.PictureType.PNG); 
наконец, интегрируем изображение в слайд с помощью createPicture():

XSLFPictureShape pic = slide.createPicture(picdata); 
Следующая программа реализует следующие шаги для добавления изображения:

import java.io.File; 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;

public class AddImage {

public static void main(String args[]) выбрасывает IOException{

XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide slide = ppt.createSlide();

//читаем изображение
Файл image=new File("logo.png");

//преобразуем изображение в байты
byte[] picture = IOUtils.toByteArray(new FileInputStream(image));

//добавляем изображение в presentation
PictureData picdata = ppt.addPicture(picture, PictureData.PictureType.PNG);

//создаем слайд для этого добавленного изображения
XSLFPictureShape pic = slide.createPicture(picdata);

File file=new File("diapoimage.pptx");
FileOutputStream fos = new FileOutputStream(file);

ppt.write(fos);
System.out.println("изображение добавлено!");
fos.close();
}
}
После создания файл выглядит следующим образом:

Formatting Text

Текст в презентации может быть отформатирован с помощью методов класса XSLFTextRun. Для этого необходимо создать объект XSLFTextRun, как показано ниже:

//создание слайда с заголовком и содержимым
XSLFSlide slide = ppt.createSlide(slidelayout);

//выбираем заполнитель 1
XSLFTextShape body = slide.getPlaceholder(1);

//добавление абзаца
XSLFTextParagraph paragraph=body.addNewTextParagraph();

//создание объекта TextRun
XSLFTextRun run = paragraph.addNewTextRun();
Вы можете изменить размер шрифта текста в презентации с помощью setFontSize():

run.setFontColor(java.awt.Color.blue); 
run.setFontSize(26);
Следующий фрагмент кода показывает, как применять различные стили: полужирный, курсив, подчеркивание к тексту в Power Point.

//измените текст на Bold
run.setBold(true);

//меняем текст на Italic
run.setItalic(true)

//Рисует линию посередине текста
run.setStrikethrough(true);

//подчеркивание текста
run.setUnderline(true);
Чтобы между абзацами был пробел, добавьте addLineBreak() из XSLFTextParagraph:

paragraph.addLineBreak(); 
Следующая программа собирает все упомянутые методы:

import java.io.File; 
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideLayout;
import org.apache.poi.xslf.usermodel.XSLFSlideMaster;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

public class TextFormatting {

public static void main(String args[]) выбрасывает IOException{

//создаем пустую презентацию
XMLSlideShow ppt = new XMLSlideShow();

//получаем slidemaster
XSLFSlideMaster slideMaster = ppt.getSlideMasters()[0];

//выбираем макет из предоставленного списка
XSLFSlideLayout slidelayout = slideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);

//создаем слайд с заголовком и содержимым
XSLFSlide slide = ppt.createSlide(slidelayout);

//select title
XSLFTextShape body = slide.getPlaceholder(1);

//удаляем существующий текст в slide
body.clearText();

//добавляем новый абзац
XSLFTextParagraph paragraph=body.addNewTextParagraph();

//строка 1

XSLFTextRun run1 = paragraph.addNewTextRun();
run1.setText("Цветная линия");

//изменить цвет текста
run1.setFontColor(java.awt.Color.red);

//меняем размер шрифта
run1.setFontSize(24);

//перейти к следующей строке
paragraph.addLineBreak();

//строка 2

XSLFTextRun run2 = paragraph.addNewTextRun();
run2.setText("ЖИРНАЯ строка");
run2.setFontColor(java.awt.Color.CYAN);

//отобразить текст жирным шрифтом
run2.setBold(true);
paragraph.addLineBreak();

//строка 3

XSLFTextRun run3 = paragraph.addNewTextRun();
run3.setText("Зачеркнутая строка");
run3.setFontSize(12);

//отрисовка текста курсивом
run3.setItalic(true);

//зачеркнутый
run3.setStrikethrough(true);
paragraph.addLineBreak();

//строка 4

XSLFTextRun run4 = paragraph.addNewTextRun();
run4.setText("Подчеркнутая строка");
run4.setUnderline(true);

//подчеркивание текста
paragraph.addLineBreak();

//создаем файловый объект
File file=new File("TextFormat.pptx");
FileOutputStream out = new FileOutputStream(file);

//сохранить изменения
ppt.write(out);
out.close();
}
}
Execution: