使用Java创建MS PowerPoint演示文稿

2025/04/12

1. 简介

在本文中,我们将了解如何使用Apache POI创建演示文稿。

这个库使我们能够创建PowerPoint演示文稿、读取现有演示文稿并更改其内容。

2. Maven依赖

首先,我们需要在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.5</version>
</dependency>

两个库的最新版本都可以从Maven Central下载。

3. Apache POI

Apache POI库支持.ppt和.pptx文件,并为Powerpoint’97(-2007)文件格式提供HSLF实现,为PowerPoint 2007 OOXML文件格式提供XSLF实现。

由于这两种实现不存在通用接口,因此我们必须记住在使用较新的.pptx文件格式时使用XMLSlideShow、XSLFSlide和XSLFTextShape类

而且,当需要使用较旧的.ppt格式时,请使用HSLFSlideShow、HSLFSlide和HSLFTextParagraph类。

我们将在示例中使用新的.pptx文件格式,我们要做的第一件事是创建一个新的演示文稿,向其中添加幻灯片(可能使用预定义的布局)并保存它。

一旦这些操作明确了,我们就可以开始处理图像、文本和表格。

3.1 创建新演示文稿

让我们首先创建新的演示文稿:

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

3.2 添加新幻灯片

在向演示文稿中添加新幻灯片时,我们也可以选择从预定义的布局创建它。为此,我们首先必须检索包含布局的XSLFSlideMaster(第一个是默认母版):

XSLFSlideMaster defaultMaster = ppt.getSlideMasters().get(0);

现在,我们可以检索XSLFSlideLayout并在创建新幻灯片时使用它:

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("Baeldung");
r.setFontColor(Color.green);
r.setFontSize(24.);

配置XSLFTextRun时,可以通过选择字体系列以及文本是否应为粗体、斜体或下划线来定制其样式。

4.2 超链接

向演示文稿添加文本时,添加超链接有时很有用。

一旦我们创建了XSLFTextRun对象,我们现在就可以添加一个链接:

XSLFHyperlink link = r.createHyperlink();
link.setAddress("http://www.tuyucheng.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接收一个矩形作为锚点,这允许我们使用前两个参数配置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");

如果我们处理多个列表,定义indentLevel以实现项目的正确缩进始终很重要。

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 读取演示文稿

读取演示文稿非常简单,可以使用接收FileInputStream的XMLSlideShow重载构造函数来完成:

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 删除幻灯片

还可以从演示文稿中删除幻灯片。

让我们看看如何删除第四张幻灯片:

ppt.removeSlide(3);

6. 总结

本快速教程从Java角度说明了如何使用Apache POI API读取和写入PowerPoint文件。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章