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