Presentations play a crucial role in conveying information in a clear and visually appealing manner. Using Java along with Apache POI, developers can easily create and manage PowerPoint presentations programmatically. This helps in automating reports and generating dynamic slides.
- Create PowerPoint presentations programmatically using Java
- Use Apache POI to handle both .ppt and .pptx formats
- Manage dependencies efficiently using Maven
Necessary dependencies for using Apache POI
<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>
Apache POI
It has support for both .ppt and .pptx files. i.e. via
- HSLF implementation is used for the Powerpoint 97(-2007) file format
- XSLF implementation for the PowerPoint 2007 OOXML file format.
There is no common interface available for both implementations. Hence for
- .pptx formats, XMLSlideShow, XSLFSlide, and XSLFTextShape classes need to be used.
- .ppt formats, HSLFSlideShow, HSLFSlide, and HSLFTextParagraph classes need to be used.
Let us see the example of creating with .pptx format
Creation of a new presentation:
XMLSlideShow samplePPT = new XMLSlideShow();
samplePPT .createSlide();
Next is adding a slide
XSLFSlideMaster defaultSlideMaster = samplePPT .getSlideMasters().get(0);
Now, we can retrieve the XSLFSlideLayout and it has to be used while creating the new slide
XSLFSlideLayout xslFSlideLayout
= defaultMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
XSLFSlide slide = samplePPT.createSlide(xslFSlideLayout
);
Let us cover the whole concept by going through a sample maven project.
Example Maven Project
Project Structure:

