美文网首页
java 使用 jacob 控制 ppt 记录

java 使用 jacob 控制 ppt 记录

作者: 人形大叔 | 来源:发表于2018-07-02 15:06 被阅读0次
    首先结论 : 给现有 ppt 添加一页设置背景图片置底,修改文字颜色
    • 声明两个私有变量
        private ActiveXComponent ppt;
        private ActiveXComponent presentation;
    
    • 根据传入的 ppt 路径构建一个 ppt 对象
    /***
    *
    * Title: JacobPptUtil
    * Description: 构建ppt对象
    * @param filePath ppt路径
    * @param isVisble 是否可见
    */
    public JacobPptUtil(String filePath, boolean isVisble) throws Exception {
        if (null == filePath || "".equals(filePath)) {
            throw new Exception("文件路径为空!");
        }
        File file = new File(filePath);
        if (!file.exists()) {
            throw new Exception("文件不存在!");
        }
        ppt = new ActiveXComponent("PowerPoint.Application");
        //设置是否可见
        Dispatch.put(ppt, "Visible", isVisble);
        // 打开一个现有的 Presentation 对象
        ActiveXComponent presentations = ppt.getPropertyAsComponent("Presentations");
        presentation = presentations.invokeGetComponent("Open", new Variant(filePath), new Variant(true));
    }
    
    • 获取幻灯片对象
    Dispatch windows = presentation.getProperty("Windows").toDispatch();  
    Dispatch window = Dispatch.call(windows, "Item", new Variant(1)).toDispatch();  
    Dispatch selection = Dispatch.get(window, "Selection").toDispatch();  
    //获取幻灯片对象  
    ActiveXComponent slides = presentation.getPropertyAsComponent("Slides");  
    
    • 在之前添加一页
    /**
    * @param type
    * 2:标题+文本
    * 3:标题+左右对比文本
    * 4:标题+表格  
    * 5:标题+左文本右图表
    * 6:标题+左图表右文本
    * 7:标题+SmartArt图形
    * 8:标题+图表
    */
    private static Variant addPptPage(ActiveXComponent slides,int pptPage,int type)throws Exception{  
        return slides.invoke("Add", new Variant(pptPage), new Variant(type));  
    }
    
    • 给选中元素添加值 (每页幻灯片的元素在添加值的时候已经确定了

      例: 如果创建类型为 2,那么元素就只有标题文本

    /**
    * 在Selection对象上修改TEXT对象的值
    *
    * @param selectionObj
    * @param value
    * @throws Exception
    */
    public void addTextValue(Dispatch selectionObj, String value) throws Exception {
        Dispatch shapeRange = (Dispatch) Dispatch.get(selectionObj, "ShapeRange").getDispatch();
        Dispatch textFrame = (Dispatch) Dispatch.get(shapeRange, "TextFrame").getDispatch();
        Dispatch textRange = (Dispatch) Dispatch.get(textFrame, "TextRange").getDispatch();
        Dispatch.call(textRange, "Select");
        Dispatch.put(textRange, "Text", value);
    }
    
    • 修改文字颜色
    /***
    *
    * @Title: addTextCloc
    * @Description: 设置字体颜色
    * @param selectionObj
    * @param color
    * @throws Exception
    * void    返回类型
    * @throws
    */
    public void addTextColor(Dispatch selectionObj,String color) throws Exception {
        Dispatch shapeRange = (Dispatch) Dispatch.get(selectionObj, "ShapeRange").getDispatch();
        Dispatch textFrame = (Dispatch) Dispatch.get(shapeRange, "TextFrame").getDispatch();
        Dispatch textRange = (Dispatch) Dispatch.get(textFrame, "TextRange").getDispatch();
        Dispatch Font = (Dispatch) Dispatch.get(textRange, "Font").getDispatch();
        Dispatch Color = (Dispatch) Dispatch.get(Font, "Color").getDispatch();
        Dispatch.put(Color, "RGB",color);
    }
    
    • 添加背景图片
    //后面参数值依次是  left top whith  hight
    Dispatch picture = Dispatch.call(shapes, "AddPicture","图片路径", 1, 1, 1, 1).toDispatch();
    // 选中图片
    Dispatch.call(picture, "Select");
    //设置宽度高度
    //Dispatch.put(picture, "Width", new Variant(1920));
    //Dispatch.put(picture, "Height", new Variant(1200));
    //设置图片的层级关系
    Dispatch.call(picture,"ZOrder",1);
    

    总结

    • 有上面的代码可知
      修改字体颜色的代码是
    Dispatch shapeRange = (Dispatch) Dispatch.get(selectionObj, "ShapeRange").getDispatch();
    Dispatch textFrame = (Dispatch) Dispatch.get(shapeRange, "TextFrame").getDispatch();
    Dispatch textRange = (Dispatch) Dispatch.get(textFrame, "TextRange").getDispatch();
    Dispatch Font = (Dispatch) Dispatch.get(textRange, "Font").getDispatch();
    Dispatch Color = (Dispatch) Dispatch.get(Font, "Color").getDispatch();
    Dispatch.put(Color, "RGB",color);
    

    有 ShapeRange 对象得到 TextFrame,再由 TextFrame 得到 TextRange 对象再得到 Font 对象
    与之对应的ppt宏VBA代码是

    Sub Macro1()
    ' 宏由 User 记录,日期: 2018-7-2
    
        ActiveWindow.Selection.TextRange.Font.Color.SchemeColor = ppAccent3
    End Sub
    

    通过观察对比JAVAVBA代码得知(是的...不会 vba 全程用猜):

    ActiveWindow.Selection
    

    等同于

    (Dispatch) Dispatch.get(selectionObj, "ShapeRange").getDispatch()
    
    • &&&
    Selection.TextRange
    

    等同于

    Dispatch textRange = (Dispatch) Dispatch.get(textFrame, "TextRange").getDispatch();
    

    由观察得志,JACOBDispath 对象可以抽象理解为 VBA 的对象,而 Dispathget() 方法的意思是通过传入的第一个参数得到 VBA 意义上的和 get() 方法第二个字符串参数值匹配的 VBA 对象,那么知道这个之后大部分的 VBA 代码都是可以用 Dispath对象的get()方法翻译。


    后记

    综上所述~VBA 是可以翻译为 JAVA 代码的,(累死个仙人
    值得一提的是 :在颜色的选择方面,一般来说颜色都是通过 RGB 或者是 16 进制来确定的。但是 jacob 在设置字体颜色的时候传入的值是一个由三个","分隔的数字。最后发现一条线索是把 16 进制的颜色数字转化为 10 进制,之后两位一组","隔开传入.....最后试了试还是不行.....但是有些是可以,现在能确定的颜色是:

    Dispatch.put(font, "Color", "16,77,72,15");//白色字体
    Dispatch.put(font, "Color", "1,0,0,0");//红色字体
    

    参考

    jacob 设置字体颜色(非 rgba)
    Jacob 操作 PPT

    相关文章

      网友评论

          本文标题:java 使用 jacob 控制 ppt 记录

          本文链接:https://www.haomeiwen.com/subject/nclluftx.html