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