问题的提出
如何用java调用word.exe的宏和其他功能?
poi和jacob好像只能抽取doc文档的内容,而我现在需要在java中利用word.exe的功能对doc文档进行加工,怎么办?这是一个matrix user:lingrings提出的问题。出于助人为乐的想法,自己便在google上查了一下,结果找到jacob。
jacob简介
jacob is a java-com bridge that allows you to call com automation components from java。这是jacob官方网站的原话,本人就不再多说了。jacob的实现有些像封装了com功能的jni调用的集合及承载com对象的容器。jacob作者dan adler使用了c++编写了一批程序库实现对com的引用/承载/调用,然后使用java的jni技术调用这些程序库,实现java-com bridge。
关于作者如何封装的可以参考http://danadler.com/jacob/,其方法和类与微软的javasdk文档一致,有兴趣的朋友可以look一下。
vb实现
查看使用vb开发office automation 的方法文档(http://www.microsoft.com/china/msdn/archives/technic/voices/office05042000.asp),和访问word中的macro的文档(http://support.microsoft.com/kb/q185167/),来获取如何通过vb访问word macro的方法:
例如marco定义如下:
sub mywordmacro(strpassedparam as string) msgbox strpassedparam end sub
而访问这个mywordmacro宏的vb代码如下:
sub automateword_opendoc() dim wrdapp as object dim wrddoc as object dim strfilename as string set wrdapp = createobject("word.application") on error goto docerror ' replace the following example string value with the path and ' file name of the template containing your macro. strfilename = "<path and filename of template>" ' open the document and set a variable equal to a new blank ' document and its underlying template. set wrddoc = wrdapp.documents.add(strfilename) ' run the macro. (replace "mywordmacro" with the name of your macro.) wrddoc.mywordmacro ("this is a test.") docerror: if err.number <> 0 then msgbox err.description ' quit this instance of word. wrdapp.quit ' clear variable memory. set wrdapp = nothing set wrddoc = nothing end sub
这样就能在vb中访问word的macro。。
这样只要使用jacob写一段代码来实现vb代码的java调用,就ok了。
java实现
继续上面的,现在发布一下我使用jacob调用word文件中的宏的代码。
首先说明一下,由于jacob是java与com之间的bridge,所以先描述一下使用vb调用上面的mywordmacro宏的代码,这样可以与java代码作比较,更利于理解jacob的工作方式:
sub automateword_opendoc() dim wrdapp as object dim wrddoc as object dim strfilename as string set wrdapp = createobject("word.application") on error goto docerror '包含marco的word文件 strfilename = "c:/macrotest.doc" '打开文件 set wrddoc = wrdapp.documents.open(strfilename) '运行宏 wrddoc.mywordmacro ("this is a test.")docerror: if err.number <> 0 then msgbox err.description '退出word wrdapp.quit '清除内存 set wrdapp = nothing set wrddoc = nothingend subprivate sub command1_click() automateword_opendocend sub
而对应的java代码如下:
package com.bjinfotech.practice.jacob;import com.jacob.com.*;import com.jacob.activex.*;/** * 调用word文件中的宏 * @author 聪明的猪 * */public class dispatch_mswordmacro { /** * 打开word,调用word中的宏 * @param filepath word文件路径 * @param macroname 被调用的宏名字 * @param parameter 调用宏的参数数组 */ public void callwordmacro(string filepath,string macroname,object parameter[]){ //建立activex部件 activexcomponent wrdcom=new activexcomponent("word.application"); try{ //返回wrdcom.documents的dispatch object wrddocs=wrdcom.getproperty("documents").todispatch(); //调用wrdcom.documents.open方法打开指定的word文档,返回worddoc object wrddoc=dispatch.invoke(wrddocs,"open",dispatch.method,new object[]{filepath},new int[1]).todispatch(); //使用方法传入的参数parameter调用word文档中的mywordmacro宏// dispatch.call(wrddoc,macroname,parameter); dispatch.invoke(wrddoc,macroname,dispatch.method,parameter,new int[1]); } catch(exception ex){ ex.printstacktrace(); } finally{ //关闭word文件 wrdcom.invoke("quit",new variant[]{}); } } public static void main(string[] argv){ dispatch_mswordmacro d=new dispatch_mswordmacro(); d.callwordmacro("e:/eclipse3.1rc3/workspace/jacobpractice/src/com/bjinfotech/practice/jacob/macrotest.doc","mywordmacro",new string[]{"这是测试信息"}); }}
很明显,使用的方法与在vb等vs工具中相同,只不过在调用方法时使用了dispatch,获得属性时使用了getproperty方法。
闽公网安备 35060202000074号