1. 程式人生 > >java使用jacob操作word文件

java使用jacob操作word文件

ava使用jacob操作word文件

java呼叫com元件操作word使用總結(jacob)

簡單描述

   在此處輸入簡單摘要

特別宣告:使用java-com技術可以完成任何VBA可以完成的office文件操作;

 一、準備工作

   先了解一下概念,JACOB 就是 JAVA-COM Bridge的縮寫,提供自動化的訪問com的功能,也是通過JNI功能訪問windows平臺下的com元件或者win32系統庫的。這是一個開始於1999年的開源專案的成果,有很多使用者對該專案進行了修改,做出了自己的貢獻。

   Jacob下載地址:

        我在這裡下載了Jacob1.14.3和jacob1.9的版本兩個版本

  這裡下載的是目前最新的Jacob1.14.3的Release版。

      另外java操作word方式還有(個人認為通過jacob最好,自己可以擴充套件,網上除poi之外幾乎全是java-com技術實現的):

      (1):Apache POI - Java API To Access Microsoft Format Files(http://poi.apache.org/);對word處理不夠強處理Excel功能可以,但是全是通過java完成的,不需 要com元件支援;

     (2):java2word 是一個在java程式中呼叫 MS Office Word 文件的元件(類庫)。該元件提供了一組簡單的介面,以便java程式呼叫他的服務操作Word 文件。(好象也是用的java-com技術);

二、安裝Jacob

   Jacob的安裝非常的簡單,我們解開下載的jacob_1.9.zip,在資料夾中找到jacob.dll和jacob.jar兩個檔案,如果是Jacob1.14.3則是jacob-1.14.3-x86.dll(32位,機和jacob-1.14.3-x64.dll(64位)和jacob.jar兩個檔案。Jacob.dll直接放到系統的system32資料夾下就行了,連註冊都不用的(或者拷貝到jdk或者jre的bin目錄下也行,當前測試檔案所在的目錄也行,就是隻要在java.library.path中就可以)。而jacob.jar設定到classpath中去就可以了,或者在IDE開發環境的工程中設定擴充套件庫也一樣的,我是這樣使用的將jacob-1.14.3-x86.dll或複製到%Tomcat5%\bin目錄下將jacob.jar複製到%Tomcot5%\Share\lib目錄下,我使用過程中感覺放到這裡是一個最終解決辦法,當你放哪都有問題的時候。我這樣用之後再沒有出過因為系統不一樣出現的各種各樣的問題,當然你作的是web的專案。

       注意使用jacob一寫要安裝word,我裝的word2003,如果是操作word2007就不用jacob了(好像這方面的API)。

對jacob.dll幾種配置方法 (網上看到):

2008-07-31 11:59:49

1、把jacob.dll檔案,複製到 windows\system32 目錄下。(注:我用的時候這個方法不能執行)

2、 把jacob.dll放入 Java\jdk1.5.0_06\jre\bin目錄下.把jacob.jar放入 Java\jdk1.5.0_0\jre\lib\ext  

   目錄下.可以正常執行。

3、把jacob.dll放入 \glc\src目錄下.把jacob.jar放入WEB-INF\lib目錄下,也是可以正常執行。

三、使用(以下是我改寫的一個word操作類,希望有興趣的朋友完善,記得發給我一份)

0001 //注意java操作word關鍵是定位操作物件;
0002
0003 import com.jacob.activeX.ActiveXComponent;
0004
0005 import com.jacob.com.Dispatch;
0006
0007 import com.jacob.com.Variant;
0008
0009 /**
0010
0011 * jacob操作MSword類
0012
0013 * @author
0014
0015 */
0016
0017 public class WordBean {
0018
0019 // word文件
0020
0021 private Dispatch doc;
0022
0023 // word執行程式物件
0024
0025 private ActiveXComponent word;
0026
0027 // 所有word文件集合
0028
0029 private Dispatch documents;
0030
0031 // 選定的範圍或插入點
0032
0033 private Dispatch selection;
0034
0035 private boolean saveOnExit = true;
0036
0037 public WordBean()throws Exception{
0038
0039 if (word == null) {
0040
0041 word = new ActiveXComponent("Word.Application");
0042
0043 word.setProperty("Visible"new Variant(false)); //不可見開啟word
0044
0045 word.setProperty("AutomationSecurity"new Variant(3)); //禁用巨集
0046
0047 }
0048
0049 if (documents == null)
0050
0051 documents = word.getProperty("Documents").toDispatch();
0052
0053 }
0054
0055 /**
0056
0057 * 設定退出時引數
0058
0059 *
0060
0061 * @param saveOnExit
0062
0063 *            boolean true-退出時儲存檔案,false-退出時不儲存檔案
0064
0065 */
0066
0067 public void setSaveOnExit(boolean saveOnExit) {
0068
0069 this.saveOnExit = saveOnExit;
0070
0071 }
0072
0073 /**
0074
0075 * 建立一個新的word文件
0076
0077 *
0078
0079 */
0080
0081 public void createNewDocument() {
0082
0083 doc = Dispatch.call(documents, "Add").toDispatch();
0084
0085 selection = Dispatch.get(word, "Selection").toDispatch();
0086
0087 }
0088
0089 /**
0090
0091 * 開啟一個已存在的文件
0092
0093 *
0094
0095 * @param docPath
0096
0097 */
0098
0099 public void openDocument(String docPath) {
0100
0101 closeDocument();
0102
0103 doc = Dispatch.call(documents, "Open", docPath).toDispatch();
0104
0105 selection = Dispatch.get(word, "Selection").toDispatch();
0106
0107 }
0108
0109 /**
0110
0111 *只讀 開啟一個保護文件,
0112
0113 * @param docPath-檔案全名
0114
0115 * @param pwd-密碼
0116
0117 */
0118
0119 public void openDocumentOnlyRead(String docPath, String pwd)throws Exception {
0120
0121 closeDocument();
0122
0123 // doc = Dispatch.invoke(documents, "Open", Dispatch.Method,
0124
0125 // new Object[]{docPath, new Variant(false), new Variant(true), new Variant(true), pwd},
0126
0127 // new int[1]).toDispatch();//開啟word檔案
0128
0129 doc =  Dispatch.callN(documents, "Open"new Object[]{docPath, new Variant(false),
0130
0131 new Variant(true), new Variant(true), pwd, ""new Variant(false)}).toDispatch();
0132
0133 selection = Dispatch.get(word, "Selection").toDispatch();
0134
0135 }
0136
0137 public void openDocument(String docPath, String pwd)throws Exception {
0138
0139 closeDocument();
0140
0141 doc =  Dispatch.callN(documents, "Open"new Object[]{docPath, new Variant(false),
0142
0143 new Variant(false), new Variant(true), pwd}).toDispatch();
0144
0145 selection = Dispatch.get(word, "Selection").toDispatch();
0146
0147 }
0148
0149 /**
0150
0151 * 把選定的內容或插入點向上移動
0152
0153 *
0154
0155 * @param pos
0156
0157 *            移動的距離
0158
0159 */
0160
0161 public void moveUp(int pos) {
0162
0163 if (selection == null)
0164
0165 selection = Dispatch.get(word, "Selection").toDispatch();
0166
0167 for (int i = 0; i < pos; i++)
0168
0169 Dispatch.call(selection, "MoveUp");
0170
0171 }
0172
0173 /**
0174
0175 * 把選定的內容或者插入點向下移動
0176
0177 *
0178
0179 * @param pos
0180
0181 *            移動的距離
0182
0183 */
0184
0185 public void moveDown(int pos) {
0186
0187 if (selection == null)
0188
0189 selection = Dispatch.get(word, "Selection").toDispatch();
0190
0191 for (int i = 0; i < pos; i++)
0192
0193 Dispatch.call(selection, "MoveDown");
0194
0195 }
0196
0197 /**
0198
0199 * 把選定的內容或者插入點向左移動
0200
0201 *
0202
0203 * @param pos
0204
0205 *            移動的距離
0206
0207 */
0208
0209 public void moveLeft(int pos) {
0210
0211 if (selection == null)
0212
0213 selection = Dispatch.get(word, "Selection").toDispatch();
0214
0215 for (int i = 0; i < pos; i++) {
0216
0217 Dispatch.call(selection, "MoveLeft");
0218
0219 }
0220
0221 }
0222
0223 /**
0224
0225 * 把選定的內容或者插入點向右移動
0226
0227 *
0228
0229 * @param pos
0230
0231 *            移動的距離
0232
0233 */
0234
0235 public void moveRight(int pos) {
0236
0237 if (selection == null)
0238
0239 selection = Dispatch.get(word, "Selection").toDispatch();
0240
0241 for (int i = 0; i < pos; i++)
0242
0243 Dispatch.call(selection, "MoveRight");
0244
0245 }
0246
0247 /**
0248
0249 * 把插入點移動到檔案首位置
0250
0251 *
0252
0253 */
0254
0255 public void moveStart() {
0256
0257 if (selection == null)
0258
0259 selection = Dispatch.get(word, "Selection").toDispatch();
0260
0261 Dispatch.call(selection, "HomeKey"new Variant(6));
0262
0263 }
0264
0265 /**
0266
0267 * 從選定內容或插入點開始查詢文字
0268
0269 *
0270
0271 * @param toFindText
0272
0273 *            要查詢的文字
0274
0275 * @return boolean true-查詢到並選中該文字,false-未查詢到文字
0276
0277 */
0278
0279 @SuppressWarnings("static-access")
0280
0281 public boolean find(String toFindText) {
0282
0283 if (toFindText == null || toFindText.equals(""))
0284
0285 return false;
0286
0287 // 從selection所在位置開始查詢
0288
0289 Dispatch find = word.call(selection, "Find").toDispatch();
0290
0291 // 設定要查詢的內容
0292
0293 Dispatch.put(find, "Text", toFindText);
0294
0295 // 向前查詢
0296
0297 Dispatch.put(find, "Forward""True");
0298
0299 // 設定格式
0300
0301 Dispatch.put(find, "Format""True");
0302
0303 // 大小寫匹配
0304
0305 Dispatch.put(find, "MatchCase""True");
0306
0307 // 全字匹配
0308
0309 Dispatch.put(find, "MatchWholeWord""True");
0310
0311 // 查詢並選中
0312
0313 return Dispatch.call(find, "Execute").getBoolean();
0314
0315 }
0316
0317 /**
0318
0319 * 把選定選定內容設定為替換文字
0320