Apache POI操作pptx基本使用
最近有一个ppt操作的需求,因此查了下相关的资料
ppt分类
(1)2007版之前的
是基于二进制的文件格式
细节没有完全公开,第三方厂商多是用单向工程方法猜测和分析出来的。WPS做得好一些,但开源的只有做得很差的LibreOffice(原OpenOffice)
(2)2007版以后的
是基于OOXML开放文档规范的,本质是一个ZIP包,压缩了XML文档和相关资源。
OOXML是是一种简洁、可靠的文件格式,这类格式可以更好地实现文档与后端系统之间的数据集成。
java工具
(1)Apache POI
是Apache软件基金会的开放源码函式库,POI提供API给Java程序
(2)Aspose.Slides
是一款处理pptx的商业软件
(3)Jacob
Java-COM Bridge
在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。
MSWordManager 类,是jacob官方发布的工具类,里面有大多数Java操作MS Office的工具。
在使用Jacob时,很重要的一点是,用户本地系统中必须安装有Word的应用程序。否则也就无法建立Java-COM桥,进而无法解析了。
因此决定试水 Apache POI
Apache POI 使用
1.下载http://poi.apache.org/download
2.修改CLASSPATH
解压下载的包,将下面5个jar的完整路径添加到CLASSPATH

4.介绍
在POI API中
PowerPoint PPT——格式为 HSLF 对应poi-scratchpad
PowerPoint PPTX 格式为 XSLF 对应 poi-ooxml
| 类型 | 格式 | 对应的包 |
| Powerpoint '97(-2007)PPT | HSLF | poi-scratchpad-XXX.jar |
| PowerPoint 2007 PPTX | XSLF | poi-ooxml-XXX.jar |
3使用
下面是基于pptx的
(1)生成空白文档
DealDocument.java
import org.apache.poi.xslf.usermodel.XMLSlideShow; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; public class DealDocument { protected String path = "data";
/**
* 创建文档
*
* @param name
*/
public void createDocument(String name) { XMLSlideShow ppt = new XMLSlideShow();
String fileName = this.path + File.separator + name;
File file = new File(fileName);
try {
FileOutputStream out = new FileOutputStream(file);
ppt.write(out);
System.out.println("Presentation created successfully");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Main.java
import java.io.*;
import java.net.URL;
import java.util.List;
import org.apache.poi.*;
public class Main { public static void main(String[] args) throws IOException{
System.out.println("Hello World!");
DealDocument dd = new DealDocument();
dd.createDocument("example1.pptx");
}
}
输出
Hello World!
Presentation created successfully
并且在项目根目录的data下生成example1.pptx
说明:
如果出现错误
Exception in thread "main" java.lang.IncompatibleClassChangeError: Found class org.apache.poi.util.POILogger, but interface was expected
这个错误最可能的原因是poi的jar包使用了多个版本
使用下面的方法可以查看具体使用的哪里的jar包
(在网上找的,但是版本不同,第三段 org.apache.poi.hslf.HSLFSlideShow.class.getClassLoader()没有找到相关的类,将poi-scratchpad-4.1.0.jar反编译,找了个存在的类,版本是4.1.0)
ClassLoader classloader = org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
URL res = classloader.getResource("org/apache/poi/poifs/filesystem/POIFSFileSystem.class");
String path = res.getPath();
System.out.println("POI Core came from " + path); classloader = org.apache.poi.POIDocument.class.getClassLoader();
res = classloader.getResource("org/apache/poi/POIDocument.class");
path = res.getPath();
System.out.println("POI OOXML came from " + path); classloader=org.apache.poi.hdgf.HDGFDiagram.class.getClassLoader();
res = classloader.getResource("org/apache/poi/hdgf/HDGFDiagram.class");
path = res.getPath();
System.out.println("POI Scratchpad came from " + path);
输出
POI Core came from file:/C:/Program%20Files/Java/jdk1..0_151/jre/lib/ext/poi-3.17.jar!/org/apache/poi/poifs/filesystem/POIFSFileSystem.class
POI OOXML came from file:/C:/Program%20Files/Java/jdk1..0_151/jre/lib/ext/poi-3.17.jar!/org/apache/poi/POIDocument.class
POI Scratchpad came from file:/E:/java/project/ppt/ppttest/lib/poi-scratchpad-4.1..jar!/org/apache/poi/hdgf/HDGFDiagram.class
发现确实有一个class走了老包,想起了在对mpp文件进行读写时添加了poi-3.17.jar,因此把相关文件删掉,问题解决
(2)在已有文档添加空白页
在 DealDocument.java 里
在文件 data/tpl1.pptx,追加两个空白页

public void addNewSlide(String name){
String fileName = this.path + File.separator + name;
File file = new File(fileName);
try {
//opening an existing slide show
FileInputStream in = new FileInputStream(file);
XMLSlideShow ppt = new XMLSlideShow(in);
//adding slides to the slodeshow
XSLFSlide slide1= ppt.createSlide();
XSLFSlide slide2 = ppt.createSlide();
//saving the changes
FileOutputStream out = new FileOutputStream(file);
ppt.write(out);
System.out.println("Presentation edited successfully");
out.close();
}catch (IOException e) {
e.printStackTrace();
}
}
在mian里的使用
DealDocument dd = new DealDocument();
dd.addNewSlide("tpl1.pptx");
执行完后,输出
Hello World!
Presentation edited successfully

文件里多了两个空白页
(3)将PPT中幻灯片转成图片
import org.apache.poi.xslf.usermodel.*;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; public class ImageConvert { public void converter(String fileName) {
BackRS rs = new BackRS();
File file = new File(fileName);
String name = file.getName();
String filePath = file.getParent();
try {
FileInputStream in = new FileInputStream(file);
XMLSlideShow ppt = new XMLSlideShow(in);
Dimension pgsize = ppt.getPageSize();
String saveImagePathName = filePath + File.separator + getFileNameNoEx(name)+"_JPG";
File path = new File(saveImagePathName);
if (!path.exists()) {
path.mkdir();
}
Integer i = 0;
BufferedImage img =null;
for (XSLFSlide slide : ppt.getSlides()) {
//解决乱码问题
for(XSLFShape shape : slide.getShapes()){
if(shape instanceof XSLFTextShape) {
XSLFTextShape tsh = (XSLFTextShape)shape;
for(XSLFTextParagraph p : tsh){
for(XSLFTextRun r : p){
r.setFontFamily("宋体");
}
}
}
}
img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
graphics.setPaint(Color.white);
graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));
slide.draw(graphics);
FileOutputStream out = new FileOutputStream(path + File.separator + (i+1) + ".JPG");
i++;
javax.imageio.ImageIO.write(img, "PNG", out);
out.close();
}
System.out.println("Image successfully converted.");
} catch (Exception e) {
System.out.println("error:"+e.getMessage());
}
} /**
* 获取文件名,去除扩展名的
*/
public String getFileNameNoEx(String filename) {
if ((filename != null) && (filename.length() > 0)) {
int dot = filename.lastIndexOf('.');
if ((dot > -1) && (dot < (filename.length()))) {
return filename.substring(0, dot);
}
}
return filename;
}
}
fileName为完整的路径
图片生成的目录为,和ppt文件同一个目录下,目录名为:ppt文件名+_JPG
图片名为,N.JPG (幻灯片从0开始编号,因此图片名为1.JPG……)
说明:
虽然对乱码问题做了处理,但是还会出现乱码,而且Apache POI是开源的,创始人离开后版本更新没有推进
可以改用Aspose.Slide for java 查看
Apache POI操作pptx基本使用的更多相关文章
- 利用Apache POI操作Excel
最近在做接口,有个功能是利用Excel导入汽车发动机所需零件信息到线上系统中.简单回顾一下之前学过的用java操作Excel. 1.maven配置Apache POI pom.xml中配置POIjar ...
- 如何用Apache POI操作Excel文件-----如何对一个单元格加注解?
有的时候,我们需要通过操作Apache POI,在生成Cell数据的同时,能对其生成的Cell,加上注解(comments),类似于下面的. 那么对于这种情况,我们的代码应该如何写呢? 借花献佛,我就 ...
- java使用Apache POI操作excel文件
官方介绍 HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. XSSF is ...
- 关于 HSSF 和 XSSF 功能的开发者入门指南 (Apache POI 操作 Excel)
关于 HSSF 和 XSSF 功能的开发者入门指南 笔者深夜无眠,特此对本文翻译一部分,未完成部分待后续更新 本文源文地址 意欲使用 HSSF 和 XSSF 功能快熟读写电子表格?那本文就是为你而写的 ...
- apache POI 操作excel<导入导出>
1.首先导入maven依赖 <!-- POI核心依赖 --> <dependency> <groupId>org.apache.poi</groupId> ...
- Apache POI 操作Excel(2)-- POI包引入项目
Apache POI发行版包含对许多文档文件格式的支持.这种支持在几个Jar文件中提供.并非每种格式都需要所有jar.下表显示了POI组件.Maven存储库标记和项目的Jar文件之间的关系. (htt ...
- Apache POI 操作Excel(1)--POI简介
Apache POI(http://poi.apache.org/)是一个用于读取和编写Microsoft Office文件格式开源的Java项目,现在已经可以操作Excel,PowerPoint,W ...
- 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?
在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...
- 如何用Apache POI操作Excel文件-----如何用Apache POI 画一个离散图
有的时候,我们需要Excel中的数据,通过一个图画,可视化的表现出来. 那么这个时候,应该如何做呢?现在就借花献佛,以Apache POI自己提供的一个例子为例,给大家演示一下POI的API 如何画图 ...
随机推荐
- Deepgreen/Greenplum 删除节点步骤
Deepgreen/Greenplum删除节点步骤 Greenplum和Deepgreen官方都没有给出删除节点的方法和建议,但实际上,我们可以对节点进行删除.由于不确定性,删除节点极有可能导致其他的 ...
- learning java AWT widowEvent and MouseEvent
import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import jav ...
- Linux 命令集合之进程查看命令-软件安装命令-文件查找命令-主机修改命令
1.dpkg 的使用 dpkg -s ssh 查看是否按装了ssh软件 dpkg -L ssh 查看ssh安装的关联目录结构和安装位置 dpkg -i vim.deb 本地离线安装vim编辑器 apt ...
- shell 一次性杀掉相同名称的进程
这条命令将会杀掉所有含有关键字"LOCAL=NO"的进程 ps -ef|grep LOCAL=NO|grep -v grep|cut -c -|xargs kill - 另一种方法 ...
- Bootstrap select 多选并获取选中的值
代码: <!DOCTYPE html><html> <head> <meta charset="UTF-8"> < ...
- JS中注入eval, Function等系统函数截获动态代码
正文 现在很多网站都上了各种前端反爬手段,无论手段如何,最重要的是要把包含反爬手段的前端javascript代码加密隐藏起来,然后在运行时实时解密动态执行. 动态执行js代码无非两种方法,即eval和 ...
- 简单实用的PCM音频播放器--沉寂几年之后回归的第一份笔记
---恢复内容开始--- PCM音频网络流播放,至于用处,就不多解释了. 一个简单的类,基于NAudio,一个简单的拼装类,实例化时三个参数,依次是采样率,系统播放设备Index,播放声道,调用Pla ...
- Oracle导出/导入数据库的三种模式
导出 模式一:全量导出(慎用) exp 用户名/密码@数据库实例 owner=用户名 file=文件存储路径 log=日志存储路径 full=y 栗子:exp Mark/123456@151.2.*. ...
- MAC 上抓取网页数据的工具有哪些?
我希望能够从网页上, 比如气象局数据, 财经数据等等, 我看到官方提供的数据都比较混乱, 有的是一个php文件, 有的是一个文本, 有的干脆不提供数据, 我想问, Mac上, 用什么工具去抓数据, 以 ...
- 如何在团队中做好Code Review
一.Code Review的好处 想要做好Code Review,必须让参与的工程师充分认识到Code Review的好处 1.互相学习,彼此成就 无论是高手云集的架构师团队,还是以CURD为主的业务 ...