http://imnotceo.blogbus.com/logs/32174360.html
前些日子在公司实习,用到java来批量生成表格并且插入图片,搞得我焦头烂额。主要是用jacob的人可能比较少些(用.net也不多,一般直接几句vc或者vb就可以解决了),网上相关的资料也不多。后来自己琢磨了下,终于搞出了点名堂。在这里分享下。
关于dispatch的几个静态方法 :
call:调用对象方法,其中的第一个参数是对象名,第二个字符串参数就是方法名字,有时会有方法参数。例如:
Dispatch table=Dispatch.call(tables, "Item", new Variant(1)).toDispatch();
//相当于执行了vb中的:table=tables.item(1)
get:返回属性,字符串就是属性名称。例如:
Dispatch cols = Dispatch.get(this.table, "Columns").toDispatch();
//相当于执行了vb中的:cols=table.Columns
put:设置属性,第三个参数就是要设置的属性值。例如:
Dispatch.put(selection, "Text", "pinpinILoveYou");
//相当于执行了vb中的:selection.Text="pinpinILoveYou",意为在当前光标插入点插入一个字符串
可能大家会有困惑,就是不知道哪些对象有哪些属性,比如我要在word中设置一张图片格式为透明,但我不知到如何得到这张图片对象,在调用Dispatch的静态方法时,设置它的哪些属性。也就是call,put,get方法中,第二个参数是什么没办法来简单的得到。
我提供大家一个简单的方法,就是 利用word的“vba对象浏览器”配合"录制宏"两个功能来完成java对word的控制。
比如说,我要设置一张图片格式为透明,那么我先在word里录制一段宏,然后在vba里查看这段代码如下:
Selection.InlineShapes(1).PictureFormat.TransparentBackground = msoTrue
Selection.InlineShapes(1).PictureFormat.TransparencyColor = RGB(255, 255, 255)
Selection.InlineShapes(1).Fill.Visible = msoFalse
如果我要用JavaCom桥来执行上面三句代码的话,意味着我必须先获得Selection可编辑区域对象,再获得InlineShapes(1)图形对 象,再获得PictureFormat图片格式对象,最后设置它的两个属性TransparentBackground和 TransparencyColor。具体代码和说明如下:
//--------------设置图片格式透明----------------
//插入一张图片,其类型为InlineShapes
可能大家会有困惑,就是不知道哪些对象有哪些属性,比如我要在word中设置一张图片格式为透明,但我不知到如何得到这张图片对象,在调用Dispatch的静态方法时,设置它的哪些属性。也就是call,put,get方法中,第二个参数是什么没办法来简单的得到。
我提供大家一个简单的方法,就是 利用word的“vba对象浏览器”配合"录制宏"两个功能来完成java对word的控制。
比如说,我要设置一张图片格式为透明,那么我先在word里录制一段宏,然后在vba里查看这段代码如下:
Selection.InlineShapes(1).PictureFormat.TransparentBackground = msoTrue
Selection.InlineShapes(1).PictureFormat.TransparencyColor = RGB(255, 255, 255)
Selection.InlineShapes(1).Fill.Visible = msoFalse
如果我要用JavaCom桥来执行上面三句代码的话,意味着我必须先获得Selection可编辑区域对象,再获得InlineShapes(1)图形对 象,再获得PictureFormat图片格式对象,最后设置它的两个属性TransparentBackground和 TransparencyColor。具体代码和说明如下:
//--------------设置图片格式透明----------------
//插入一张图片,其类型为InlineShapes
Dispatch image = Dispatch.call(Dispatch.get(this.selection, "InlineShapes").toDispatch(), "AddPicture", imagePath).toDispatch();
//必须转换为shape类型才能进行图片格式操作
//必须转换为shape类型才能进行图片格式操作
shape = Dispatch.call(image, "ConvertToShape").toDispatch();
//得到pictureFormat对象
Dispatch pictureFormat = Dispatch.call(shape, "PictureFormat").toDispatch();
Dispatch.put(pictureFormat, "TransparentBackground", true);
Dispatch pictureFormat = Dispatch.call(shape, "PictureFormat").toDispatch();
Dispatch.put(pictureFormat, "TransparentBackground", true);
//16进制转换为rgb
Dispatch.put(pictureFormat, "TransparencyColor", new Variant(0xFFFFFF));
//如果希望通过图片的透明部分看到图片下面的对象,则必须将图片的 FillFormat 对象的 Visible 属性设为 False。
Dispatch fillFormat = Dispatch.call(shape, "Fill").toDispatch();
Dispatch.put(fillFormat, "Visible", false);
//--------------------结束-----------------------
好了,其实其他一些利用jacob操作word的方法都可以利用“先进行宏录制在查看宏的vba代码”来完成。 可能就是调用对象比较繁琐,毕竟底层的运行时不同。
我封装了一些jacob的api,用来操作表格和图片等对象,大家可以 点击下载 。另外有个测试的例子,是我给公司做的一个城管队员执照生成的小程序,涉及到一些算法、word表格和图片的处理等等。 点击下载 。代码稍微有些乱,大家谅解。
Dispatch.put(pictureFormat, "TransparencyColor", new Variant(0xFFFFFF));
//如果希望通过图片的透明部分看到图片下面的对象,则必须将图片的 FillFormat 对象的 Visible 属性设为 False。
Dispatch fillFormat = Dispatch.call(shape, "Fill").toDispatch();
Dispatch.put(fillFormat, "Visible", false);
//--------------------结束-----------------------
好了,其实其他一些利用jacob操作word的方法都可以利用“先进行宏录制在查看宏的vba代码”来完成。 可能就是调用对象比较繁琐,毕竟底层的运行时不同。
我封装了一些jacob的api,用来操作表格和图片等对象,大家可以 点击下载 。另外有个测试的例子,是我给公司做的一个城管队员执照生成的小程序,涉及到一些算法、word表格和图片的处理等等。 点击下载 。代码稍微有些乱,大家谅解。
如果发现本文有可以纠正的地方或者问题请务必联系我,谢谢!欢迎一起讨论。