日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jacob操作office word简单教程

發布時間:2024/1/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jacob操作office word简单教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現在的項目中操作word文件比較多,word文件的加密解密,轉換為各種格式,插入圖片,添加水印、html轉word等等各種東西,大家也都知道,java語言是不能直接操作word或者excel的,不像C#,可以調用VBA的類來直接操作office。
???
目前java也有一些操作office的開源框架,比如poi,這個沒怎么研究過,我估摸著它是通過解析office的xml文檔模型來操作office的,因為office03和office07以及以上的文檔模型結構不太一樣,導致了poi處理不同版本office時要用不同的類,我用的最多的是jacob,它對office03和office07的操作基本一致,高版本的還沒有試過,通過最近一段時間的使用,給大家分享一下我的心得。


簡介:
jacob(java com bridge,java com橋)分為兩個部分,jacob.jar,jacob.dll,使用時兩個東西的版本要一致,而且還分32位和64位,它的位數和jdk的位數有關,與操作系統的位數無關。它的原理是通過java的jni功能,調用系統組件dll,通過這個com橋來操作com組件(windows的一種軟件編程技術吧),最終完成對office文檔的操作。

環境配置:
1、在工程中引入jar包
2、將dll文件放在jdk的path目錄下面,通過System.getProperty("java.library.path");可以看到path路徑,或者直接放到jdk/bin、jre/bin、system32/system64下面都放一份,總能找得到,版本要急著對應好。
3、附件為我使用的組件,好像是1.14版本,配合32位jdk使用。


常用類以及方法
ComThread:com組件管理,用來初始化com線程,釋放線程,所以會在操作office之前使用,操作完成再使用。
ActiveXComponent:創建office的一個應用,比如你操作的是word還是excel
Dispatch:調度處理類,封裝了一些操作來操作office,里面所有的可操作對象基本都是這種類型,所以jacob是一種鏈式操作模式,就像StringBuilder對象,調用append()方法之后返回的還是StringBuilder對象
Variant:封裝參數數據類型,因為操作office是的一些方法參數,可能是字符串類型,可能是數字類型,雖然都是1,但是不能通過,可以通過Variant來進行轉換通用的參數類型,new Variant(1),new Variant("1"),
Dispatch的幾種靜態方法:這些方法就是要用來操作office的。
?call( )方法:調用COM對象的方法,返回Variant類型值。
?invoke( )方法:和call方法作用相同,但是不返回值。
?get( )方法:獲取COM對象屬性,返回variant類型值。
?put( )方法:設置COM對象屬性。
以上方法中有的有很多重載方法,調用不同的方法時需要放置不同的參數,至于哪些參數代表什么意思,具體放什么值,就需要參考vba代碼了,僅靠jacob是無法進行變成的。
Variant對象的toDispatch()方法:將以上方法返回的Variant類型轉換為Dispatch,進行下一次鏈式操作。


