想用java操作word文件?jacob是個不錯的選擇也就是javacom橋你可以在project/下載我下載的版本是注意版本太低的話可能會報錯
如果沒有特殊需求可以直接使用jacob_*zip中提供的jacobjar和jacobdll把jacobdll文件放在系統可以找得到的路徑上一般放c:/windows/system下就行了注意你用的jacobdll文件和你的jacobjar包要匹配否則會報錯哦!
如果想自己編譯也很簡單把jacob_*_srczip解開建個工程在buildxml中稍作配置即可
<property name=JDK value=D:\Java\jsdk_/>
<property name=MSDEVDIR value=D:\Microsoft Visual Studio\VC/>
<property name=version value=/>
看出來了嗎你的機器上需要有JDK和VC環境VC是用來生成jacobdll文件的如果編譯時說找不到MSPDBDLL那就在你的Microsoft Visual Studio目錄下搜索一下拷貝到D:\Microsoft Visual Studio\VC\Bin下就行了
如果需要對jacob裡的jar包改名(雖然通常不會發生這種情況但如果你需要兩個版本的jacob同時使用改名可能是一種選擇)這時你的工作就多一些
()package改名是必須的了比如我們把src下的comjacobactiveX改為comtestjacobactiveX把改為打包時只有這兩個包是有用的所以只改它們就夠了
()然後修改buildxml中srcjavajacobmainpackage的value為comtestjacob修改javaclassmain的value為Jacob
()別忘了javaJarBin中打包的源碼路徑也要改<include name=com/**/*class />改為<include name=com/test/**/*class />
()buildxml中對生成的dll和jar包也要改個名比如我們把這兩個文件改為jacob_testdll和jacob_testjar修改buildxml中的eneratedfilenamedll和generatedfilenamejar的value為你新改的名字
()LibraryLoader中SystemloadLibrary(jacob);改成SystemloadLibrary(jacob_test); ()另外很重要的在jni中*cpp和*h中com_jacob_com統一改為com_test_jacob_comcom/jacob/com統一改為com/test/jacob/com
()ant編譯編譯好的文件在release目錄下
()最後把編譯好的jacob_testdll文件放在windows/system下就大功告成了
現在該用到jacobjar了如果你自己修改過jar包的名字用新改的jar包如jacob_testjar這裡統一稱為jacobjar
首先在classpath中引入jacobjar包如果是web應用WEBINF的lib中也要加入jacobjar包
下面給一個例子
類ReplaceWordjava
import *;
import comjacobactiveX*;
public class ReplaceWord {
public static void main(String[] args) {
ActiveXComponent app = new ActiveXComponent(WordApplication); //啟動word
String inFile = C:\\testdoc; //要替換的word文件
try {
appsetProperty(Visible new Variant(false)); //設置word不可見
Dispatch docs = appgetProperty(Documents)toDispatch();
Dispatch doc = Dispatchinvoke(docsOpenDispatchMethodnew Object[] { inFile new Variant(false)new Variant(false) } new int[])toDispatch(); //打開word文件注意這裡第三個參數要設為false這個參數表示是否以只讀方式打開因為我們要保存原文件所以以可寫方式打開
Dispatch selection=appgetProperty(Selection)toDispatch();//獲得對Selection組件 Dispatchcall(selection HomeKey new Variant());//移到開頭
Dispatch find = Dispatchcall(selection Find)toDispatch();//獲得Find組件
Dispatchput(find Text name); //查找字符串name
Dispatchcall(find Execute); //執行查詢
Dispatchput(selection Text 張三); //替換為張三
Dispatchcall(doc Save); //保存
Dispatchcall(doc Close new Variant(false));
} catch (Exception e) {
eprintStackTrace();
} finally {
appinvoke(Quit new Variant[] {});
appsafeRelease();
}
}
}
也許你會問我怎麼知道要調用哪個方法傳哪些參數來進行操作?別忘了word還有宏呢!自己錄制一個宏編輯這個宏就可以看到代碼了!用哪個對象的哪個方法就看你的了
我總結了一下
document下的組件都用Dispatch selection=appgetProperty(Selection)toDispatch()這種方法獲得
再往下的組件就需要調用selection的方法來獲取如 Dispatch find = Dispatchcall(selection Find)toDispatch()
如果某個方法需要參數Dispatch doc = Dispatchinvoke(docsOpenDispatchMethodnew Object[] { inFile new Variant(false)new Variant(false) } new int[])toDispatch()是一個例子這是調用docs的Open方法Object[]數組裡就是它需要的參數了
如果要修改某個組件的屬性呢用Dispatchput(find Text name)這種形式Text是屬性名name是值
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26432.html