这两天由于工作需要对word 进行一些操作所以接触到jacob
大致研究了一下 感觉是一个挺好用的东西而且使用起来挺方便,可是在很关键的时候出了问题下面就和大家分享一下。
jacob 现在版本最高是1.9 但是我在使用时一直抱错,所以我就用的是1.7版本。
里面两个文件时很有用的 一个是jacob.jar 一个是 jacob.dll  
jacob.jar 就是我们要使用的包是和java 交互的东西 我们可以放进java的类库中然后引入项目
项目中import com.jacob.com.*; import com.jacob.activeX.*; 这两个就能使用
需要在环境变量中指明jacob.jar 的位置。
jacob.dll  是和com 交互的东西 我们需要把它放入windows\system32 中,而且在path中要指明它的位置,其实本人还不了解为啥要在path 中指明它的路径。
这样我们就可以在项目中使用了:下面给一个例子:
类ReplaceWord.java
import com.jacob.com.*;
import com.jacob.activeX.*;public class ReplaceWord {
  public static void main(String[] args) {    ActiveXComponent app = new ActiveXComponent("Word.Application"); //启动word
    String inFile = "C:\\test.doc"; //要替换的word文件
    boolean flag = false;
    try {
      app.setProperty("Visible", new Variant(false)); //设置word不可见
      Object docs = app.getProperty("Documents").toDispatch();
      Object doc = Dispatch.invoke(docs, "Open", Dispatch.Method,
                                   new Object[] {inFile, new Variant(false), new Variant(false)},
                                   new int[1]).toDispatch(); //打开word文件,注意这里第三个参数要设为false,这个参数表示是否以只读方式打开,因为我们要保存原文件,所以以可写方式打开。
      Object content = Dispatch.get(doc, "Content").toDispatch(); //提取word文档内容对象
      Object finder = Dispatch.get(content, "Find").toDispatch(); //提取find对象,也就查找替换的那个对象
      Variant f = new Variant(false);      boolean rt = true;
      while (rt) {
        rt = Dispatch.invoke(finder, "Execute", Dispatch.Method,
                             new Object[] {"New", f, f, f, f, f, f, f, f, "Old",
                             new Variant(true)}
                             , new int[1]).toBoolean(); //替换Old ---> New
      }      Dispatch.call(doc, "Save"); //保存
      Dispatch.call(doc, "Close", f);
      flag = true;
      System.out.println("is over");
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    finally {
      app.invoke("Quit", new Variant[] {});
    }
  }
}
这个例子我测试过可以就是替换word中的文字 注释也很清楚我就不多说了 使用jb9
 ----------------------------------------
下面就是我的问题了。
这段代码在web 项目中使用的时候当在tomcat 4.1下能够正常地工作,但是当使用weblogic 就会抱错
1 :java.lang.NoClassDefFoundError
2 :java.lang.UnsatisfiedLinkError: no jacob in java.library.path
这两个错误都会出现很让人郁闷。请各位高手帮帮忙看是哪里出了问题。
同时也请对该贴关注的朋友帮忙顶顶别沉下去了,如果那位想要其它的操作比如插入文字,插入表格
表格行替换,插入图片等等我都已经写好(能够使用)。但是没有在web项目下测试。都可以留言我会给出代码。
最后多谢各位支持,问题解决就散分

解决方案 »

  1.   

    学习,weblogic抱错,可能和包没有导进去有关。
      

  2.   

    使用weblogic的时候这些dll文件没有找到就报错了。
    你可以在startWebLogic.cmd这个文件里面的CLASSPATH定义的地方添加你的这些dll文件。可能就可以解决了。
      

  3.   

    其实本人还不了解为啥要在path 中指明它的路径。在Classpath里面添加对DLL的引用应该不对吧。Windows系统中对DLL的查找顺序应该是:
    1.内存 
    2.KnownDLLs 
    3.清单与 .local 
    4.应用程序目录 
    5.当前工作目录 
    6.系统目录(%systemroot%、%systemroot%\system 和 %systemroot%\system32)
    7.路径变量我觉得放置dll文件的较好位置应该是当前工作目录,或者在Path环境变量中进行引用
      

  4.   

    这两天在休息,先谢谢各位的关注
    我已经在path中指明了dll文件的位置,而且在classpath中引入了.jar文件可是还是不行。
    因为在tomcat下能够运行,所以我开始怀疑是weblogic jdk的问题以前的事1.4.1 但是修改为1.4.2还是不行
    -------------------
     to: jFresH_MaN  看了很多资料 都是说在path中指明dll文件, 但是还是照你的方法试了,问题依旧,还是老样子。
     to: Polarislee(北极星) 你的意思是当dll文件放到 系统目录下了以后就不用在方到环境变量中了是吧!我现在感觉也是的,谢谢各位,希望继续关注
      

  5.   

    现在是第一次抱 no jacob in java.library.path
    然后就是抱 java.lang.NoClassDefFoundError  的错
      

  6.   

    昨天把 jacob.dll文件copy到jdk1.4.2\jre\bin 下结果就认到了,总算认到了呀!花了好多天真辛苦。不错又遇到了其他的问题 错误如下:
    com.jacob.com.ComFailException: A COM exception has been encountered:
    At Invoke of: Documents
    报错的是Object docs = app.getProperty("Documents").toDispatch();一行
    这样看来认不出来com 是不是应为jacob.jar 的问题呀!真是好艰辛。多谢各位的支持。希望继续关注
      

  7.   

    终于搞出来了。
    在这里还是大致总结一下吧!希望以后对大家有用的着:
    我先说一下配置:
    1如果是web程序你注意的就是用什么工具发布。一定要要修改用来发布程序的容器的jre也就是虚拟机之类的东西,把jacob.dll文件copy到对应的连接库中也就是D:\bea\jdk141_03\jre\bin 如果你也是使用单独的中间键发布程序一定要修改,不然就会报错:
    com.jacob.com.ComFailException: A COM exception has been encountered:
    At Invoke of: Documents
    2在一个就是版本的问题,我一开始使用的版本是 jacob1.7 在jdk版本是jdk141_03
    但是也报错,后来我把它的jacob.dll文件该成1.9的就好了,我也没有做别的测试。
    1.7版本.jar.dll的在jb9+tomcat4.1+jdk1.4.1或1.4.2都可以正常使用。
    就说这些吧!如果有别的问题就留言吧!