JAVA通过COM接口操作PPT
2015-12-17 00:02
344 查看
一、 背景说明
在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);; } }
相关文章推荐
- SpringMVC ------ 重定向
- struts2 中 JAVA 代码 获取表单中的数据
- javaWeb通过POST来下载文件
- Java Socket编程
- 深入理解Java的接口和抽象类
- Spring中Quartz定时器
- ECharts Java 动态加载数据,echartsjava
- 国内:如何解决Maven和SBT下载Jar包太慢
- Spring MVC 启用@MatrixVariable
- Java日志相关记录 (Jul jcl log4j log4j2 Logback SLF4J)
- 【LeetCode】268 Missing Number (java实现)
- 【LeetCode】141 Linked List Cycle (java实现)
- Eclipse 增加打开文件路径功能
- Eclipse中开启java的assert选项
- 【LeetCode】292 Nim Games (java实现)
- java容器源码分析(四)——HashMap
- java容器源码分析(五)——HashMap(续)
- java容器源码分析(六)——HashSet
- java IO流-学习整理汇总
- java容器学习