2023年12月7日发(作者:)
ApachePOI操作pptx基本使用
最近有一个ppt操作的需求,因此查了下相关的资料
ppt分类
(1)2007版之前的
是基于二进制的文件格式
细节没有完全公开,第三方厂商多是用单向工程方法猜测和分析出来的。WPS做得好一些,但开源的只有做得很差的
LibreOffice(原OpenOffice)
(2)2007版以后的
是基于OOXML开放文档规范的,本质是一个ZIP包,压缩了XML文档和相关资源。
OOXML是是一种简洁、可靠的文件格式,这类格式可以更好地实现文档与后端系统之间的数据集成。
java工具
(1)Apache POI
是Apache软件基金会的开放源码函式库,POI提供API给Java程序
(2)
是一款处理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 使用
2.修改
CLASSPATH
解压下载的包,
将下面5个jar的完整路径添加到CLASSPATH
4.介绍
在POI API中
PowerPoint PPT——格式为 HSLF 对应
poi-scratchpad
PowerPoint PPTX 格式为 XSLF 对应
poi-ooxml
类型
Powerpoint '97(-2007)PPT
PowerPoint 2007 PPTX
格式
HSLF
XSLF
对应的包
3使用
下面是基于pptx的
(1)生成空白文档
import deShow;
import ;
import tputStream;
import ption;
public class DealDocument {
protected String path = "data";
/**
* 创建文档
*
* @param name
*/
public void createDocument(String name) {
XMLSlideShow ppt = new XMLSlideShow();
String fileName = + tor + name;
File file = new File(fileName);
try {
FileOutputStream out = new FileOutputStream(file);
(out);
n("Presentation created successfully");
();
} catch (IOException e) {
tackTrace();
}
}
}
port .*;
import ;
import ;
import .*;
public class Main {
public static void main(String[] args) throws IOException{
n("Hello World!");
DealDocument dd = new DealDocument();
Document("");
}
}
输出
Hello World!
Presentation created successfully
并且在项目根目录的data下生成
说明:
如果出现错误
Exception in thread "main" atibleClassChangeError: Found class ger, but interface was expected
这个错误最可能的原因是poi的jar包使用了多个版本
使用下面的方法可以查看具体使用的哪里的jar包
(在网上找的,但是版本不同,第三段 ssLoader()没有找到相关的类,将poi-
反编译,找了个存在的类,版本是4.1.0)
ClassLoader classloader = ssLoader();
URL res = ource("org/apache/poi/poifs/filesystem/");
String path = h();
n("POI Core came from " + path);
classloader = ssLoader();
res = ource("org/apache/poi/");
path = h();
n("POI OOXML came from " + path);
classloader=ssLoader();
res = ource("org/apache/poi/hdgf/");
path = h();
n("POI Scratchpad came from " + path);
输出
POI Core came from file:/C:/Program%20Files/Java/jdk1.8.0_151/jre/lib/ext/!/org/apache/poi/poifs/filesystem/
POI OOXML came from file:/C:/Program%20Files/Java/jdk1.8.0_151/jre/lib/ext/!/org/apache/poi/
POI Scratchpad came from file:/E:/java/project/ppt/ppttest/lib/!/org/apache/poi/hdgf/
发现确实有一个class走了老包,想起了在对mpp文件进行读写时添加了,因此把相关文件删掉,问题解决
(2)在已有文档添加空白页
在 里
在文件 data/,追加两个空白页
public void addNewSlide(String name){
String fileName = + tor + 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= Slide();
XSLFSlide slide2 = Slide();
//saving the changes
FileOutputStream out = new FileOutputStream(file);
(out);
n("Presentation edited successfully");
();
}catch (IOException e) {
tackTrace();
}
}
在mian里的使用
DealDocument dd = new DealDocument();
Slide("");
执行完后,输出
Hello World!
Presentation edited successfully
文件里多了两个空白页
(3)将PPT中幻灯片转成图片
import del.*;
import .*;
import gle2D;
import edImage;
import ;
import putStream;
import tputStream;
public class ImageConvert {
public void converter(String fileName) {
BackRS rs = new BackRS();
File file = new File(fileName);
String name = e();
String filePath = ent();
try {
FileInputStream in = new FileInputStream(file);
XMLSlideShow ppt = new XMLSlideShow(in);
Dimension pgsize = eSize();
String saveImagePathName = filePath + tor + getFileNameNoEx(name)+"_JPG";
File path = new File(saveImagePathName);
if (!()) {
();
}
Integer i = 0;
BufferedImage img =null;
for (XSLFSlide slide : des()) {
//解决乱码问题
for(XSLFShape shape : pes()){
if(shape instanceof XSLFTextShape) {
XSLFTextShape tsh = (XSLFTextShape)shape;
for(XSLFTextParagraph p : tsh){
for(XSLFTextRun r : p){
tFamily("宋体"); tFamily("宋体");
}
}
}
}
img = new BufferedImage(, , _INT_RGB);
Graphics2D graphics = Graphics();
nt();
(new (0, 0, , ));
(graphics);
FileOutputStream out = new FileOutputStream(path + tor + (i+1) + ".JPG");
i++;
(img, "PNG", out);
();
}
n("Image successfully converted.");
} catch (Exception e) {
n("error:"+sage());
}
}
/**
* 获取文件名,去除扩展名的
*/
public String getFileNameNoEx(String filename) {
if ((filename != null) && (() > 0)) {
int dot = dexOf('.');
if ((dot > -1) && (dot < (()))) {
return ing(0, dot);
}
}
return filename;
}
}
fileName为完整的路径
图片生成的目录为,和ppt文件同一个目录下,目录名为:ppt文件名+_JPG
图片名为, (幻灯片从0开始编号,因此图片名为……)
说明:
虽然对乱码问题做了处理,但是还会出现乱码,而且Apache POI是开源的,创始人离开后版本更新没有推进
可以改用 for java


发布评论