java 使用 jacob 控制 ppt 記錄

首先結(jié)論 : 給現(xiàn)有 ppt 添加一頁(yè)設(shè)置背景圖片置底澈圈,修改文字顏色
  • 聲明兩個(gè)私有變量
    private ActiveXComponent ppt;
    private ActiveXComponent presentation;
  • 根據(jù)傳入的 ppt 路徑構(gòu)建一個(gè) ppt 對(duì)象
/***
*
* Title: JacobPptUtil
* Description: 構(gòu)建ppt對(duì)象
* @param filePath ppt路徑
* @param isVisble 是否可見(jiàn)
*/
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");
    //設(shè)置是否可見(jiàn)
    Dispatch.put(ppt, "Visible", isVisble);
    // 打開(kāi)一個(gè)現(xiàn)有的 Presentation 對(duì)象
    ActiveXComponent presentations = ppt.getPropertyAsComponent("Presentations");
    presentation = presentations.invokeGetComponent("Open", new Variant(filePath), new Variant(true));
}
  • 獲取幻燈片對(duì)象
Dispatch windows = presentation.getProperty("Windows").toDispatch();  
Dispatch window = Dispatch.call(windows, "Item", new Variant(1)).toDispatch();  
Dispatch selection = Dispatch.get(window, "Selection").toDispatch();  
//獲取幻燈片對(duì)象  
ActiveXComponent slides = presentation.getPropertyAsComponent("Slides");  
  • 在之前添加一頁(yè)
/**
* @param type
* 2:標(biāo)題+文本
* 3:標(biāo)題+左右對(duì)比文本
* 4:標(biāo)題+表格  
* 5:標(biāo)題+左文本右圖表
* 6:標(biāo)題+左圖表右文本
* 7:標(biāo)題+SmartArt圖形
* 8:標(biāo)題+圖表
*/
private static Variant addPptPage(ActiveXComponent slides,int pptPage,int type)throws Exception{  
    return slides.invoke("Add", new Variant(pptPage), new Variant(type));  
}
  • 給選中元素添加值 (每頁(yè)幻燈片的元素在添加值的時(shí)候已經(jīng)確定了

    例: 如果創(chuàng)建類(lèi)型為 2篓像,那么元素就只有標(biāo)題文本

/**
* 在Selection對(duì)象上修改TEXT對(duì)象的值
*
* @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: 設(shè)置字體顏色
* @param selectionObj
* @param color
* @throws Exception
* void    返回類(lèi)型
* @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);
}
  • 添加背景圖片
//后面參數(shù)值依次是  left top whith  hight
Dispatch picture = Dispatch.call(shapes, "AddPicture","圖片路徑", 1, 1, 1, 1).toDispatch();
// 選中圖片
Dispatch.call(picture, "Select");
//設(shè)置寬度高度
//Dispatch.put(picture, "Width", new Variant(1920));
//Dispatch.put(picture, "Height", new Variant(1200));
//設(shè)置圖片的層級(jí)關(guān)系
Dispatch.call(picture,"ZOrder",1);

總結(jié)

  • 有上面的代碼可知
    修改字體顏色的代碼是
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 對(duì)象得到 TextFrame馏段,再由 TextFrame 得到 TextRange 對(duì)象再得到 Font 對(duì)象
與之對(duì)應(yīng)的ppt宏VBA代碼是

Sub Macro1()
' 宏由 User 記錄,日期: 2018-7-2

    ActiveWindow.Selection.TextRange.Font.Color.SchemeColor = ppAccent3
End Sub

通過(guò)觀察對(duì)比JAVAVBA代碼得知(是的...不會(huì) vba 全程用猜):

ActiveWindow.Selection

等同于

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

等同于

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

由觀察得志践惑,JACOBDispath 對(duì)象可以抽象理解為 VBA 的對(duì)象,而 Dispathget() 方法的意思是通過(guò)傳入的第一個(gè)參數(shù)得到 VBA 意義上的和 get() 方法第二個(gè)字符串參數(shù)值匹配的 VBA 對(duì)象,那么知道這個(gè)之后大部分的 VBA 代碼都是可以用 Dispath對(duì)象的get()方法翻譯岩臣。


后記

綜上所述~VBA 是可以翻譯為 JAVA 代碼的,(累死個(gè)仙人
值得一提的是 :在顏色的選擇方面,一般來(lái)說(shuō)顏色都是通過(guò) RGB 或者是 16 進(jìn)制來(lái)確定的宵膨。但是 jacob 在設(shè)置字體顏色的時(shí)候傳入的值是一個(gè)由三個(gè)","分隔的數(shù)字架谎。最后發(fā)現(xiàn)一條線(xiàn)索是把 16 進(jìn)制的顏色數(shù)字轉(zhuǎn)化為 10 進(jìn)制,之后兩位一組","隔開(kāi)傳入.....最后試了試還是不行.....但是有些是可以,現(xiàn)在能確定的顏色是:

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

參考

jacob 設(shè)置字體顏色(非 rgba)
Jacob 操作 PPT

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末辟躏,一起剝皮案震驚了整個(gè)濱河市谷扣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捎琐,老刑警劉巖会涎,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裹匙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡末秃,警方通過(guò)查閱死者的電腦和手機(jī)概页,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)练慕,“玉大人惰匙,你說(shuō)我怎么就攤上這事×褰” “怎么了徽曲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)麸塞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)涧衙,這世上最難降的妖魔是什么哪工? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮弧哎,結(jié)果婚禮上雁比,老公的妹妹穿的比我還像新娘。我一直安慰自己撤嫩,他們只是感情好偎捎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著序攘,像睡著了一般茴她。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上程奠,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天丈牢,我揣著相機(jī)與錄音,去河邊找鬼瞄沙。 笑死己沛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的距境。 我是一名探鬼主播申尼,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垫桂!你這毒婦竟也來(lái)了师幕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诬滩,失蹤者是張志新(化名)和其女友劉穎们衙,沒(méi)想到半個(gè)月后钾怔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒙挑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年宗侦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忆蚀。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矾利,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馋袜,到底是詐尸還是另有隱情男旗,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布欣鳖,位于F島的核電站察皇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏泽台。R本人自食惡果不足惜什荣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怀酷。 院中可真熱鬧稻爬,春花似錦、人聲如沸蜕依。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)样眠。三九已至友瘤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間檐束,已是汗流浹背商佑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厢塘,地道東北人茶没。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晚碾,于是被迫代替她去往敵國(guó)和親抓半。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,417評(píng)論 8 265
  • 1格嘁、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,988評(píng)論 3 119
  • 已過(guò)了笛求, 紅了櫻桃,綠了芭蕉的時(shí)節(jié), 小伙伴們圍坐在李子樹(shù)下探入, 伴著辣椒嘗著青梅的原始味道狡孔, 酸到靈魂深處, 刺激...
    井溢閱讀 257評(píng)論 7 3
  • 雪絨花蜂嗽,學(xué)名火絨草苗膝,又名薄雪草,為菊科火絨草屬的高山植物植旧。多年生草本辱揭,植株高度15-40cm,植株覆蓋白色或灰白色...
    老應(yīng)雜談閱讀 1,233評(píng)論 2 8
  • 一病附、MongoDB 權(quán)威指南 親身經(jīng)歷了在快速發(fā)展的大型互聯(lián)網(wǎng)公司應(yīng)于MySQL的過(guò)程问窃。開(kāi)始時(shí)只有很少的數(shù)據(jù),一臺(tái)...
    AQ王浩閱讀 445評(píng)論 0 1