Apache POI PPT - PowerPoint 转 Java

应用程序经常需要生成具有Microsoft Office ppt 或 pptx 格式的报告,就像它需要编辑和读取 Power Point 文件一样。想要生成 MS Office 文件的 Java 程序员必须使用 Java 库,其中包括以其效率而闻名的 Apache 库.

Apache POI 是一个 API,允许您创建、修改和显示 MS Office 文件。这个开源书店是由 Apache Software Foundation.

本教程适用于那些需要使用 Java 阅读、创建和编辑 Power Point 文件的人。它解释了 Apache POI 库的基本功能及其能够对 Power Point 文件执行操作的基本功能。

下载并安装 Apache POI PPT

从官网下载最新版本的 Apache POI (下载 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:若要创建和管理演示文稿,请在 org.apache.poi.xslf.usermoder.
  • XSLFSlide 中具有以下 XMLSlideShow 类:创建和管理演示文稿中的幻灯片。
  • XSLFSlideMaster:用于包含不同幻灯片布局的演示文稿。XSLFSlideMaster 类提供对这些布局的访问。
  • XSLFSlideLayout:允许您管理幻灯片的布局。
  • XSLFTextParagraph:可以使用 XSLFTextParagraph.
  • XSLFTextRun 类在幻灯片中编写文本:此类处理文本的格式(超链接、 colors, fonts, etc.).
  • XSLFTextShape:此类处理包含 text.
  • XSLFHyperlink:允许您在演示文稿中创建超链接。

创建一个空的 Power Point 演示文稿

现在,让我们看看如何使用 Java 创建演示文稿。要创建一个空的演示文稿,您需要实例化 XMLSlideShow 类:

XMLSlideShow ppt = new XMLSlideShow();
使用 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[]) throws IOException{

//创建一个新的空 Slide Show
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(file);
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[]) throws IOException{

//打开现有的powerpoint file
File file = new File(exemple.pptx”);
FileInputStream inputstream=new FileInputStream(file);
XMLSlideShow ppt = new XMLSlideShow(inputstream);

//将幻灯片添加到演示文稿中
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[]) throws 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());
}
}
}
}
输出:

可用布局
空白
TITLE_ONLY
SECTION_HEADER
PIC_TX
TITLE_AND_CONTENT
TITLE
VERT_TX
VERT_TITLE_AND_TX
TWO_TX_TWO_OBJ
TWO_OBJ
OBJ_TX
下图显示了 MS Office 2007 中的一些可用布局:


创建使用 Title layout 的幻灯片

让我们创建一个使用 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- 使用 XSLFSlide 类的 getPlaceholder() 方法选择占位符。此方法接受整数参数。传递值 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[]) throws 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);

//编辑标题
title.setText(JavaCoder”);

//新建pptx File file=new File(Exemple.pptx”);
FileOutputStream fos = new FileOutputStream(file);

//保存更改
ppt.write(fos);
System.out.println(幻灯片创建成功”);
fos.close();
}
}
输出:

slide created successfully

更改 layout 的标题和内容

让我们按照以下步骤使用标题和布局创建幻灯片:

1- 通过实例化类创建一个空演示文稿 XMLSlideShow.
2- 使用以下方法获取所有幻灯片母版的列表 getSlideMasters()
3- 使用以下方法获取所需的布局 getLayout() 班级 XSLFSlideMaster
4- 通过将布局对象作为 parameter:

XSLFSlide slide = ppt.createSlide(SlideLayout.TITLE_AND_CONTENT) 来创建新幻灯片;
5- 使用 getPlaceholder():

XSLFTextShape title = slide.getPlaceholder(1);
title1.setText(简介”);
6 - 通过调用 XSLFTextShape 类的 clearText() 方法清除幻灯片文本。

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[]) throws 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);

//编辑标题
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();
}
}
输出:

slide created successfully

获取和更改幻灯片大小

幻灯片的大小是使用 XMLSlideShow.