As this is the maven project, let us see the necessary dependencies via pom.xml
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>powerpointpresentation-apache-poi</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>powerpointpresentation-apache-poi</name>
<parent>
<groupId>com.gfg</groupId>
<artifactId>parent-modules</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
</dependencies>
<properties>
<poi.version>5.2.0</poi.version>
</properties>
</project>
PowerPointHelper.java
In this file below operations are seen
- A new presentation is created
- New slides are added
- save the presentation as
FileOutputStream outputStream = new FileOutputStream(fileLocation);
samplePPT.write(outputStream);
outputStream.close();
We can write Text, create hyperlinks, and add images. And also the creation of a list, and table are all possible. In general, we can create a full-fledged presentation easily as well can alter the presentation by adjusting the slides, deleting the slides, etc. Below code is self-explanatory and also added comments to get an understanding of it also.
import org.apache.poi.sl.usermodel.AutoNumberingScheme;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.sl.usermodel.TableCell;
import org.apache.poi.sl.usermodel.TextParagraph;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFAutoShape;
import org.apache.poi.xslf.usermodel.XSLFHyperlink;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFShape;
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.XSLFTable;
import org.apache.poi.xslf.usermodel.XSLFTableCell;
import org.apache.poi.xslf.usermodel.XSLFTableRow;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;
import java.awt.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
// Helper class for the
// PowerPoint presentation creation
public class PowerPointHelper {
/**
* Read an existing presentation
*
* @param fileLocation
* File location of the presentation
* @return instance of {@link XMLSlideShow}
* @throws IOException
*/
public XMLSlideShow readWithExistingSlideShow(String fileLocation) throws IOException {
return new XMLSlideShow(new FileInputStream(fileLocation));
}
/**
* Create a sample presentation
*
* @param fileLocation
* File location of the presentation
* @throws IOException
*/
public void creatingAPresentation(String fileLocation) throws IOException {
// Create presentation
XMLSlideShow samplePPT = new XMLSlideShow();
XSLFSlideMaster defaultSlideMaster = samplePPT.getSlideMasters().get(0);
// Retrieving the slide layout
XSLFSlideLayout defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_ONLY);
// Creating the 1st slide
XSLFSlide sampleSlide1 = samplePPT.createSlide(defaultLayout);
XSLFTextShape sampleTitle = sampleSlide1.getPlaceholder(0);
// Clearing text to remove the
// predefined one in the template
sampleTitle.clearText();
XSLFTextParagraph paragraph = sampleTitle.addNewTextParagraph();
XSLFTextRun r1 = paragraph.addNewTextRun();
r1.setText("GeeksforGeeks");
r1.setFontColor(new Color(78, 147, 89));
r1.setFontSize(48.);
// Add Image
ClassLoader classLoader = getClass().getClassLoader();
byte[] imageData = IOUtils.toByteArray(new FileInputStream(classLoader.getResource("gfglogo.png").getFile()));
XSLFPictureData pictureData = samplePPT.addPicture(imageData, PictureData.PictureType.PNG);
XSLFPictureShape picture = sampleSlide1.createPicture(pictureData);
picture.setAnchor(new Rectangle(320, 230, 100, 92));
// Creating 2nd slide
defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
XSLFSlide sampleSlide2 = samplePPT.createSlide(defaultLayout);
// setting the tile
sampleTitle = sampleSlide2.getPlaceholder(0);
sampleTitle.clearText();
XSLFTextRun r = sampleTitle.addNewTextParagraph().addNewTextRun();
r.setText("GeeksforGeeks");
// Adding the link
XSLFHyperlink hyperLink = r.createHyperlink();
hyperLink.setAddress("https://www.geeksforgeeks.org/");
// setting the content
XSLFTextShape content = sampleSlide2.getPlaceholder(1);
content.clearText(); // unset any existing text
content.addNewTextParagraph().addNewTextRun().setText("First paragraph");
content.addNewTextParagraph().addNewTextRun().setText("Second paragraph");
content.addNewTextParagraph().addNewTextRun().setText("Third paragraph");
// Creating 3rd slide - List
defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
XSLFSlide sampleSlide3 = samplePPT.createSlide(defaultLayout);
sampleTitle = sampleSlide3.getPlaceholder(0);
sampleTitle.clearText();
r = sampleTitle.addNewTextParagraph().addNewTextRun();
r.setText("List creations");
content = sampleSlide3.getPlaceholder(1);
content.clearText();
XSLFTextParagraph paragraph1 = content.addNewTextParagraph();
paragraph1.setIndentLevel(0);
paragraph1.setBullet(true);
r1 = paragraph1.addNewTextRun();
r1.setText("Bullet creations");
// the next three paragraphs form an auto-numbered list
XSLFTextParagraph paragraph2 = content.addNewTextParagraph();
paragraph2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1);
paragraph2.setIndentLevel(1);
XSLFTextRun r2 = paragraph2.addNewTextRun();
r2.setText("Numbered List Item - 1");
// Creating 4th slide
XSLFSlide sampleSlide4 = samplePPT.createSlide();
creationOfTable(sampleSlide4);
// Save presentation
FileOutputStream outputStream = new FileOutputStream(fileLocation);
samplePPT.write(outputStream);
outputStream.close();
// Closing presentation
samplePPT.close();
}
/**
* Delete a slide from the presentation
*
* @param pptFile
* The presentation
* @param slideNumber
* The number of the slide to be deleted (0-based)
*/
public void deleteSlide(XMLSlideShow pptFile, int slideNumber) {
pptFile.removeSlide(slideNumber);
}
/**
* Re-order the slides inside a presentation
*
* @param pptFile
* The presentation
* @param slideNumber
* The number of the slide to move
* @param newSlideNumber
* The new position of the slide (0-base)
*/
public void reorderSlide(XMLSlideShow pptFile, int slideNumber, int newSlideNumber) {
List<XSLFSlide> slideList = pptFile.getSlides();
XSLFSlide secondSlide = slideList.get(slideNumber);
pptFile.setSlideOrder(secondSlide, newSlideNumber);
}
/**
* Retrieve the placeholder inside a slide
*
* @param slide
* The slide
* @return List of placeholder inside a slide
*/
public List<XSLFShape> retrieveTemplatePlaceholders(XSLFSlide slide) {
List<XSLFShape> placeholders = new ArrayList<>();
for (XSLFShape shape : slide.getShapes()) {
if (shape instanceof XSLFAutoShape) {
placeholders.add(shape);
}
}
return placeholders;
}
/**
* Create a table
*
* @param slide
* Slide
*/
private void creationOfTable(XSLFSlide slide) {
XSLFTable table = slide.createTable();
table.setAnchor(new Rectangle(50, 50, 450, 300));
int numColumns = 3;
int numRows = 5;
// header
XSLFTableRow headerRow = table.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("HeaderPart " + (i + 1));
r.setBold(true);
r.setFontColor(Color.white);
th.setFillColor(new Color(79, 129, 189));
th.setBorderWidth(TableCell.BorderEdge.bottom, 2.0);
th.setBorderColor(TableCell.BorderEdge.bottom, Color.white);
// all columns are equally sized
table.setColumnWidth(i, 150);
}
// data
for (int rownum = 0; rownum < numRows; rownum++) {
XSLFTableRow tr = table.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("Data " + (i * rownum + 1));
if (rownum % 2 == 0) {
cell.setFillColor(new Color(208, 216, 232));
} else {
cell.setFillColor(new Color(233, 247, 244));
}
}
}
}
}
We can able to get the presentation got created according to the code written and its contents are shown in the image below

