




已阅读5页,还剩72页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何用java调用word.exe的宏和其他功能?1JACOB使用入门及问题解析6什么是JACOB12java访问com组件_jacob使用指南16如何使用jacob将word转换为PDF19使用jsp实现word、excel格式报表打印32Java操作Microsoft Word之jacob (一)40如何用java调用word.exe的宏和其他功能?继续上面的,现在发布一下我使用jacob调用word文件中的宏的代码。首先说明一下,由于jacob是java与com之间的bridge,所以先描述一下使用vb调用上面的MyWordMacro宏的代码,这样可以与java代码作比较,更利于理解jacob的工作方式:Sub AutomateWord_OpenDoc()Dim wrdApp As ObjectDim wrdDoc As ObjectDim strFileName As StringSet wrdApp = CreateObject(Word.Application)On Error GoTo DocError包含marco的word文件strFileName = c:MacroTest.doc打开文件Set wrdDoc = wrdApp.Documents.Open(strFileName)运行宏wrdDoc.MyWordMacro (This is a test.)DocError:If Err.Number 0 Then MsgBox Err.Description退出wordwrdApp.Quit清除内存Set wrdApp = NothingSet wrdDoc = NothingEnd SubPrivate Sub Command1_Click()AutomateWord_OpenDocEnd Sub而对应的java代码如下:package com.bjinfotech.practice.jacob;import .*;import com.jacob.activeX.*;/* * 调用word文件中的宏 * author 聪明的猪 * */public class Dispatch_MSWordMacro /* * 打开word,调用word中的宏 * param filePath word文件路径 * param macroName 被调用的宏名字 * param parameter 调用宏的参数数组 */public void callWordMacro(String filePath,String macroName,Object parameter)/建立ActiveX部件ActiveXComponent wrdCom=new ActiveXComponent(Word.Application);try/返回wrdCom.Documents的DispatchObject wrdDocs=wrdCom.getProperty(Documents).toDispatch();/调用wrdCom.Documents.Open方法打开指定的word文档,返回wordDocObject wrdDoc=Dispatch.invoke(wrdDocs,Open,Dispatch.Method,new ObjectfilePath,new int1).toDispatch();/使用方法传入的参数parameter调用word文档中的MyWordMacro宏/Dispatch.call(wrdDoc,macroName,parameter);Dispatch.invoke(wrdDoc,macroName,Dispatch.Method,parameter,new int1);catch(Exception ex)ex.printStackTrace();finally/关闭word文件wrdCom.invoke(Quit,new Variant);public static void main(String argv)Dispatch_MSWordMacro d=new Dispatch_MSWordMacro();d.callWordMacro(E:/eclipse3.1RC3/workspace/jacobPractice/src/com/bjinfotech/practice/jacob/MacroTest.doc,MyWordMacro,new String这是测试信息);很明显,使用的方法与在vb等vs工具中相同,只不过在调用方法时使用了Dispatch,获得属性时使用了getProperty方法。参考资料:jacob的官方文档:/jacob/微软的javasdk文档:/v1/IIwuQ7rQyGCn-b-f4biL9n_xAwI_Oh3ieuWVDkLfPpaKBmRUjeUzAtCy5oljSMgzdV6OZMRRgrEwU1_RtIXS-h0h7O9W4RB7aUs48A/sdkdocs.zip.aa/v1/IIwuQzpwMrin-b-fbkPTfyGj7CXbfLb0h3lkvGL1GKMwCNpXXRKiKDwe3cx9aUVjO3KWdb7cPJWmqAXUCY_As6XeyLDKoGLYd7ez6g/sdkdocs.zip.ab注意:这个压缩包是被分割的,在console中使用type sdkdocs.zip.aa sdkdocs.ab sdkdocs.zip,进行合并。 JACOB使用入门及问题解析最近在帮个朋友做java调用office的东东,花了些时间,终于搞定了由于问题多多,现在把过程和大家分享:首先,大家先要了解一下jacob ,官方的解释是Java COM Bridge,即java和com组件间的桥梁(进一步了解com/dcom: /com/)com一般表现为dll或exe等二进制文件,像我们呆会会用到的jacob.dll文件这里说说为什么我们用java去操纵office(如:word)要使用com,而不直接使用java去做?首先,我们清楚office是建立在windows平台之上的,本身是一个软件,除了他自己提供的宏似乎没有什么能对他进行直接的操作;在windows平台上为了解决像这样的不同应用软件,通信缺乏通用api问题,推出了com的解决方案;我们使用dll中的一组或多组相关的函数存取组件数据,总的合称为接口具体到每个细节的实现称为方法;如果我们要调用接口里的方法,唯一的途径就是调用指向接口的指针; 所以总的来说使用就是dll完成api的转换;如果你听不懂,则称为废话(不懂没关系,会用就好,用久自然懂了);开玩笑,呵呵好了com讲完,我们开始我们的主要内容吧!大家先下载这里jacob_1.9.zip里面的jacob.jar是我们要用的包 jacob.dll就是我前面说的com组件把包里的jacob.dll放到c:/windows/system32下讲解麻烦,画个图大家看 好值得注意的是,不同的版本的系统使用不同的dll文件所以如果你编译成功,但运行失败一般是dll文件问题遇到这种情况,可以到/jacob-project/jacob_1.9.zip?modtime=1109437002&big_mirror=0下载其他的版本的 dll 文件。先给大家个word的测试代码(经过更改该代码在我的机器上运行正常)以后有会找时间,推出其他的office代码 import com.jacob.activeX.ActiveXComponent;import .ComException;import .Dispatch;import .Variant;public class WordDocumentProperties / 声明一个word对象 private ActiveXComponentobjWord; / 声明四个word组件 private DispatchcustDocprops; private DispatchbuiltInDocProps; private Dispatchdocument; private DispatchwordObject; public WordDocumentProperties() /*/ /* *打开word文挡 */ public void open(Stringfilename) / 创建一个word对象 objWord = new ActiveXComponent( Word.Application ); / 为wordobject组件附值 wordObject = (Dispatch)(objWord.getObject(); / 改了这里 / 生成一个只读方式的word文挡组件 Dispatch.put(wordObject, Visible , new Variant( false ); / 获取文挡属性 Dispatchdocuments = objWord.getProperty( Documents ).toDispatch(); / 打开激活文挡 document = Dispatch.call(documents, Open ,filename).toDispatch(); public void selectCustomDocumentProperitiesMode() custDocprops = Dispatch.get(document, CustomDocumentProperties ).toDispatch(); public void selectBuiltinPropertiesMode() builtInDocProps = Dispatch.get(document, BuiltInDocumentProperties ).toDispatch(); /*/ /* *关闭文挡 */ public void close() Dispatch.call(document, Close ); public StringgetCustomProperty(StringcusPropName) try cusPropName = Dispatch.call(Dispatch)custDocprops, Item ,cusPropName).toString(); catch (ComExceptione) cusPropName = null ; return cusPropName; public StringgetBuiltInProperty(StringbuiltInPropName) try builtInPropName = Dispatch.call(Dispatch)builtInDocProps, Item ,builtInPropName).toString(); catch (ComExceptione) builtInPropName = null ; return builtInPropName; public static void main(Stringargs) try WordDocumentPropertiesjacTest = new WordDocumentProperties();jacTest.open( s.doc );jacTest.selectCustomDocumentProperitiesMode();jacTest.selectBuiltinPropertiesMode();StringcustValue = jacTest.getCustomProperty( InformationSource );StringbuiltInValue = jacTest.getBuiltInProperty( Author );jacTest.close();System.out.println( DocumentValOne: + custValue);System.out.println( DocumentAuthor: + builtInValue); catch (Exceptione) System.out.println(e); 什么是JACOBJACOB是一个JAVA和COM之间的桥接口。它使得你可以在Java中自动控制COM组件。它使用JNI通过本地调用COM和Win32程序接口。JACOB 就是 Java-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。Jacob的安装非常的简单,我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件。Jacob直接放到系统的system32文件夹下就行了,连注册都不用的(或者拷贝到jdk或者jre的bin目录下也行,当前测试文件所在的目录也行,就是只要在java.library.path中就可以)。而jacob.jar设置到classpath中去就可以了,或者在IDE开发环境的工程中设置扩展库也一样的。JACOB的语法如果你想写一个JAVA代码,其中需要调用JACOB提供的功能,而你还是新手,也许篇文章会大大降低你的花费时间。 下面是一个关于JACOB的代码分成的几个步骤:1) ActiveXComponent ax = new ActiveXComponent(a1);/构建ActiveX组件实例其中的a1的值和你需要调用的ActiveX控件有关2) Dispatch ds = ax.getObject()。 toDispatch();/获取Dispatch对象,我们可以把每个Dispatch对象看成是对Activex控件的一个操作,这一步是获得该ActiveX控件的控制权。(注:浅析JACOB 中提到过Variant类,这里的ax.getObject()便是获得该对象,我们将其转化为任何对象(类型)3) Dispatch ds1 = Dispatch.get(ds, a2)。toDispatch(); /获取该ActiveX对象数据结构中的a2属性4) Dispatch d2 = Dispatch.invoke(ds1, a3, a4, a5, a6)。toDispatch(); /功能调用,对ActiveX对象ds1的a3属性执行a4(Dispatch.PutDispatch.Get等)操作,执行后a3的值为a5,a6为错误参数码常定义为new int1,(注:call、get和put方法都是通过该方法实现的)5) Dispatch ds2 = Dispatch.put(ds, a7,a8)。toDispatch();/将ActiveX对象ds的属性a4的值设置为a5,该方法返回类型同get一样6) Dispatch ds3 = Dispatch.call(ds1, a9, a10);/该方法和get方法非常类似,他是把a9属性赋值给a10 public static void main(String args) /启动word,生成一个ActivexComponent对象 ActiveXComponent app = new ActiveXComponent(Word.Application); /要转换的word文件 String inFile = D:projectjava_wordjava_wordwordtemplet.doc; /要报存的目标文件 String tpFile =D:projectjava_wordjava_wordwordtemplet3.doc; boolean flag = false; Dispatch xlo = app.getObject(); String oldText=1234; String newText=test; boolean visible=false; String bookMarkKey=LB_KJGG; try /设置word不可见 app.setProperty(Visible, new Variant(visible); /(设置word不可见成功!); System.out.println(设置word不可见成功!); Dispatch docs = app.getProperty(Documents).toDispatch(); Dispatch doc = Dispatch.invoke(docs, Open, Dispatch.Method ,new Object inFile, new Variant(false), new Variant(true) , new int1).toDispatch(); /打开word文件 /在word2003的vba文档中application有UserName属性。 String userName=app.getPropertyAsString(UserName); System.out.println(用户名:+userName); Dispatch selection=app.getProperty(Selection).toDispatch(); /得到一个组件 System.out.println(Selection); Dispatch find = app.call(selection, Find).toDispatch(); /查找什么文本 Dispatch.put(find, Text, oldText); /替换文本 Dispatch.call(find,ClearFormatting); Dispatch.put(find, Text, oldText); Dispatch.call(find, Execute); Dispatch.put(selection, Text, newText); / Dispatch.call(app, SaveAs, inFile); System.out.println(replace); /把指定的值设置到指定的标签中去 Dispatch activeDocument=app.getProperty(ActiveDocument).toDispatch(); System.out.println(activedocument); Dispatch bookMarks = app.call(activeDocument, Bookmarks).toDispatch(); System.out.println(bookmarks); boolean bookMarkExist1=Dispatch.call(bookMarks,Exists,bookMarkKey).toBoolean(); if(bookMarkExist1=true) System.out.println(exists bookmark!); Dispatch rangeItem = Dispatch.call(bookMarks, Item,bookMarkKey). toDispatch(); System.out.println(range item!); Dispatch range = Dispatch.call(rangeItem, Range).toDispatch(); System.out.println(range !); /取标签的值 String bookMarkValue=Dispatch.get(range,Text).toString(); bookMarkValue=test; if(bookMarkValue!=null) Dispatch.put(range, Text, new Variant(bookMarkValue); else System.out.println(not exists bookmark!); /保存文件 Dispatch.invoke(doc, SaveAs, Dispatch.Method, new Object tpFile, new Variant(0) , new int1); /作为word格式保存到目标文件 Variant f = new Variant(false); Dispatch.call(doc, Close, f); flag = true; catch (Exception e) e.printStackTrace(); finally app.invoke(Quit, new Variant ); java访问com组件_jacob使用指南发布于:软件开发网 来源: 作者:佚名 时间:2009-01-04 点击: 作者:Junsan Jin 日期:2005-4-14 版本:1.0 信箱: ; Blog:/junnef 声明:本人保留本文的所有权利。如需引用请保留此信息。 一、准备工作 先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。 最好的支持地点:/group/jacob-project Jacob下载地址: /project/showfiles.php?group_id=109543&package_id=118368 这里下载的是目前最新的Jacob1.9的Release版。 二、安装Jacob Jacob的安装非常的简单,我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件。Jacob直接放到系统的system32文件夹下就行了,连注册都不用的(或者拷贝到jdk或者jre的bin目录下也行,当前测试文件所在的目录也行,就是只要在java.library.path中就可以)。而jacob.jar设置到classpath中去就可以了,或者在IDE开发环境的工程中设置扩展库也一样的。 做好上面的工作,就可以正常使用了。 三、实例演示 创建下面的测试文件: / /AppTest.java / import .*; import com.jacob.activeX.*; 软件开发网 public class AppTest public static void main(String args) / create COM component in event thread ActiveXComponent sC = new ActiveXComponent(ScriptControl); Dispatch sControl = sC.getObject(); Dispatch.put(sControl, Language, VBScript); / use COM component in same thread Variant v = Dispatch.call(sControl, Eval, args0); 软件开发网 System.out.println(v.toString(); 打开命令行模式,到java文件所在的目录,键入命令: javac AppTest.java java AppTest 1 2*3 输出结果将会是: 7 入门了就简单了,更多的东西都去我们解开的文件夹下的doc包中看文档吧,这里就不多讲了,最主要的是弄清类库的作用和使用方法就行了如何使用jacob将word转换为PDF关键字:jacob,word,pdf,com组件 摘要: 了解jacob的程序员都知道,jacob是在java与微软的com组件之间的桥梁,通过使用jacob自带的dll动态链接库通过jni的方式实现了在sun java平台上的程序对com调用。本文介绍了如何使用jacob实现以下功能:写word文件;调用word文件中的宏;word文档转换为PDF文件的功能 如何使用jacob将word转换为PDF 作者cleverpig 版权声明:任何获得Matrix授权的网站,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 作者:cleverpig(/blog/cleverpig) 原文:/resource/article/43/43923_jacob_word_PDF.html 关键字:jacob,word,pdf,com组件 前言: 了解jacob的程序员都知道,jacob是在java与微软的com组件之间的桥梁,通过使用jacob自带的dll动态链接库通过jni的方式实现了在sun java平台上的程序对com调用。jacob的作者照搬了微软java开发包中调用com组件的模式,并将它在sun java平台上实现,可谓是用心良苦啊。 在这里,我们要向jacob的开发者-Dan Adler致敬,感谢他的开源精神和其团队的伟大贡献! 一、代码实现功能介绍: 1.写word文件; 2.调用word文件中的宏; 3.word文档转换为PDF文件的功能。 二、使用的环境条件: 正是由于jacob的jni这种特性,所以运行jacob的机器上必须要有jacob.dll在系统的path中,而且还要有相应的被调用的com组件存在。 下面列表说明了本项目使用的软件环境和一些注意事项: 1.Word2003、Adobe Acrobat 7.0.5 Professional(由7.0版在线升级获得,因为7.0版存在bug); 2.并且关闭了Adobe PDF打印机属性-Adobe PDF Setting中的“do not send fonts to PDF”选项; 3.设置了Adobe PDF打印机属性-常规-打印首选项-布局-高级-文档选项-postscript options-TrueType font download option为Native TrueType。 第3个条件是可选的,第1、2个条件是必须的。不然会可能出现下面的错误: 1要用到的软件: (1)Adobe Acrobat 8 Professional (最低版本7.03) (个人非商业使用)8.0破解版下载地址: /soft/2205.html (记得下载补丁) 安装文件 /200611/AcroPro80_efg.rar 破解 /200611/AcroPro80_Crack.rar (2)gs811w32.rar (PDF转换时所需要的脚本ps) /gs811w32.rar (3)postscript.rar (PDF虚拟打印机的驱动) /Resource/DownLoad/postscript.rar (4)jacob.jar jacob_1.9.zip (5)office 2003 2原理: jacob.jar doc - ps -pdf office 2003 -gs811w32-Adobe Acrobat 8-postscript-打印机 (其中关于jacob,jar的安装请看:jacob使用入门及问题解析) 3安装运行: (1)安装 Adobe Acrobat 8 Professional (2)安装 gs811w32.rar (3)配置打印机(这里不需要真实的打印机) 控制面板 打印机及其他硬件打印机和传真添加打印机 (如果添加时显示“操作无法完成。打印后台程序服务没有运行。” 请打开控制面板性能和维护管理工具服务找到“Print Spooler” 右击属性启动)选择本地打印机(如果没有打印机请将“检测并安装 即插打印机”的钩去掉)下一步选择“使用以下端口” (My Document/*.pdf (Adobe PDF Port))下一步 选择打印机我选择 的是Apple的 Color LaserWriter 12/600(工作后,有钱一定要买个Apple hp) 下一步(记住打印机的名字:Apple Color LaserWriter 12/600) 下一步(没有打印机的朋友请选择:不测试) (4)安装 postscript.rar (安装时,注意每一步,选择与前面设置相关的选项) (5)设置Adobe Acrobat 8 Professional:选择一个pdf文件,右击打开方式选择 使用 打开Adobe Acrobat 8 Professional选择file菜单Print Setup.打印选项 属性“Apple Color LaserWriter 12/600”确定 (6)运行下面的代码: 三、源代码: Dispatch_MSWord.java: package com.bjinfotech.practice.jacob; import .*; import com.jacob.activeX.*; /* * 使用jacob实现以下功能: * 写word文件; * 调用word文件中的宏; * word文档转换为PDF文件的功能。 * * 注意使用的环境条件: * 1.Word2003、Adobe Acrobat 7.0.5 Professional(由7.0版在线升级获得,因为7.0版存在bug); * 2.并且关闭了Adobe PDF打印机属性-Adobe PDF Setting中的“do not send fonts to PDF”选项; * 3.设置了Adobe PDF打印机属性-常规-打印首选项-布局-高级-文档选项
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑工程门窗安装施工方案
- 思维的发生与发展04课件
- 低空经济飞行器维修保养方案
- 养鸭场饲料配方优化方案
- 正常人体解剖学感觉器49课件
- 二零二五年风力发电兼职电工合作协议
- 二零二五年度新能源设备采购合同(货物类)
- 二零二五年度区块链技术竞业禁止与知识产权保护协议
- 2025版环境监测行业联盟合作协议
- 二零二五年度花岗石石材行业企业并购合同规范
- 测振仪使用方法
- GB/T 9871-2008硫化橡胶或热塑性橡胶老化性能的测定拉伸应力松弛试验
- GB/T 26480-2011阀门的检验和试验
- GB/T 19861-2005丙烯酸系阴离子交换树脂强碱基团、弱碱基团和弱酸基团交换容量测定方法
- GB/T 11085-1989散装液态石油产品损耗
- GB 30000.3-2013化学品分类和标签规范第3部分:易燃气体
- (完整版)沪教牛津版小学一至六年级英语单词汇总(最新)
- JJF 1587-2016 数字多用表校准规范-(高清现行)
- 完整课件-西方经济学下册(第二版)
- 机械制图教学通用课件(全套)
- 球阀自动泄压计算
评论
0/150
提交评论