java 使用 jacob 控制 ppt 记录

首先结论 : 给现有 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,362评论 8 265
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,979评论 3 119
  • 已过了, 红了樱桃,绿了芭蕉的时节, 小伙伴们围坐在李子树下, 伴着辣椒尝着青梅的原始味道, 酸到灵魂深处, 刺激...
    井溢阅读 256评论 7 3
  • 雪绒花,学名火绒草,又名薄雪草,为菊科火绒草属的高山植物。多年生草本,植株高度15-40cm,植株覆盖白色或灰白色...
    老应杂谈阅读 1,212评论 2 8
  • 一、MongoDB 权威指南 亲身经历了在快速发展的大型互联网公司应于MySQL的过程。开始时只有很少的数据,一台...
    AQ王浩阅读 441评论 0 1