We can test the same by means of the below test file as well
PowerPointIntegrationTest.java
import org.apache.poi.sl.usermodel.AutoNumberingScheme;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.sl.usermodel.TableCell;
import org.apache.poi.sl.usermodel.TextParagraph;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.SlideLayout;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFAutoShape;
import org.apache.poi.xslf.usermodel.XSLFHyperlink;
import org.apache.poi.xslf.usermodel.XSLFPictureData;
import org.apache.poi.xslf.usermodel.XSLFPictureShape;
import org.apache.poi.xslf.usermodel.XSLFShape;
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.XSLFTable;
import org.apache.poi.xslf.usermodel.XSLFTableCell;
import org.apache.poi.xslf.usermodel.XSLFTableRow;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;
import java.awt.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
// Helper class for the
// PowerPoint presentation creation
public class PowerPointHelper {
/**
* Read an existing presentation
*
* @param fileLocation
* File location of the presentation
* @return instance of {@link XMLSlideShow}
* @throws IOException
*/
public XMLSlideShow readWithExistingSlideShow(String fileLocation) throws IOException {
return new XMLSlideShow(new FileInputStream(fileLocation));
}
/**
* Create a sample presentation
*
* @param fileLocation
* File location of the presentation
* @throws IOException
*/
public void creatingAPresentation(String fileLocation) throws IOException {
// Create presentation
XMLSlideShow samplePPT = new XMLSlideShow();
XSLFSlideMaster defaultSlideMaster = samplePPT.getSlideMasters().get(0);
// Retrieving the slide layout
XSLFSlideLayout defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_ONLY);
// Creating the 1st slide
XSLFSlide sampleSlide1 = samplePPT.createSlide(defaultLayout);
XSLFTextShape sampleTitle = sampleSlide1.getPlaceholder(0);
// Clearing text to remove the
// predefined one in the template
sampleTitle.clearText();
XSLFTextParagraph paragraph = sampleTitle.addNewTextParagraph();
XSLFTextRun r1 = paragraph.addNewTextRun();
r1.setText("GeeksforGeeks");
r1.setFontColor(new Color(78, 147, 89));
r1.setFontSize(48.);
// Add Image
ClassLoader classLoader = getClass().getClassLoader();
byte[] imageData = IOUtils.toByteArray(new FileInputStream(classLoader.getResource("gfglogo.png").getFile()));
XSLFPictureData pictureData = samplePPT.addPicture(imageData, PictureData.PictureType.PNG);
XSLFPictureShape picture = sampleSlide1.createPicture(pictureData);
picture.setAnchor(new Rectangle(320, 230, 100, 92));
// Creating 2nd slide
defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
XSLFSlide sampleSlide2 = samplePPT.createSlide(defaultLayout);
// setting the tile
sampleTitle = sampleSlide2.getPlaceholder(0);
sampleTitle.clearText();
XSLFTextRun r = sampleTitle.addNewTextParagraph().addNewTextRun();
r.setText("GeeksforGeeks");
// Adding the link
XSLFHyperlink hyperLink = r.createHyperlink();
hyperLink.setAddress("https://www.geeksforgeeks.org/");
// setting the content
XSLFTextShape content = sampleSlide2.getPlaceholder(1);
content.clearText(); // unset any existing text
content.addNewTextParagraph().addNewTextRun().setText("First paragraph");
content.addNewTextParagraph().addNewTextRun().setText("Second paragraph");
content.addNewTextParagraph().addNewTextRun().setText("Third paragraph");
// Creating 3rd slide - List
defaultLayout = defaultSlideMaster.getLayout(SlideLayout.TITLE_AND_CONTENT);
XSLFSlide sampleSlide3 = samplePPT.createSlide(defaultLayout);
sampleTitle = sampleSlide3.getPlaceholder(0);
sampleTitle.clearText();
r = sampleTitle.addNewTextParagraph().addNewTextRun();
r.setText("List creations");
content = sampleSlide3.getPlaceholder(1);
content.clearText();
XSLFTextParagraph paragraph1 = content.addNewTextParagraph();
paragraph1.setIndentLevel(0);
paragraph1.setBullet(true);
r1 = paragraph1.addNewTextRun();
r1.setText("Bullet creations");
// the next three paragraphs form an auto-numbered list
XSLFTextParagraph paragraph2 = content.addNewTextParagraph();
paragraph2.setBulletAutoNumber(AutoNumberingScheme.alphaLcParenRight, 1);
paragraph2.setIndentLevel(1);
XSLFTextRun r2 = paragraph2.addNewTextRun();
r2.setText("Numbered List Item - 1");
// Creating 4th slide
XSLFSlide sampleSlide4 = samplePPT.createSlide();
creationOfTable(sampleSlide4);
// Save presentation
FileOutputStream outputStream = new FileOutputStream(fileLocation);
samplePPT.write(outputStream);
outputStream.close();
// Closing presentation
samplePPT.close();
}
/**
* Delete a slide from the presentation
*
* @param pptFile
* The presentation
* @param slideNumber
* The number of the slide to be deleted (0-based)
*/
public void deleteSlide(XMLSlideShow pptFile, int slideNumber) {
pptFile.removeSlide(slideNumber);
}
/**
* Re-order the slides inside a presentation
*
* @param pptFile
* The presentation
* @param slideNumber
* The number of the slide to move
* @param newSlideNumber
* The new position of the slide (0-base)
*/
public void reorderSlide(XMLSlideShow pptFile, int slideNumber, int newSlideNumber) {
List<XSLFSlide> slideList = pptFile.getSlides();
XSLFSlide secondSlide = slideList.get(slideNumber);
pptFile.setSlideOrder(secondSlide, newSlideNumber);
}
/**
* Retrieve the placeholder inside a slide
*
* @param slide
* The slide
* @return List of placeholder inside a slide
*/
public List<XSLFShape> retrieveTemplatePlaceholders(XSLFSlide slide) {
List<XSLFShape> placeholders = new ArrayList<>();
for (XSLFShape shape : slide.getShapes()) {
if (shape instanceof XSLFAutoShape) {
placeholders.add(shape);
}
}
return placeholders;
}
/**
* Create a table
*
* @param slide
* Slide
*/
private void creationOfTable(XSLFSlide slide) {
XSLFTable table = slide.createTable();
table.setAnchor(new Rectangle(50, 50, 450, 300));
int numColumns = 3;
int numRows = 5;
// header
XSLFTableRow headerRow = table.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("HeaderPart " + (i + 1));
r.setBold(true);
r.setFontColor(Color.white);
th.setFillColor(new Color(79, 129, 189));
th.setBorderWidth(TableCell.BorderEdge.bottom, 2.0);
th.setBorderColor(TableCell.BorderEdge.bottom, Color.white);
// all columns are equally sized
table.setColumnWidth(i, 150);
}
// data
for (int rownum = 0; rownum < numRows; rownum++) {
XSLFTableRow tr = table.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("Data " + (i * rownum + 1));
if (rownum % 2 == 0) {
cell.setFillColor(new Color(208, 216, 232));
} else {
cell.setFillColor(new Color(233, 247, 244));
}
}
}
}
}
Output of JUnit:

Explanation : The code uses XMLSlideShow to create a PowerPoint presentation and adds slides using predefined layouts like title and content. It inserts text and images using text shapes and picture APIs, and also supports creating lists and tables for structured content. Finally, the presentation is saved to a file using FileOutputStream.