java 使用 jacob 控制 ppt 记录
2018-07-02 本文已影响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
通过观察对比JAVA
和VBA
代码得知(是的...不会 vba 全程用猜):
ActiveWindow.Selection
等同于
(Dispatch) Dispatch.get(selectionObj, "ShapeRange").getDispatch()
- &&&
Selection.TextRange
等同于
Dispatch textRange = (Dispatch) Dispatch.get(textFrame, "TextRange").getDispatch();
由观察得志,JACOB
的 Dispath
对象可以抽象理解为 VBA
的对象,而 Dispath
的 get()
方法的意思是通过传入的第一个参数得到 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");//红色字体