java.awt.Dimension pgsize = ppt.getPageSize() 的 getPageSize() 方法获取的;
要在 java 中更改幻灯片大小,请使用 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[]) throws IOException{

File file = new File(Exemple.pptx”);
XMLSlideShow ppt = 新的 XMLSlideShow();

//获取当前维度
维度 pptsize = ppt.getPageSize();

System.out.println(当前幻灯片尺寸:”);
System.out.println(width:” + pptsize.width);
System.out.println(height:” + pptsize.height);

//更改维度
ppt.setPageSize(new java.awt.Dimension(1024,400));

FileOutputStream out = new FileOutputStream(file);
ppt.write(out);
System.out.println(幻灯片尺寸已更改”);
out.close();
}
}
输出:

当前幻灯片尺寸:
宽度:720
高度:540
幻灯片尺寸已更改
更改尺寸后幻灯片如下所示:

更改幻灯片顺序

您可以使用 setSlideOrder() 方法更改顺序。使用 getSlides() 方法检索所有幻灯片,然后从幻灯片表中进行选择,并使用 setSlideOrder() 方法更改顺序:

//select the third slide
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();

//选择第三张幻灯片
XSLFSlide selectesdslide = slides.get(2);

//把它放在第一位
ppt.setSlideOrder(selectesdslide, 0);

FileOutputStream fos = new FileOutputStream(file);
ppt.write(fos);
fos.close();
}
}
幻灯片 1 和 3 之间交换前后的显示:

Front
After

删除幻灯片

您可以通过调用 removeSlide() 方法删除幻灯片。此方法接受一个整数,该整数表示要删除的幻灯片的位置。

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

//删除位置 0
ppt.removeSlide(0) 的幻灯片;
.
.
.
如果我们将此删除操作应用于上面包含三张幻灯片(1、2 和 3)的示例,我们将得到以下输出:

Add Image

可以使用 XSLFSlide 类的 createPicture() 方法将图像添加到演示文稿中。createPicture() 方法接受字节数组或字节数组格式的图像。

您必须读取要添加的图像的文件,并使用 IOUtils.toByteArray() 方法将其转换为字节数组。

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

//将图像转换为字节数组
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;

导入org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
导入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[]) throws IOException{

XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide 幻灯片 = ppt.createSlide();

//读取图像
文件 image=new File(logo.png”);

//将图像转换为字节
byte[] picture = IOUtils.toByteArray(new FileInputStream(image));

//将图片添加到演示文稿
PictureData picdata = ppt.addPicture(picture, PictureData.PictureType.PNG);

//为此添加的 image
XSLFPictureShape pic = slide.createPicture(picdata);

文件 file=new File(diapoimage.pptx”);
FileOutputStream fos = new FileOutputStream(file);

ppt.write(fos);
System.out.println(图像添加!
fos.close();
}
}
文件在创建后以这种方式显示:

格式化 Text

可以使用 XSLFTextRun 类的方法设置演示文稿中的文本的格式。为此,您需要创建一个 XSLFTextRun 对象,如下所示:

//创建带有标题和内容的幻灯片
XSLFSlide slide = ppt.createSlide(slidelayout);

//select 占位符 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);

//将文本更改为斜体
run.setItalic(true)

//在文本中间画一条线
run.setStrikethrough(true);

//下划线 text
run.setUnderline(true);
要在段落之间留出空格,请从 XSLFTextParagraph:

paragraph.addLineBreak() 添加 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;
导入 org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;

public class TextFormatting {

public static void main(String args[]) throws 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);

//渲染文本 Italic
run3.setItalic(true);

//删除线
run3.setStrikethrough(true);
paragraph.addLineBreak();

//行 4

XSLFTextRun run4 = paragraph.addNewTextRun();
run4.setText(下划线”);
run4.setUnderline(true);

//下划线 text
paragraph.addLineBreak();

//创建文件对象
File file=new File(TextFormat.pptx”);
FileOutputStream out = new FileOutputStream(file);

//保存更改
ppt.write(out);
out.close();
}
}
Execution: