使用Jacob自动替换书签内容
jacob自動(dòng)替換書簽內(nèi)容
通過java代碼實(shí)現(xiàn)word中書簽的替換
在Java項(xiàng)目開發(fā)過程中,需求涉及到了各種word文檔內(nèi)容自動(dòng)替換變量,現(xiàn)在將實(shí)現(xiàn)方式整理如下:
一、了解Jacob
先了解一下概念,JACOB 就是 JAVA-COM Bridge的縮寫,提供自動(dòng)化的訪問com的功能,也是通過JNI功能訪問windows平臺(tái)下的com組件或者win32系統(tǒng)庫的。這是一個(gè)開始于1999年的開源項(xiàng)目的成果,有很多使用者對(duì)該項(xiàng)目進(jìn)行了修改,做出了自己的貢獻(xiàn)。
下載地址:http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368
二、Jacob安裝
1、我們解開下載的jacob_1.9.zip,在文件夾中找到j(luò)acob.dll和jacob.jar兩個(gè)文件
2、將壓縮包解壓后,Jacob.jar添加到Libraries中;
3、將Jacob.dll放至“WINDOWS\SYSTEM32”下面。
代碼如下:
package ceshi; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant;public class JacobTest {public static void main(String[] args) {//啟動(dòng)word,生成一個(gè)ActivexComponent對(duì)象ActiveXComponent app = new ActiveXComponent("Word.Application");//要轉(zhuǎn)換的word文件String inFile = "C://Users/Desktop/bookmark.doc";//要保存的目標(biāo)文件String tpFile ="C://Users/Desktop/new_bookmark.doc";boolean flag = true;boolean visible=false;Dispatch docs = app.getProperty("Documents").toDispatch();Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[]{inFile, new Variant(false)}, new int[1]).toDispatch(); //打開word文件 , false可寫!! 注意 Variant的值Dispatch activeDocument=app.getProperty("ActiveDocument").toDispatch();Dispatch bookMarks = app.call(doc, "Bookmarks").toDispatch();int bCount = Dispatch.get(bookMarks, "Count").getInt(); //獲取書簽數(shù)//將書簽列表存放到list + map 結(jié)構(gòu)中 for (int i = 1; i <= bCount; i++){ Map bookMark = new HashMap(); //創(chuàng)建Map()Dispatch items = Dispatch.call(bookMarks, "Item", i).toDispatch(); String bookMarkKey = String.valueOf(Dispatch.get(items, "Name").getString()).replaceAll("null", ""); //讀取書簽命名Dispatch range = Dispatch.get(items, "Range").toDispatch();String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", ""); //讀取書簽文本String MarkKey=bookMarkKey;String MarkValue=bookMarkValue;//書簽名并替換的內(nèi)容if( MarkKey.equals("xm"))//書簽名為xm{MarkValue ="張三"; //該xm書簽處插入張三;}if( MarkKey.equals("lxdh")){//書簽名為lxdhMarkValue ="10086"; //在lxdh書簽處插入10086}if( MarkKey.equals("****")){ //書簽名自定義MarkValue ="*****"; //在該書簽插入自定義內(nèi)容}Dispatch.put(range, "Text", new Variant(MarkValue));//通過打印查看便于debugSystem.out.println(bookMarkValue);System.out.println(MarkValue);//保存文件Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {tpFile, new Variant(0)} , new int[1]); //new Variant(),這里面的根據(jù)傳入的參數(shù)不同,可以另存為不同的類型}try{Variant f = new Variant(false);Dispatch.call(doc, "Close", f);flag = true;}catch (Exception e) {e.printStackTrace();}finally {app.invoke("Quit", new Variant[] {});}}}出現(xiàn)以下異常解決方式:異常原因?yàn)閣ord文檔版本較低(如:word 2003及其以下),將word轉(zhuǎn)換為較高版本即可。
Exception in thread "main" com.jacob.com.ComFailException: Invoke of: Item Source: Microsoft Word Description: 集合所要求的成員不存在。at com.jacob.com.Dispatch.invokev(Native Method)at com.jacob.com.Dispatch.invokev(Dispatch.java:625)at com.jacob.com.Dispatch.callN(Dispatch.java:453)at com.jacob.com.Dispatch.call(Dispatch.java:541)at ceshi.GW.table(GW.java:53)at ceshi.GW.main(GW.java:89)轉(zhuǎn)換過程中出現(xiàn)以下異常:
分析原因:word中沒有插入書簽,導(dǎo)出時(shí)不能正確定位導(dǎo)致;
解決辦法:查看word文件,插入書簽定位;完美解決;
在轉(zhuǎn)換過程中出現(xiàn)異常: com.jacob.com.ComFailException: Can’t get object clsid from progid
解決方法: 操作系統(tǒng)缺少辦公軟件,安裝辦公軟件(WPS,Office)即可。
總結(jié)
以上是生活随笔為你收集整理的使用Jacob自动替换书签内容的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop组件及功能
- 下一篇: 理解 HTTP 幂等性