JAVA通过COM接口操作PPT
来源:互联网 发布:淘宝的大刀和鑫鑫 编辑:程序博客网 时间:2024/06/09 16:40
一、 背景说明
在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);; }}
0 0
- JAVA通过COM接口操作PPT
- C++通过COM接口操作PPT
- VS下 MFC通过COM操作PPT
- MFC通过com接口操作Excel
- java调用 COM接口基本配置操作
- 通过 JACOB 实现 Java 与 COM 组件的互操作
- java poi ppt操作示例
- Java 利用POI操作PPT
- 通过对COM接口IPicture的安全封装来实现对多种常见图像格式的操作
- 如何通过COM 接口传送C++对象
- C# Com接口(通过 CreateObject 引用)
- 【ahk】通过COM技术操作word文件
- PHP通过COM操作EXCEL,的问题
- C#中COM操作(二)---接口查询
- C#中COM操作(二)---接口查询
- VC利用COM接口操作Word总结
- Java通过poi读取word,excel,ppt文件中文本(excel,ppt部分)
- java 通过接口抓取数据
- 01_05 数据获取和清理概览
- 浅谈扩展欧几里得算法
- Linxu网络测试命令
- SQL三个表连接查询
- HDU 1710 二叉树的遍历
- JAVA通过COM接口操作PPT
- [软件人生]一个个人规划
- 【leetcode】Happy Number
- Java中单实例的设计
- Java线程:概念与原理
- STM32 CAN通信 滤波器配置总结
- 国内四大cms网站管理系统的优缺点比较
- 从DFA角度理解KMP算法
- 十大CMS系统介绍