想用java操作word文件?jacob是個(gè)不錯(cuò)的選擇,也就是java-com橋,,你可以在http:///projects/jacob-project/下載,我下載的版本是1.12,注意版本太低的話可能會(huì)報(bào)錯(cuò),。
如果沒有特殊需求,,可以直接使用jacob_*.zip中提供的jacob.jar和jacob.dll。把jacob.dll文件放在系統(tǒng)可以找得到的路徑上,,一般放c:/windows/system32下就行了,,注意你用的jacob.dll文件和你的jacob.jar包要匹配,否則會(huì)報(bào)錯(cuò)哦,!
如果想自己編譯也很簡(jiǎn)單,,把jacob_*_src.zip解開,建個(gè)工程,,在build.xml中稍作配置即可:
<property name="JDK" value="D:\Java\j2sdk1.4.2_13"/>
<property name="MSDEVDIR" value="D:\Microsoft Visual Studio\VC98"/>
<property name="version" value="1.12"/>
看出來了嗎,,你的機(jī)器上需要有JDK和VC環(huán)境,,VC是用來生成jacob.dll文件的,如果編譯時(shí)說找不到MSPDB60.DLL,,那就在你的Microsoft Visual Studio目錄下搜索一下,拷貝到D:\Microsoft Visual Studio\VC98\Bin下就行了,?! ?/div>
如果需要對(duì)jacob里的jar包改名,(雖然通常不會(huì)發(fā)生這種情況,,但如果你需要兩個(gè)版本的jacob同時(shí)使用,,改名可能是一種選擇),這時(shí)你的工作就多一些:
(1)package改名是必須的了,,比如我們把src下的com.jacob.activeX改為com.test.jacob.activeX,把com.jacob.com改為com.test.jacob.com,,打包時(shí)只有這兩個(gè)包是有用的,所以只改它們就夠了,?! ?/div>
(2)然后修改build.xml中src.java.jacob.mainpackage的value為com.test.jacob,修改java.class.main的value為com.test.jacob.com.Jacob,?! ?/div>
(3)別忘了javaJarBin中打包的源碼路徑也要改,<include name="com/**/*.class" />改為<include name="com/test/**/*.class" />?! ?/div>
(4)build.xml中對(duì)生成的dll和jar包也要改個(gè)名,,比如我們把這兩個(gè)文件改為jacob_test.dll和jacob_test.jar。修改build.xml中的enerated.filename.dll和generated.filename.jar的value為你新改的名字,?! ?/div>
(5)com.test.jacob.com.LibraryLoader中,System.loadLibrary("jacob");改成System.loadLibrary("jacob_test"); (6)另外,,很重要的,,在jni中*.cpp和*.h中com_jacob_com統(tǒng)一改為com_test_jacob_com,com/jacob/com統(tǒng)一改為com/test/jacob/com,?! ?/div>
(7)ant編譯,編譯好的文件在release目錄下,?! ?/div>
(8)最后把編譯好的jacob_test.dll文件放在windows/system32下就大功告成了?! ?/div>
現(xiàn)在該用到j(luò)acob.jar了,,如果你自己修改過jar包的名字,用新改的jar包,,如jacob_test.jar,,這里統(tǒng)一稱為jacob.jar,。
首先在classpath中引入jacob.jar包,,如果是web應(yīng)用,,WEB-INF的lib中也要加入jacob.jar包。
下面給一個(gè)例子: 類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"); //啟動(dòng)word
String inFile = "C:\\test.doc"; //要替換的word文件
try {
app.setProperty("Visible", new Variant(false)); //設(shè)置word不可見
Dispatch docs = app.getProperty("Documents").toDispatch();
Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { inFile, new Variant(false),new Variant(false) }, new int[1]).toDispatch(); //打開word文件,,注意這里第三個(gè)參數(shù)要設(shè)為false,,這個(gè)參數(shù)表示是否以只讀方式打開,因?yàn)槲覀円4嬖募?,所以以可寫方式打開,。
Dispatch selection=app.getProperty("Selection").toDispatch();//獲得對(duì)Selection組件 Dispatch.call(selection, "HomeKey", new Variant(6));//移到開頭
Dispatch find = Dispatch.call(selection, "Find").toDispatch();//獲得Find組件
Dispatch.put(find, "Text", "name"); //查找字符串"name"
Dispatch.call(find, "Execute"); //執(zhí)行查詢
Dispatch.put(selection, "Text", "張三"); //替換為"張三"
Dispatch.call(doc, "Save"); //保存
Dispatch.call(doc, "Close", new Variant(false));
} catch (Exception e) {
e.printStackTrace();
} finally {
app.invoke("Quit", new Variant[] {});
app.safeRelease();
}
}
}
也許你會(huì)問,我怎么知道要調(diào)用哪個(gè)方法傳哪些參數(shù)來進(jìn)行操作,?別忘了,,word還有宏呢!自己錄制一個(gè)宏,,編輯這個(gè)宏就可以看到代碼了,!用哪個(gè)對(duì)象的哪個(gè)方法就看你的了?! ?/div>
我總結(jié)了一下:
document下的組件都用Dispatch selection=app.getProperty("Selection").toDispatch()這種方法獲得,;
再往下的組件就需要調(diào)用selection的方法來獲取,如 Dispatch find = Dispatch.call(selection, "Find").toDispatch(),;
如果某個(gè)方法需要參數(shù),,Dispatch doc = Dispatch.invoke(docs,"Open",Dispatch.Method,new Object[] { inFile, new Variant(false),new Variant(false) }, new int[1]).toDispatch()是一個(gè)例子,這是調(diào)用docs的Open方法,,Object[]數(shù)組里就是它需要的參數(shù)了,;
如果要修改某個(gè)組件的屬性呢,用Dispatch.put(find, "Text", "name")這種形式,,"Text"是屬性名,,"name"是值。
文章轉(zhuǎn)載自網(wǎng)管之家:http://www./pdb/java/200807/145673_3.html
|
|