關於使用jacob操作word某論壇載錄

這兩天由於工作需要對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項目下測試。都可以留言我會給出代碼。
最後多謝各位支持,問題解決就散分

 
 
 
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.KnownDLLs
3.清單與 .local
4.應用程序目錄
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:14

jacob是不是只是在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:43

up
 
 
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: Documents
2在一個就是版本的問題,我一開始使用的版本是 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:20

1、我腦子笨,所以不推薦樓主用類庫的方法,這樣要學習,笨蛋們都搞不過來

2、既然這麼說,我是有別的處理辦法的,很土,但是很管用

3、簡單一點就是用JAVA APPLICANTION 中用EXE方法直接打開WORD進行編輯(可行)

4、至於用JAVA生成WORD的方法,很多很多,不是釣胃口,只是我沒有完全實踐,差表格部分沒有驗證,其他OK
 
 
lancelobb(蘭斯洛特) 於 2005-8-30 16:59:40

mark
 
 
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[] {});
  }
}
}

查看原文點此處


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章