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 |