JAVA通过COM接口操作PPT
一、 背景说明
在Eclipse环境下,开发JAVA代码操作PPT,支持对PPT模板的修改。包括修改文本标签、图表、表格。满足大多数软件生成PPT报告的要求,即先收工创建好模板,在程序中修改模板数据。
二、 开发环境搭建
下载jacob开源组件,解压后把jacob.jar添加到项目中。拷贝对应的dll文件到Path路径下。32位系统采用X86的dll, 64位系统采用X64的dll。
三、 实现合并PPT公共函数
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/**
* 通过jacob组件调用COM接口完成PPT文件的合并。合并后图表数据不丢失,用户可正常手工修改。
* 调用函数前将jacob.jar添加到项目中,同时将jcaob.dll拷贝到path路径下。
* @author Elon
*
*/
public class MergePPT
{
/**
* 合并多个PPT文件。要求输出文件和合并文件均已存在,不创建新文件。
* @param outPutPPTPath 合并后输出的文件路径。
* @param mergePPTPathList 依次追加合并的文件。
*/
public synchronized static void merge(String outPutPPTPath, List<String> mergePPTPathList)
{
// 启动 office PowerPoint程序
ActiveXComponent pptApp = new ActiveXComponent("PowerPoint.Application");
Dispatch.put(pptApp, "Visible", new Variant(true));
Dispatch presentations = pptApp.getProperty("Presentations").toDispatch();
// 打开输出文件
Dispatch outputPresentation = Dispatch.call(presentations, "Open", outPutPPTPath, false,
false, true).toDispatch();
// 循环添加合并文件
for (String mergeFile : mergePPTPathList)
{
Dispatch mergePresentation = Dispatch.call(presentations, "Open", mergeFile, false,
false, true).toDispatch();
Dispatch mergeSildes = Dispatch.get(mergePresentation, "Slides").toDispatch();
@SuppressWarnings("deprecation")
int mergePageNum = Dispatch.get(mergeSildes, "Count").toInt();
// 关闭合并文件
Dispatch.call(mergePresentation, "Close");
Dispatch outputSlides = Dispatch.call(outputPresentation, "Slides").toDispatch();
@SuppressWarnings("deprecation")
int outputPageNum = Dispatch.get(outputSlides, "Count").toInt();
// 追加待合并文件内容到输出文件末尾
Dispatch.call(outputSlides, "InsertFromFile", mergeFile, outputPageNum, 1, mergePageNum);
}
// 保存输出文件,关闭退出PowerPonit.
Dispatch.call(outputPresentation, "Save");
Dispatch.call(outputPresentation, "Close");
Dispatch.call(pptApp, "Quit");
}
}
四、 修改PPT中的文本、图表公共函数
/**
* 柱状图、饼图值类型
* @author Elon
*
*/
public class GraphValue implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 4055958383254660746L;
/**
* 系列名称
*/
private String serialName = "";
/**
* 系列的值
*/
private ArrayList<String> valueList = new ArrayList<String>();
public String getSerialName()
{
return serialName;
}
public void setSerialName(String serialName)
{
this.serialName = serialName;
}
public ArrayList<String> getValueList()
{
return valueList;
}
public void setValueList(ArrayList<String> valueList)
{
this.valueList = valueList;
}
@Override
public String toString()
{
String str = "serialName:" + serialName + " valueList:";
for (String value : valueList)
{
str += value + ";";
}
return str;
}
}
/**
*
* 修改PPT图表、文本信息公共类定义。
*
* @author Elon
* @version 1.0, 2015年12月16日
*/
public class WritePPTUtil
{
/**
* PPT文件路径
*/
public String pptPath = "";
/**
* ppt对象
*/
private XMLSlideShow ppt = null;
/**
* 当前页签
*/
private XSLFSlide curSlide = null;
/**
* 打开ppt文件
* @param pptPath ppt文件路径
* @throws XmlException
* @throws OpenXML4JException
* @throws IOException 异常
*/
public void open(String pptPath) throws OpenXML4JException, IOException, XmlException
{
this.pptPath = pptPath;
XSLFSlideShow slideShow = new XSLFSlideShow(pptPath);
ppt = new XMLSlideShow(slideShow.getPackage());
}
/**
* 保存关闭文件
* @throws IOException
*/
public void close() throws IOException
{
FileOutputStream out = new FileOutputStream(pptPath + "_new.pptx");
ppt.write(out);
out.close();
}
/**
* 选中指定的PPT页签
* @param slideIndex 页签索引
* @return true:操作成功;false:操作失败
*/
public boolean selectSlide(int slideIndex)
{
if(ppt == null)
{
return false;
}
XSLFSlide[] slideArray = ppt.getSlides();
if(slideArray.length < slideIndex)
{
return false;
}
curSlide = slideArray[slideIndex];
return true;
}
/**
* 修改文本框内容
* @param shapeValue
* @param value
* @return
*/
public boolean modifyTextBox(String shapeValue, String value)
{
XSLFShape shape = getShape(shapeValue, ShapeType.TEXT_BOX_TYPE);
if (shape == null)
{
return false;
}
XSLFTextBox textBox = (XSLFTextBox)shape;
textBox.setText(value);
return true;
}
/**
*
* 修改图表内容。
*
* @param ShapeName 图表名称
* @param valueList
* @return
*/
public boolean modifyBargraph(String ShapeName, ArrayList<GraphValue> valueList)
{
XSLFShape shape = getShape("", ShapeType.GRAPHIC_TYPE);
XSLFGraphicFrame graphicShape = (XSLFGraphicFrame)shape;
XSLFSheet sheet = graphicShape.getSheet();
// 修改PPT图表内嵌的sheet的内容(待续)。
return true;
}
/**
* 获取PPT页签中指定的控件。
* @param shapeValue
* @param shapeType
* @return
*/
private XSLFShape getShape(String shapeValue, ShapeType shapeType)
{
if(curSlide == null)
{
return null;
}
String shapeName = "";
XSLFShape[] shapeArray = curSlide.getShapes();
for (int i = 0; i < shapeArray.length; ++i)
{
shapeName = shapeArray[i].getShapeName();
XSLFShape shape = shapeArray[i];
if ((shapeType == ShapeType.TEXT_BOX_TYPE)
&& (shape instanceof XSLFTextBox))
{
XSLFTextBox textBox = (XSLFTextBox)shape;
String value = textBox.getText();
if(value.equals(shapeValue))
{
return shapeArray[i];
}
}
else if ((shapeType == ShapeType.GRAPHIC_TYPE)
&& (shape instanceof XSLFGraphicFrame))
{
return shape;
}
}
return null;
}
}
五、 调用PPT合并函数测试代码
public class TestPPTMain
{
public static void main(String[] args) throws OpenXML4JException, IOException, XmlException
{
String outPutPPTPath = "D:\\TEMP\\template\\1.pptx";
List<String> mergePPTPathList = new ArrayList<String>();
mergePPTPathList.add("D:\\TEMP\\template\\2.pptx");
mergePPTPathList.add("D:\\TEMP\\template\\3.pptx");
MergePPT.merge(outPutPPTPath, mergePPTPathList);;
}
}
JAVA通过COM接口操作PPT的更多相关文章
- C++通过COM接口操作PPT
一. 背景 在VS环境下,开发C++代码操作PPT,支持对PPT模板的修改.包括修改文本标签.图表.表格.满足大多数软件生成PPT报告的要求,先手工创建好PPT模板,在程序中修改模板数据. 二. 开发 ...
- Java使用Unsafe接口操作数组Demo
public class unSafeArrayDemo { private static final sun.misc.Unsafe UNSAFE; private static final lon ...
- Java NIO Path接口和Files类配合操作文件
Java NIO Path接口和Files类配合操作文件 @author ixenos Path接口 1.Path表示的是一个目录名序列,其后还可以跟着一个文件名,路径中第一个部件是根部件时就是绝对路 ...
- java poi 操作ppt
java poi 操作ppt 可以参考: https://www.w3cschool.cn/apache_poi_ppt/apache_poi_ppt_installation.html http:/ ...
- java抽象类和接口区别
深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...
- 如何让Java和C++接口互相调用:JNI使用指南
如何让Java和C++接口互相调用:JNI使用指南 转自:http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos ...
- Java中的队列:java.util.Queue接口
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作. Queue接口与List.Set同一级别,都是继承了Collection接口.Linked ...
- Java集合Map接口与Map.Entry学习
Java集合Map接口与Map.Entry学习 Map接口不是Collection接口的继承.Map接口用于维护键/值对(key/value pairs).该接口描述了从不重复的键到值的映射. (1) ...
- java的List接口的实现类 ArrayList,LinkedList,Vector 的区别
Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...
随机推荐
- 洛谷P1896 [SCOI2005]互不侵犯King【状压DP】
题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ...
- fiddler 抓取 nodejs
nodejs 代理指向 fiddler var options = { ........ }; options.path = 'http://' + options.host + ...
- 【echarts3】--1 简单入门
echarts3 相信大家都了解吧,是百度研发的 ECharts 特性介绍 ECharts,一个纯 Javascript 的图表库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8 ...
- golang 实现简单的一致性哈希
package main import ( "fmt" "sort" "hash/crc32" ) var serverMap map[ui ...
- centos7 yum与Python3冲突
虽然标题不严谨,但是,我自己尝试了多次,在安装了Python3.6后,yum无法同步Python.所以采用网上抄来抄去的做法,将yum指定使用Python2,凡是需要安装与Python相关的模块,使用 ...
- web3 - BOM&DOM
一.BOM (浏览器对象模型) 浏览器对象模型 (BOM) 使 JavaScript 有能力与浏览器"对话". Window 对象 1.window.onresize // 1 w ...
- C语言_结构体的4种定义初始化方式及案例
结构体是一种构造数据类型 (构造数据类型:数组类型.结构体类型(struct).共用体类型(union)).用途:把不同类型的数据组合成一个整体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一 ...
- Linux下yum安装MysqL数据库
1.命令安装mysql # yum install mysql mysql-server mysql-devel -y 最后提示 Complete! 表示安装成功 2.查看是否生成了mysqld服务 ...
- windows转mac-开发环境搭建(一):需要搭建的环境及安装的工具
作为一个java后端开发者来说,随着项目的增加,前段时间用windows真是受尽折磨,电脑卡到不行,在我们开发部技术大佬的一再安利之下,狠下心选了个17年13寸带touch bar的MacBook P ...
- Python 练习册,每天一个小程序----第0000题
题目 第 0000 题: 将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果. 类似于图中效果 Code: from PIL import Image,Imag ...