結合vba來進行一些操作的解讀(以word為例,excel基本上差不多)
jacob操作office網上也有很多教程,比如打開文檔,保存,插入圖片之類的,看了那些,也只能會這幾種操作,jacob文檔中也不會有那種操作參數是什么,現在我結合vba代碼分享一下我的理解,有什么新的操作就可以自己來完成。
1、初始化com線程
使用jacob之前使用下面的語句來初始化com線程,大概意思是打開冰箱門,準備放大象。。。
Java代碼 ?
  • ComThread.InitSTA();??
  • ComThread.InitSTA();
    使用完成后使用下面的語句來關閉現場,大概意思是關上冰箱門。。。
    Java代碼 ?
  • ComThread.Release();??
  • ComThread.Release();

    2、創建應用程序對象,設置參數,得到文檔集合
    操作一個文檔之前,我們必須要創建一個應用對應,比如是word還是excel,設置一些文檔應用的參數,得到文檔集合對象,(大家應該知道word是Documents,excel是WorkBooks)
    Java代碼 ?
  • ActiveXComponent?wordApp?=?new?ActiveXComponent("Word.Application");//word??
  • ActiveXComponent?wordApp?=?new?ActiveXComponent("Excel.Application");//excel??
  • wordApp.setProperty("Visible",?new?Variant(false));//設置應用操作是文檔不在明面上顯示,只在后臺靜默處理。??
  • ActiveXComponent wordApp = new ActiveXComponent("Word.Application");//word ActiveXComponent wordApp = new ActiveXComponent("Excel.Application");//excel wordApp.setProperty("Visible", new Variant(false));//設置應用操作是文檔不在明面上顯示,只在后臺靜默處理。
    這個操作就是模仿vba的寫法,Application.Visible = False;vba代碼中的對application的設置這里都可以用
    C#的寫法:new Microsoft.Office.Interop.Word.Application().Visible = false; 意思差不多
    獲得文檔集合,用來操作我們需要處理的文檔,
    Java代碼 ?
  • Dispatch?document?=?wordApp.getProperty("Documents").toDispatch();??
  • Dispatch document = wordApp.getProperty("Documents").toDispatch();
    vba寫法Application.Documents,C#的寫法:new Microsoft.Office.Interop.Word.Application().Documents
    可以看出來基本相似,如果對c#比較熟悉的話,可以直接從c#中翻譯過來,不熟悉的話可以直接網上查vba代碼,進行翻譯。

    3、打開文檔
    有了文檔對象集合,我們就可以來操作文檔了,鏈式操作就此開始:
    call方法,調用open方法,傳遞一個參數,返回一個我們的word文檔對象,
    Java代碼 ?
  • Dispatch?doc?=?Dispatch.call(document,?"Open",new?Variant("D:\\my.doc")).toDispatch();??
  • Dispatch doc = Dispatch.call(document, "Open",new Variant("D:\\my.doc")).toDispatch();
    同樣從vba代碼翻譯過來,很多vba代碼我們可以在word文檔中自己找到,




    從vba代碼中可以看到documents的open方法打開了一個文檔,第一個參數就是文檔的路徑,后面的參數大家可以自己去研究,參數多的有多參數的方法,還有數據參數的方法,都可以用來調用。
    現在打開了一個文檔,我們可以進行操作了。

    4、操作文檔,每頁插入一個圖片,并調整大小和位置
    我錄制一個宏插入圖片,翻到下一頁,再插入一個圖片,查看vba代碼如下:


    其中里面的Selection代表當前光標位置或者所選范圍,官方解釋如下:
    該對象代表窗口或窗格中的當前所選內容。所選內容代表文檔中被選定(或突出顯示的)的區域,若文檔中沒有所選內容,則代表插入點。每個文檔窗格只能有一個活動的 Selection對象,并且整個應用程序中只能有一個活動的 Selection對象。
    翻譯為java代碼為:

    Java代碼 ?
  • for(int?i?=?0;?i?<?2;i++){??
  • ????????????Dispatch?selection?=?Dispatch.get(wordApp,?"Selection").toDispatch();??
  • ????????????Dispatch?inLineShapes?=?Dispatch.get(selection,?"InLineShapes").toDispatch();???
  • ????????????Dispatch?picture?=?Dispatch.call(inLineShapes,?"AddPicture",?imgPath).toDispatch();???
  • ????????????//選中圖片??
  • ????????????Dispatch.call(picture,?"Select");???
  • ????????????//設置寬度高度??
  • ??????????????
  • ????????????Dispatch.put(picture,?"Width",?new?Variant(10));???
  • ????????????Dispatch.put(picture,?"Height",?new?Variant(10));???
  • ??????????????
  • ????????????//設置圖片相對左上角偏移位置??
  • ????????????selection?=?Dispatch.get(wordApp,?"Selection").toDispatch();??
  • ????????????Dispatch?shapeRange?=?Dispatch.get(selection,?"ShapeRange").toDispatch();??
  • ????????????Dispatch.put(shapeRange,?"Left",?new?Variant(left));??
  • ????????????Dispatch.put(shapeRange,?"Top",?new?Variant(top));??
  • ??????????????
  • ????????????//翻到下一頁??
  • ????????????Dispatch?browser?=?Dispatch.get(wordApp,?"Browser").toDispatch();??
  • ????????????Dispatch.call(browser,?"Next");??
  • ????????}??
  • for(int i = 0; i < 2;i++){Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch();Dispatch inLineShapes = Dispatch.get(selection, "InLineShapes").toDispatch(); Dispatch picture = Dispatch.call(inLineShapes, "AddPicture", imgPath).toDispatch(); //選中圖片Dispatch.call(picture, "Select"); //設置寬度高度Dispatch.put(picture, "Width", new Variant(10)); Dispatch.put(picture, "Height", new Variant(10)); //設置圖片相對左上角偏移位置selection = Dispatch.get(wordApp, "Selection").toDispatch();Dispatch shapeRange = Dispatch.get(selection, "ShapeRange").toDispatch();Dispatch.put(shapeRange, "Left", new Variant(left));Dispatch.put(shapeRange, "Top", new Variant(top));//翻到下一頁Dispatch browser = Dispatch.get(wordApp, "Browser").toDispatch();Dispatch.call(browser, "Next");}
    從上面的代碼可以看出,每一行代碼獲取一個對象,相應于vba的用“.”點出來的一個對象,大概意思就是得到選中位置,得到圖形范圍,插入圖片,選中圖片,設置寬高,設置相對當前頁的左邊距,上邊距,然后將Application.Browser.Next翻譯為最后兩行代碼,翻到下一頁,繼續插入圖片進行處理。
    這里是固定的頁碼,如果我們不知道文檔的頁碼呢,請看下一個案例。


    5、得到word文檔的頁碼:
    網上找到一段獲取文檔頁數的VBA代碼Selection.Information(wdNumberOfPagesInDocument),按照我們的理解,翻譯為java代碼為: Java代碼 ?
  • Dispatch?selection?=?Dispatch.get(wordApp,?"Selection").toDispatch();??
  • //如果調用方法或者屬性要得到某個值的話,直接tostring或者別的就可以了??
  • pages?=?Dispatch.call(selection,?"Information",new?Variant(4)).toString();??
  • Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch(); //如果調用方法或者屬性要得到某個值的話,直接tostring或者別的就可以了 pages = Dispatch.call(selection, "Information",new Variant(4)).toString();
    調用selection的Information方法,傳入一個參數可以看到,參數中我寫的是4,哪里來的呢?
    vba中的wdNumberOfPagesInDocument,我們不知道是什么,肯定是一個常量,都說在msdn上能找到,我是找不到,我有個辦法,
    打開我們word中的vba編輯器,吧vba代碼貼到我們錄制的宏的第一行,左邊添加一個端點,運行一下,



    這樣就可以看到常量值了,是4,寫上就行可,可以得到頁碼的結果,另外還有一種獲得頁數的方法:
    ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)

    比葫蘆畫瓢,翻譯為java代碼為
    Java代碼 ?
  • Dispatch?activeDocument??=?Dispatch.get(wordApp,?"ActiveDocument").toDispatch();???
  • pages?=?Dispatch.call(activeDocument,?"BuiltInDocumentProperties",new?Variant(14)).toString();??
  • Dispatch activeDocument = Dispatch.get(wordApp, "ActiveDocument").toDispatch(); pages = Dispatch.call(activeDocument, "BuiltInDocumentProperties",new Variant(14)).toString();
    通過wordApp獲取ActiveDocument對象,調用它的BuiltInDocumentProperties方法,傳入一個參數wdPropertyPages的值是14,而上面的還有另外一種寫法,官方解釋說以下兩行代碼意思一樣,所以還可以翻譯為另一種寫法
    BuiltinDocumentProperties.Item(1)?
    BuiltinDocumentProperties(1)

    先獲取BuiltinDocumentProperties對象,再調用Item方法 Java代碼 ?
  • Dispatch?activeDocument??=?Dispatch.get(wordApp,?"ActiveDocument").toDispatch();???
  • Dispatch?builtInDocumentProperties??=?Dispatch.get(activeDocument,?"BuiltInDocumentProperties").toDispatch();???
  • pages?=?Dispatch.call(builtInDocumentProperties,?"Item",new?Variant(14)).toString();??
  • Dispatch activeDocument = Dispatch.get(wordApp, "ActiveDocument").toDispatch(); Dispatch builtInDocumentProperties = Dispatch.get(activeDocument, "BuiltInDocumentProperties").toDispatch(); pages = Dispatch.call(builtInDocumentProperties, "Item",new Variant(14)).toString();

    6、保存文檔
    Java代碼 ?
  • Dispatch.call(doc,?"Save");??
  • Dispatch.call(doc, "Save");
    doc是我們打開的文檔的對象

    7、退出wordapplication
    參數有很多個,我們一個都不傳,執行完后winword進程關閉 Java代碼 ?
  • wordApp.invoke("Quit",?new?Variant[]?{});??
  • wordApp.invoke("Quit", new Variant[] {});

    8、釋放com線程
    Java代碼 ?
  • ComThread.Release();??
  • ComThread.Release();

    結束
    ??? 以上是兩個小案例還分享一下我個人的心得,個人感覺jacob還是很好用的,只不過有時候有的對象不知道怎么獲取,只能一點一點的嘗試,比如selection,activeDocument,錄制宏也看不到是怎么來的,最終發現都是wordapplication來的,所以宏里面開始的東西如果找不到都可以從application里面去找的。
    歡迎大家共同研究,如有不正確的地方歡迎指正。

    總結

    以上是生活随笔為你收集整理的jacob操作office word简单教程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。