可參考文檔:
http://wibiline.iteye.com/blog/1725492
下載jar包
http://download.csdn.net/download/javashixiaofei/9696752
如上是jacob-1.17-M2.jar對應的jar包和dll文件....但是我在maven倉庫中並沒有發現jacob-1.17版本的.
所以如果使用maven項目的話推薦下載jacob-1.14版本的jar包和dll文件.
http://download.csdn.net/detail/ab873497717/5853741這個是dll文件,jar包文件可以去Maven倉庫中去找.
使用方式:
import java.io.File; import java.io.FileInputStream; import java.util.ArrayList; import java.util.Arrays; import com.jacob.activeX.ActiveXComponent; public class WriteDoc2 { public static void main(String[] args) { //在正式批量跑之前,做單個word文檔的測試. WordUtils util = new WordUtils(true); util.openDocument("C:\\Users\\ABC\\Desktop\\test.docx"); util.setSaveOnExit(true); util.insertText("xxx444dddd4x"); util.saveAs("C:\\Users\\ABC\\Desktop\\test.docx"); util.closeDocument(); } }
對應WordUtils.java工具類,我是使用的如下:
import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class WordUtils { // word運行程序對象 private ActiveXComponent word; // 所有word文檔集合 private Dispatch documents; // word文檔 private Dispatch doc; // 選定的范圍或插入點 private Dispatch selection; // 保存退出 private boolean saveOnExit; public WordUtils(boolean visible) { word = new ActiveXComponent("Word.Application"); word.setProperty("Visible", new Variant(visible)); documents = word.getProperty("Documents").toDispatch(); } /** * 設置退出時參數 * * @param saveOnExit * boolean true-退出時保存文件,false-退出時不保存文件 */ public void setSaveOnExit(boolean saveOnExit) { this.saveOnExit = saveOnExit; } /** * 創建一個新的word文檔 */ public void createNewDocument() { doc = Dispatch.call(documents, "Add").toDispatch(); selection = Dispatch.get(word, "Selection").toDispatch(); } /** * 打開一個已經存在的word文檔 * * @param docPath */ public void openDocument(String docPath) { doc = Dispatch.call(documents, "Open", docPath).toDispatch(); selection = Dispatch.get(word, "Selection").toDispatch(); } /** * 打開一個有密碼保護的word文檔 * @param docPath * @param password */ public void openDocument(String docPath, String password) { doc = Dispatch.call(documents, "Open", docPath).toDispatch(); unProtect(password); selection = Dispatch.get(word, "Selection").toDispatch(); } /** * 去掉密碼保護 * @param password */ public void unProtect(String password){ try{ String protectionType = Dispatch.get(doc, "ProtectionType").toString(); if(!"-1".equals(protectionType)){ Dispatch.call(doc, "Unprotect", password); } }catch(Exception e){ e.printStackTrace(); } } /** * 添加密碼保護 * @param password */ public void protect(String password){ String protectionType = Dispatch.get(doc, "ProtectionType").toString(); if("-1".equals(protectionType)){ Dispatch.call(doc, "Protect",new Object[]{new Variant(3), new Variant(true), password}); } } /** * 顯示審閱的最終狀態 */ public void showFinalState(){ Dispatch.call(doc, "AcceptAllRevisionsShown"); } /** * 打印預覽: */ public void printpreview() { Dispatch.call(doc, "PrintPreView"); } /** * 打印 */ public void print(){ Dispatch.call(doc, "PrintOut"); } public void print(String printerName) { word.setProperty("ActivePrinter", new Variant(printerName)); print(); } /** * 指定打印機名稱和打印輸出工作名稱 * @param printerName * @param outputName */ public void print(String printerName, String outputName){ word.setProperty("ActivePrinter", new Variant(printerName)); Dispatch.call(doc, "PrintOut", new Variant[]{new Variant(false), new Variant(false), new Variant(0), new Variant(outputName)}); } /** * 把選定的內容或插入點向上移動 * * @param pos */ public void moveUp(int pos) { move("MoveUp", pos); } /** * 把選定的內容或者插入點向下移動 * * @param pos */ public void moveDown(int pos) { move("MoveDown", pos); } /** * 把選定的內容或者插入點向左移動 * * @param pos */ public void moveLeft(int pos) { move("MoveLeft", pos); } /** * 把選定的內容或者插入點向右移動 * * @param pos */ public void moveRight(int pos) { move("MoveRight", pos); } /** * 把選定的內容或者插入點向右移動 */ public void moveRight() { Dispatch.call(getSelection(), "MoveRight"); } /** * 把選定的內容或者插入點向指定的方向移動 * @param actionName * @param pos */ private void move(String actionName, int pos) { for (int i = 0; i < pos; i++) Dispatch.call(getSelection(), actionName); } /** * 把插入點移動到文件首位置 */ public void moveStart(){ Dispatch.call(getSelection(), "HomeKey", new Variant(6)); } /** * 把插入點移動到文件末尾位置 */ public void moveEnd(){ Dispatch.call(getSelection(), "EndKey", new Variant(6)); } /** * 插入換頁符 */ public void newPage(){ Dispatch.call(getSelection(), "InsertBreak"); } public void nextPage(){ moveEnd(); moveDown(1); } public int getPageCount(){ Dispatch selection = Dispatch.get(word, "Selection").toDispatch(); return Dispatch.call(selection,"information", new Variant(4)).getInt(); } /** * 獲取當前的選定的內容或者插入點 * @return 當前的選定的內容或者插入點 */ public Dispatch getSelection(){ if (selection == null) selection = Dispatch.get(word, "Selection").toDispatch(); return selection; } /** * 從選定內容或插入點開始查找文本 * @param findText 要查找的文本 * @return boolean true-查找到並選中該文本,false-未查找到文本 */ public boolean find(String findText){ if(findText == null || findText.equals("")){ return false; } // 從selection所在位置開始查詢 Dispatch find = Dispatch.call(getSelection(), "Find").toDispatch(); // 設置要查找的內容 Dispatch.put(find, "Text", findText); // 向前查找 Dispatch.put(find, "Forward", "True"); // 設置格式 Dispatch.put(find, "Format", "True"); // 大小寫匹配 Dispatch.put(find, "MatchCase", "True"); // 全字匹配 Dispatch.put(find, "MatchWholeWord", "True"); // 查找並選中 return Dispatch.call(find, "Execute").getBoolean(); } /** * 查找並替換文字 * @param findText * @param newText * @return boolean true-查找到並替換該文本,false-未查找到文本 */ public boolean replaceText(String findText, String newText){ moveStart(); if (!find(findText)) return false; Dispatch.put(getSelection(), "Text", newText); return true; } /** * 進入頁眉視圖 */ public void headerView(){ //取得活動窗體對象 Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch(); //取得活動窗格對象 Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch(); //取得視窗對象 Dispatch view = Dispatch.get(ActivePane, "View").toDispatch(); Dispatch.put(view, "SeekView", "9"); } /** * 進入頁腳視圖 */ public void footerView(){ //取得活動窗體對象 Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch(); //取得活動窗格對象 Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch(); //取得視窗對象 Dispatch view = Dispatch.get(ActivePane, "View").toDispatch(); Dispatch.put(view, "SeekView", "10"); } /** * 進入普通視圖 */ public void pageView(){ //取得活動窗體對象 Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch(); //取得活動窗格對象 Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch(); //取得視窗對象 Dispatch view = Dispatch.get(ActivePane, "View").toDispatch(); Dispatch.put(view, "SeekView", new Variant(0));//普通視圖 } /** * 全局替換文本 * @param findText * @param newText */ public void replaceAllText(String findText, String newText){ int count = getPageCount(); for(int i = 0; i < count; i++){ headerView(); while (find(findText)){ Dispatch.put(getSelection(), "Text", newText); moveEnd(); } footerView(); while (find(findText)){ Dispatch.put(getSelection(), "Text", newText); moveStart(); } pageView(); moveStart(); while (find(findText)){ Dispatch.put(getSelection(), "Text", newText); moveStart(); } nextPage(); } } /** * 全局替換文本 * @param findText * @param newText */ public void replaceAllText(String findText, String newText, String fontName, int size){ /****插入頁眉頁腳*****/ //取得活動窗體對象 Dispatch ActiveWindow = word.getProperty( "ActiveWindow").toDispatch(); //取得活動窗格對象 Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane").toDispatch(); //取得視窗對象 Dispatch view = Dispatch.get(ActivePane, "View").toDispatch(); /****設置頁眉*****/ Dispatch.put(view, "SeekView", "9"); while (find(findText)){ Dispatch.put(getSelection(), "Text", newText); moveStart(); } /****設置頁腳*****/ Dispatch.put(view, "SeekView", "10"); while (find(findText)){ Dispatch.put(getSelection(), "Text", newText); moveStart(); } Dispatch.put(view, "SeekView", new Variant(0));//恢復視圖 moveStart(); while (find(findText)){ Dispatch.put(getSelection(), "Text", newText); putFontSize(getSelection(), fontName, size); moveStart(); } } /** * 設置選中或當前插入點的字體 * @param selection * @param fontName * @param size */ public void putFontSize(Dispatch selection, String fontName, int size){ Dispatch font = Dispatch.get(selection, "Font").toDispatch(); Dispatch.put(font, "Name", new Variant(fontName)); Dispatch.put(font, "Size", new Variant(size)); } /** * 在當前插入點插入字符串 */ public void insertText(String text){ Dispatch.put(getSelection(), "Text", text); } /** * 將指定的文本替換成圖片 * @param findText * @param imagePath * @return boolean true-查找到並替換該文本,false-未查找到文本 */ public boolean replaceImage(String findText, String imagePath, int width, int height){ moveStart(); if (!find(findText)) return false; Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select"); Dispatch.put(picture, "Width", new Variant(width)); Dispatch.put(picture, "Height", new Variant(height)); moveRight(); return true; } /** * 全局將指定的文本替換成圖片 * @param findText * @param imagePath */ public void replaceAllImage(String findText, String imagePath, int width, int height){ moveStart(); while (find(findText)){ Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select"); Dispatch.put(picture, "Width", new Variant(width)); Dispatch.put(picture, "Height", new Variant(height)); moveStart(); } } /** * 在當前插入點中插入圖片 * @param imagePath */ public void insertImage(String imagePath, int width, int height){ Dispatch picture = Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select"); Dispatch.put(picture, "Width", new Variant(width)); Dispatch.put(picture, "Height", new Variant(height)); moveRight(); } /** * 在當前插入點中插入圖片 * @param imagePath */ public void insertImage(String imagePath){ Dispatch.call(Dispatch.get(getSelection(), "InLineShapes").toDispatch(), "AddPicture", imagePath); } /** * 獲取書簽的位置 * @param bookmarkName * @return 書簽的位置 */ public Dispatch getBookmark(String bookmarkName){ try{ Dispatch bookmark = Dispatch.call(this.doc, "Bookmarks", bookmarkName).toDispatch(); return Dispatch.get(bookmark, "Range").toDispatch(); }catch(Exception e){ e.printStackTrace(); } return null; } /** * 在指定的書簽位置插入圖片 * @param bookmarkName * @param imagePath */ public void insertImageAtBookmark(String bookmarkName, String imagePath){ Dispatch dispatch = getBookmark(bookmarkName); if(dispatch != null) Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath); } /** * 在指定的書簽位置插入圖片 * @param bookmarkName * @param imagePath * @param width * @param height */ public void insertImageAtBookmark(String bookmarkName, String imagePath, int width, int height){ Dispatch dispatch = getBookmark(bookmarkName); if(dispatch != null){ Dispatch picture = Dispatch.call(Dispatch.get(dispatch, "InLineShapes").toDispatch(), "AddPicture", imagePath).toDispatch(); Dispatch.call(picture, "Select"); Dispatch.put(picture, "Width", new Variant(width)); Dispatch.put(picture, "Height", new Variant(height)); } } /** * 在指定的書簽位置插入文本 * @param bookmarkName * @param text */ public void insertAtBookmark(String bookmarkName, String text){ Dispatch dispatch = getBookmark(bookmarkName); if(dispatch != null) Dispatch.put(dispatch, "Text", text); } /** * 文檔另存為 * @param savePath */ public void saveAs(String savePath){ Dispatch.call(doc, "SaveAs", savePath); } /** * 文檔另存為PDF * <b><p>注意:此操作要求word是2007版本或以上版本且裝有加載項:Microsoft Save as PDF 或 XPS</p></b> * @param savePath */ public void saveAsPdf(String savePath){ Dispatch.call(doc, "SaveAs", new Variant(17)); } /** * 保存文檔 * @param savePath */ public void save(String savePath){ Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),"FileSaveAs", savePath); } /** * 關閉word文檔 */ public void closeDocument(){ if (doc != null) { Dispatch.call(doc, "Close", new Variant(saveOnExit)); doc = null; } } public void exit(){ word.invoke("Quit", new Variant[0]); } }
具體WordUtils類的使用暫時沒有看到更多的例子,上面的util的使用是自己摸索出來的,可能不是最優,最恰當的.
//==================================================================================================
使用Java工具POI操作MicroSoft Office套件Word,Excle和PPT使用Maven工程的話需要在Pom.xml文件中引入的jar包.
一開始是想使用POI工具操作,但是從網上找來的代碼始終報編譯錯誤,代碼中的一些類找不到,但是也明明已經引入了poi-3.x.jar包文件,更換了好幾個poi版本的jar包仍是一樣的效果.
隨后調查,到底需要哪些jar包.....結果如下:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.8</version> </dependency>
所依賴的全部jar包的截圖

如果只引入一個poi-3.x.jar包是會報錯的. POI具體操作Word,Excel,和PPT的代碼,自行百度.只要jar包引入的正確,運行編譯代碼就沒有問題.
