最近的一个工作任务中,需要在后台将客户上传的文档(合同文档)进行只读保护(严格意义上的只读保护,既加密锁定,确保不能自行解锁,而不是文件本身只读或者简单锁定),因此想到了调用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。
分享到:
相关推荐
WPS Office是一款由金山软件开发的办公软件套装,包含了类似Microsoft Office的Word、Excel和PowerPoint组件。其提供了API和接口,允许开发者通过编程方式与WPS进行交互,实现文档的创建、编辑和转换。 Java是一种...
在本例中,可能使用Jacob来调用Microsoft Office的应用程序(如Word、Excel或PowerPoint)的COM接口,实现文件格式的转换。这种方法的优点是直接利用了Office的内置转换功能,但缺点是只能在装有相应Office版本的...
首先,JACOB允许Java调用Word中的宏。在使用JACOB调用Word宏之前,可以通过Visual Basic(VB)编写一个自动化的脚本来调用宏,并通过JACOB以Java代码实现相似的功能。具体来说,VB代码使用CreateObject创建Word应用...
Jacob是一个Java到COM桥接库,它允许Java代码直接调用Windows上的COM组件,包括Microsoft Office的各种应用程序,如Word、Excel和PowerPoint。 标题中的"java调用office使用的dll文件"指的是Jacob库的核心部分——...
标题中的"java调用dll/com组件word excel使用jawin架包"涉及到的技术点主要包含以下几个方面: 1. **Java Native Interface (JNI)**: JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。当...
请注意,由于预览Word和DOCX文件通常需要完整的Office套件支持,所以在非Windows环境下(如Linux或macOS),可能需要依赖于LibreOffice的Java接口,而不是直接调用Office组件。同时,预览过程可能消耗较大资源,特别...
在Java中,Jacob提供了一种方式来调用Office的自动化功能,例如打开、编辑和保存Word和Excel文件。要使用Jacob,你需要将其解压并添加到你的项目类路径中。 以下是一个简单的示例,展示了如何使用Jacob将Word文档...
Java POI库是一个强大的工具,专门用于处理Microsoft Office格式的文件,包括Word(.doc和.docx)和Excel(.xls和.xlsx)文档。在Java应用程序中,如果你需要读取、写入或修改这些文件,POI库是不可或缺的资源。...
PageOffice是一款由 Zhuozhengsoft 公司开发的Java控件,它可以直接在服务器端操作Word、Excel、PDF等Office文档,无需借助Microsoft Office,降低了系统的资源消耗。在这个场景下,我们不再依赖POI,而是利用Page...
在Java中,最常用的库是Apache POI,它是一个用于读写Microsoft Office格式档案的API。要创建一个简单的Excel文件,你需要导入Apache POI的库,然后使用`XSSFWorkbook`和` XSSFSheet `类来创建工作簿和工作表。例如...
对于Excel,Java中最常用的是Apache POI库,它是一个开源项目,提供了读取、写入Microsoft Office格式文件的能力,包括Excel。对于Word,Java可以使用JODConverter或者Apache POI的HWPF组件来处理。 在描述中提到的...
- **Apache POI**:对于Excel和Word文件,Apache POI是一个强大的库,它提供了读取和写入Microsoft Office格式文件的能力。通过它的API,我们可以逐页或逐段将文档内容渲染为图片。 - **PDFBox**:PDFBox是Apache...
在Android平台上,调用Office(包括Word、Excel和PPT)文档处理服务是常见的需求,以便用户能够在移动设备上查看和编辑这些文件。本篇将详细介绍两种主要的方法:集成OliveOffice文档处理库以及通过Intent直接打开...
1. **在线编辑器集成**:你可以使用如Microsoft Office Online或Google Docs等在线服务的API,通过JavaScript来实现对Word文档的预览和打印。例如,使用Microsoft Graph API,你可以获取Word文档的内容并在浏览器中...
Jacob(Java and COM Bridge)是一个 Java 库,它允许 Java 应用程序通过 COM(Component Object Model)接口与 Microsoft Office 进行交互。下面,我们将详细探讨如何使用 Jacob 实现 Word、Excel 和 PowerPoint ...
在Java应用中,通过JNI技术调用C/C++编写的动态链接库(DLL),再由该DLL调用OLE Automation API来操作MS Office组件,如Word或Excel。这种方法虽然技术复杂度较高,但能实现对MS Office的全面控制。 2. **利用第三...
在Java开发中,有时我们需要与Microsoft Office应用程序如Visio、Word和Excel进行数据交互,以实现自动化处理或数据导入导出。本主题将详细介绍如何利用Java中的特定库来完成这一任务,特别是通过args4j-2.0.1.jar、...
通过上述步骤,我们可以实现Java调用COM组件,比如Excel、Word等Office应用,或者任何其他支持COM接口的Windows服务和应用。JACOB提供了一种相对简单的方式来实现这一目标,避免了编写复杂的JNI代码。在实际项目中,...
Jacob 提供了与 Microsoft Office 应用程序交互的能力,如 Word。 1. **添加依赖**:在 Maven 项目中添加 Jacob 依赖。 ```xml <groupId>com.jacob.com</groupId> <artifactId>jacob <version>1.19 ``` ...
Apache POI是Java处理Microsoft Office格式文件的一个开源库,主要用于处理Excel文档。导入`org.apache.poi.ss.usermodel.*`相关类。创建`Workbook`对象,打开Excel文件,获取需要添加水印的工作表。在工作表上创建...