`
存在就有理由
  • 浏览: 9002 次
  • 性别: Icon_minigender_1
  • 来自: 美国
文章分类
社区版块
存档分类
最新评论

java调用microsoft office(如word、excel)的宏

阅读更多
最近的一个工作任务中,需要在后台将客户上传的文档(合同文档)进行只读保护(严格意义上的只读保护,既加密锁定,确保不能自行解锁,而不是文件本身只读或者简单锁定),因此想到了调用word宏来操作文档的方式。  经过研究,这种方式是完全可行的,而且已经实现,由于这类资料网络上比较难找,因此特将自己的研究心得总结分享一下。
     java需要通过调用com来和office交互,这个可以自己编写jni来实现,不过目前已有三个开源项目支持java对com的调用,它们分别是:com4j、j-Interop和Jacob。下面先对这三个项目做个简单介绍。
   com4j,项目地址是:http://java.net/projects/com4j/ ,很久没更新了,要使用这个库,需要下载相关的源代码(也可以通过http://download.java.net/maven/2/org/jvnet/com4j/ 这个地址去查找相关编译好的包)编译或者通过maven获取maven-com4j-plugin插件,然后运行tlbimp.jar(可以在http://download.java.net/maven/2/org/jvnet/com4j/tlbimp/ 里找到)或者maven-com4j-plugin插件去生成相关com组件的模型接口代码(当然前提是要先找到com组件的承载文件所在,这个是有些难度的),然后再使用这些代码去调用相关的com组件,使用起来还是比较麻烦的,而且还存在一些严重的bug。
    j-Interop,项目地址是:http://www.j-interop.org/ ,一个纯粹的java库,没有使用jni方式去调用com组件。但是它的问题是只能调用dcom(分布式com),是通过CIFS协议去调用dcom的,因此要使用它,首先得给机器配置好dcom服务,同时还有一点比较麻烦,就是你要自己去寻找dcom组件的ID(可以通过运行dcomcnfg去查看)。
    Jacob,项目地址是:http://sourceforge.net/projects/jacob-project/ ,目前最新的更新是2011年2月份的,本文将着重介绍如何通过这个项目去调用宏。
    项目介绍完毕,现在正式开始介绍如何通过Jacob去调用宏。首先,需要下载Jacob的发布包,里面应该包含一个jar包:jacob.jar(放在项目的classpath下),两个dll文件:jacob-1.15-M4-x64.dll、jacob-1.15-M4-x86.dll,两个dll文件请根据系统架构属性选择其中一个,然后放在path路径下(也可以直接放在C:\WINDOWS\system32下面)。这样就可以开始编写调用宏的java程序了。
    调用word宏
    第一步,录制宏
    在d盘根目录下(文档存放在哪里没有要求)新建一个word文档,名为test1.doc,打开,然后录制一段宏(具体录制哪类宏自便,调用时无需传参数即可,但是宏的保存方式要选择“所有文档(Normal)”,这样任何文档都可以调用这个宏了),宏名为macro1。
    第二步,将test1.doc中宏macro1产生的影响撤销(比如那段宏是输入一段文字,那么就把这段文字删除)并保存,以便观察测试。
    第三步,编写java调用代码
   
    ActiveXComponent word=new ActiveXComponent("Word.Application");
    Dispatch documents = word.getProperty("Documents").toDispatch();
    Dispatch document = Dispatch.call(documents, "Open", "d:/test1.doc").toDispatch();//指定要打开的文档并且打开它
    Dispatch.call(word, "Run", new Variant("macro1"));//在这个文档上运行宏

    第四步,执行这段java代码
    执行完成之后,可以发现被撤销的宏影响又回来了,说明宏调用成功。
    第五步,高级特性
    在相同目录下(文档存放目录没有规定)新建一个空白的word文档test2.doc,然后将以上代码修改为:
    ActiveXComponent word=new ActiveXComponent("Word.Application");
    Dispatch documents = word.getProperty("Documents").toDispatch();
    Dispatch document = Dispatch.call(documents, "Open", "d:/test2.doc").toDispatch();//指定要打开的文档并且打开它
    Dispatch.call(word, "Run", new Variant("macro1"));//在这个文档上运行宏

    执行以上代码,可以发现,我们在test1.doc上录制的宏也可以在test2.doc上运行成功(当然选择宏保存时必须要保存到“所有文档(Normal)”中)。
    深入探索
    以上的例子只是一个很简单的没有参数的宏调用,如果有参数又该如何调用呢?其实有参数的情况也不是很复杂,只需将以上调用的java代码稍微修改下即可实现:
    ActiveXComponent word=new ActiveXComponent("Word.Application");
    Dispatch documents = word.getProperty("Documents").toDispatch();
    Dispatch document = Dispatch.call(documents, "Open", "d:/test1.doc").toDispatch();//指定要打开的文档并且打开它
    Dispatch.call(word, "Run", new Variant("macro1"),new Variant(arg1),new Variant(arg2),..);//在这个文档上运行宏,并包含多个参数

    调用excel宏
    调用excel宏和调用word宏有点区别,因为excel不能将宏保存到“所有文档(Normal)”上,因此在调用宏的时候需要指明宏所在的具体文档,最后一条语句需要这么写:
    Variant result = Dispatch.call(excel, "Run", new Variant("test.xls!Module1.test"),//这里需要说明宏所在的文档
                                            new Variant(arg1),
                                            new Variant(arg2));

    总结
    利用java直接调用office宏的应用场景非常广泛,比如在对文档进行加密、解密和其它保护时特别有用。带参数的宏调用甚至可以灵活的编写成模版宏然后将业务数据注入到相关文档中,而且因为是通过office自己操作自己,所以office文档绝不会出现其它的用java操作office文档时可能出现的文档变异问题,在某些重要文档的操作上非常有用(比如文档格式要求非常严格的合同文档上)。另外,Jacob本身就可以通过调用com来直接操作office(包括编辑),而且office文档不会有任何变异,只是编码难度可能比较大,具体的操作方式这里就不赘述了,可以参考相关api。
分享到:
评论
9 楼 sunxueqiang0329 2011-12-11  
Exception in thread "main" com.jacob.com.ComFailException: Invoke of: Run
Source: Microsoft Word这是什么错误啊 ?
8 楼 苹果超人 2011-03-17  
study. thanks.
7 楼 wangkaiyong 2011-03-16  
Word.Application是什么?我debug到这的时候就报错了,是不是要定义什么?
6 楼 zzy90718 2011-03-16  
你们也可以考虑一下 aspose.word 这个效率很高,要不jacob高上个几十倍
5 楼 kimmking 2011-03-16  
lz_cleaner 写道
这个是不是得需要在服务器端提供office软件的支持呀?

这个方式不建议用在服务器端。
4 楼 lz_cleaner 2011-03-16  
这个是不是得需要在服务器端提供office软件的支持呀?
3 楼 moss 2011-03-15  
自己给自己加密,不错的选择,在做文件加密的时候,但是有局限性,如果是非word类的如何呢?
2 楼 存在就有理由 2011-03-14  
3694826 写道
com方式调用,可以直接用 jacob,jawin之类的,
如果要嵌入到swt,awt,可以用dsoframer

jawin有所听闻,但还没来得及仔细研究,dsoframer这个还真是首见,回头也看下。
1 楼 3694826 2011-03-13  
com方式调用,可以直接用 jacob,jawin之类的,
如果要嵌入到swt,awt,可以用dsoframer

相关推荐

    java实现office、wps转pdf,pdf转word

    支持word、excel、ppt、wps、txt等多种格式转pdf、并支持pdf转word。个人感觉非常好用。

    PageOffice for Java 2.0 专业版

    现在梦想已经成真,想在网页上显示编辑Word、Excel文档并且调用微软Office的强大功能,就直接在Web页面上添加标签就可以了,就和使用常用的Struts标签一样简单方便。 PageOffice是什么? PageOffice for Java是...

    pageoffice for Java v4.0 免费试用版

    现在梦想已经成真,想在网页上显示编辑Word、Excel文档并且调用微软Office的强大功能,就直接在Web页面上添加标签就可以了,就和使用常用的Struts标签一样简单方便。PageOffice for Java是一款非常优秀的专业的集成...

    如何利用Java-JACOB操作WORD文档

    如果你要对 MS Word、Excel 进行处理,JACOB 是一个好的选择。JACOB目前已经成为sourceforge(http://sourceforge.net/projects/jacob- project/)的一个开源项目,本文使用的版本是1.10.1。 这篇文章可能不能完全...

    SOAOFFICE - 微软 OFFICE 中间件

    SOAOffice 中间件是北京科翰软件为微软OFFICE量身打造的Web中间件,是Web调用Office、存取Office数据的必备中间件。SOAOffice中间件由服务器端数据组件和客户端显示控件构成。 SOAOffice 完全抛弃了传统利用Office...

    PageOffice for ASP.NET v4.0 免费试用版

    现在梦想已经成真,想在网页上显示编辑Word、Excel文档并且调用微软Office的强大功能,就直接在Web页面上添加标签就可以了,就和使用常用的Struts标签一样简单方便。PageOffice for Java是一款非常优秀的专业的集成...

    点聚weboffice7

    与weboffice6相对,修改了文档打开模式,通过OLE方式调用Office软件,处理机制类似微软DSOFramer组件,相对weboffice6完全打开模式,打开文档速度大大提升。 同时weboffice7推出了标准版和增强版; 免费版用于服务...

    NPOI读取excel控件(.net)

    POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。目前POI的稳定版本中仅支持Excel文件格式xls,其他的都属于不稳定版本(放在...

    word源码java-BuildWord:帮我整理word文档的工具

    word源码java 问题由来 最开始是项目组出现了很多项目文档,这些文档格式不一,可以说是五花八门,故需要...3:Java2word是一个在java程序中调用 MS Office Word 文档的组件(类库)。该组件提供了一组简单的接口,以便j

    jacob操作office文档大全

    JACOB是一个 JAVA到微软的COM接口的桥梁。...如果你要对 MS Word、Excel 进行处理,JACOB 是一个好的选择。JACOB目前已经成为sourceforge(http://sourceforge.net/projects/jacob- project/)的一个开源项目

    jacob1.18源码和jar包

    从而建立起java到jacob dll到jni的之间的联系 LSH 调用Microsoft MediaPlayer等 )">JACOB里的总共有两个包: com jacob activeX:JACOB可以通过它调度(Dispatch)activeX 控件 com jacob com:JACOB通过它...

    网管教程 从入门到精通软件篇.txt

    ACT:Microsoft office助手文件 AIF,AIFF:音频互交换文件,Silicon Graphic and Macintosh应用程序的声音格式 ANI:Windows系统中的动画光标 ARC:LH ARC的压缩档案文件 ARJ:Robert Jung ARJ压缩包文件 ASD...

    JavaScript完全自学宝典 源代码

    示例描述:介绍JavaScript与Microsoft Office互操作的方法。 14.1.html 使用JavaScript向Word中写入内容。 14.2.html 使用JavaScript从Word中读取内容。 14.3.html 使用JavaScript向Excel文件中写入内容...

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    Python核心编程第二版(ok)

     2.17.2 如何调用函数   2.17.3 默认参数   2.18 类   2.19 模块   2.19.1 如何导入模块   2.19.2 如何访问一个模块函数或访问一个模块变量   2.20 实用的函数   2.21 练习   第3章 ...

    Python核心编程第二版

     2.17.2 如何调用函数   2.17.3 默认参数   2.18 类   2.19 模块   2.19.1 如何导入模块   2.19.2 如何访问一个模块函数或访问一个模块变量   2.20 实用的函数   2.21 练习   第3章 ...

    测试培训教材

    执行安装前请先确保你的系统已经安装了Office Excel软件。 2.安装成功后,打开编制好的文件,选中所有要导入的需求记录,注意:只选数据. Export To Quality 3.点击“工具” Center 4.输入QC的URL地址 5.输入项目...

Global site tag (gtag.js) - Google Analytics