这两天由于工作需要对word 进行一些操作所以接触到jacob大致研究了一下感觉是一个挺好用的东西而且使用起来挺方便,可是在很关键的时候出了问题下面就和大家分享一下。jacob 现在版本最高是1.9 但是我在使用时一直抱错,所以我就用的是1.7版本。里面两个文件时很有用的 一个是jacob.jar 一个是 jacob.dlljacob.jar 就是我们要使用的包是和java 交互的东西我们可以放进java的类库中然后引入项目项目中import com.jacob.com.*; import com.jacob.activeX.*; 这两个就能使用需要在环境变量中指明jacob.jar 的位置。jacob.dll 是和com 交互的东西 我们需要把它放入windows/system32 中,而且在path中要指明它的位置,其实本人还不了解为啥要在path 中指明它的路径。这样我们就可以在项目中使用了:下面给一个例子:类ReplaceWord.javaimport com.jacob.com.*;import com.jacob.activeX.*;public class ReplaceWord {public static void main(String[] args) {ActiveXComponent app = new ActiveXComponent("Word.Application"); //启动wordString 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.NoClassDefFoundError2 :java.lang.UnsatisfiedLinkError: no jacob in java.library.path这两个错误都会出现很让人郁闷。请各位高手帮帮忙看是哪里出了问题。同时也请对该贴关注的朋友帮忙顶顶别沉下去了,如果那位想要其它的操作比如插入文字,插入表格表格行替换,插入图片等等我都已经写好(能够使用)。但是没有在web项目下测试。都可以留言我会给出代码。最后多谢各位支持,问题解决就散分 jialin_2004(老猫) 于 2005-8-26 17:27:32可能是weblogic调用的jre不对吧 jialin_2004(老猫) 于 2005-8-26 17:29:03至于路径不用在path里面设吧 xdop(鸿飞处) 于 2005-8-26 17:32:43关注jacob,呵呵建议:既然看到是类似 java.lang.NoClassDefFoundError 以及 no jacob in java.library.path还不赶紧检查服务器环境以及应用部署是不是出现遗漏,呵呵 bob_thb(绿果) 于 2005-8-26 17:51:11学习啊,帮顶一下下! simon0512(虫虫) 于 2005-8-26 23:03:48学习 emailfly(匆匆过客) 于 2005-8-26 23:17:53学习一下我都看不懂是什么意思了 xjhlzl(花乌鸦) 于 2005-8-29 11:11:01这两天在休息,没有及时跟贴不好意思。先谢谢各位的关注我已经在path中指明了dll文件的位置,而且在classpath中引入了.jar文件可是还是不行。因为在tomcat下能够运行,所以我开始怀疑是weblogic jdk的问题以前的事1.4.1 但是修改为1.4.2还是不行听别人说,.dll文件 如果方到系统文件下就可以不用在path里设置了-----------------------------引Polarislee(北极星)------------在Classpath里面添加对DLL的引用应该不对吧。Windows系统中对DLL的查找顺序应该是:1.内存2.KnownDLLs3.清单与 .local4.应用程序目录5.当前工作目录6.系统目录(%systemroot%、%systemroot%/system 和 %systemroot%/system32)7.路径变量------------------------------------------------已经把weblogic中startWebLogic.cmd这个文件里面的CLASSPATH定义的地方添加你的这些dll文件现在是第一次抱 no jacob in java.library.path然后就是抱 java.lang.NoClassDefFoundError 的错 chensheng913(键者天行) 于 2005-8-29 16:22:11顶! xjhlzl(花乌鸦) 于 2005-8-29 16:22:55自己顶顶吧! 希望别沉了 TomyGuan(Tomy) 于 2005-8-29 17:39:14jacob是不是只是在window中運行的?????? xjhlzl(花乌鸦) 于 2005-8-30 10:53:25我是在windows下运行的,应该支持其他的操作系统。不过我不确定。官方网站上说“It uses JNI to make native calls into the COM and Win32 libraries.”我想能够支持其他的操作系统吧!-----------------------------------------------言归正转:昨天把 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 的问题呀!真是好艰辛。多谢各位的支持。希望继续关注 layueer(爱伤怀,努力升仙) 于 2005-8-30 11:01:43up xjhlzl(花乌鸦) 于 2005-8-30 15:12:07终于搞出来了。在这里还是大致总结一下吧!希望以后对大家有用的着:我先说一下配置: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: Documents2在一个就是版本的问题,我一开始使用的版本是 jacob1.7 在jdk版本是jdk141_03但是也报错,后来我把它的jacob.dll文件该成1.9的就好了,我也没有做别的测试。1.7版本.jar.dll的在jb9+tomcat4.1+jdk1.4.1或1.4.2都可以正常使用。就说这些吧!如果有别的问题就留言吧! j_d(简) 于 2005-8-30 15:19:47做过这种项目了,帮你顶,你的问题应该是jacob没找到,把他放在系统classpath中,我记得还要把jacob.dll放在系统的path路径中,祝你好运! relup(扑乐) 于 2005-8-30 15:36:201、我脑子笨,所以不推荐楼主用类库的方法,这样要学习,笨蛋们都搞不过来2、既然这么说,我是有别的处理办法的,很土,但是很管用3、简单一点就是用JAVA APPLICANTION 中用EXE方法直接打开WORD进行编辑(可行)4、至于用JAVA生成WORD的方法,很多很多,不是钓胃口,只是我没有完全实践,差表格部分没有验证,其他OK lancelobb(兰斯洛特) 于 2005-8-30 16:59:40mark xjhlzl(花乌鸦) 于 2005-9-1 11:56:41 to (简):刚开始的问题确实是jacob.dll 和jacob.jar 没有认出来,其实并不是我没有在环境变量中设置,而是使用了weblogic发布程序造成的。不知道其他人遇到没有。用weblogic发布的时候需要自己把这些东西引入weblogic----------------------------to relup(扑乐):先谢谢你的意见。使用jacob com连接桥也是实在没有办法才用的,我感觉这个技术挺好的,就是很多地方需要完善。还有一点我的文件是保存在库中,用其他的办法好像不太合适你用 java applicantion 是如何使用在这里给大家说说吧! web 程序同样适用吗?其实我觉得jsp页面处理word 不管是编辑还是查看我感觉总是不方便。不知道大家都用得什么方法。有空的话大家都说说吧!另:add by heroying
一个实例:
import com.jacob.com.*;import com.jacob.activeX.*;public class Exam_9 {public static void main(String[] args) { ActiveXComponent app = new ActiveXComponent("Word.Application");//启动word String inFile = "H://Majix-1_2_2_full//sample//my.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[]{"Old", f, f, f, f, f, f, f, f, "New", new Variant(true)}, new int[1]).toBoolean();//替换Old ---> New } Dispatch.call(doc,"Save");//保存 Dispatch.call(doc, "Close", f); flag = true; } catch (Exception e) { e.printStackTrace(); } finally { app.invoke("Quit", new Variant[] {}); }}}
查看原文点此处