服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

如何实现用jacob来调用word的宏


  问题的提出
  
  如何用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方法。

扫描关注微信公众号