Apache POI 创建MS PowerPoint 文件
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. 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("Blogdemo");
r.setFontColor(Color.green);
r.setFontSize(24.);
配置XSLFTextRun时,可以通过选择字体系列以及文本是否应为粗体、斜体或下划线来自定义其样式。
4.2. 超链接
在演示文稿中添加文本时,有时添加超链接会很有用。
一旦我们创建了XSLFTextRun对象,我们现在可以添加一个链接:
XSLFHyperlink link = r.createHyperlink();
link.setAddress("http://www.blogdemo.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");
如果我们使用多个列表,定义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);