java调用microsoft office的宏

最近的一个 工作任务中,需要在后台将客户上传的文档(合同文档)进行只读保护(严格意义上的只读保护,既加密锁定,确保不能自行解锁,而不是文件本身只读或者简单锁定),因此想到了调用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。 - k8 @  `8 F6 A5 y2 @& i' r  k5 b
    j-Interop,项目地址是: http://www.j-interop.org/ ,一个纯粹的java库,没有使用jni方式去调用com组件。但是它的问题是只能调用dcom(分布式com),是通过CIFS协议去调用dcom的,因此要使用它,首先得给机器配置好dcom服务,同时还有一点比较麻烦,就是你要自己去寻找dcom组件的ID(可以通过运行dcomcnfg去查看)。 & K+ f5 x( t) `$ w- {4 B$ ^: ^
    Jacob,项目地址是: http://sourceforge.net/projects/jacob-project/ ,目前最新的更新是2011年2月份的,本文将着重介绍 如何通过这个项目去调用宏。 $ j% E! ?1 {* D; m, b& g
    项目介绍完毕,现在正式开始介绍如何通过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 程序了。 $ D5 n9 C) ~/ M5 g
    调用word宏 * u, k( m" C7 Q# g4 s
    第一步,录制宏 , R9 m  O3 w6 Q
    在d盘根目录下(文档存放在哪里没有要求)新建一个word文档,名为test1.doc,打开,然后录制一段宏(具体录制哪类宏自便,调用时无需传参数即可,但是宏的保存方式要选择“所有文档(Normal)”,这样任何文档都可以调用这个宏了),宏名为macro1。 8 ^1 ]& s! B: z0 r9 ~9 i) D
    第二步,将test1.doc中宏macro1产生的 影响撤销(比如那段宏是输入一段文字,那么就把这段文字删除)并保存,以便观察 测试- J! u5 l) q) G* X( e
    第三步,编写java调用代码 5 C* C. _" U* S
    Java代码 [url=] [/url] & B9 z8 r0 l+ w; a. s1 f' l  e

  • ActiveXComponent word=new ActiveXComponent("Word.Application");   
  • Dispatch documents = word.getProperty("Documents").toDispatch();   
  • Dispatch document = Dispatch.call(documents, "Open", "d:/test1.doc").toDispatch();//指定要打开的文档并且打开它 3 g. T  @2 e, N4 y( [5 @
  • Dispatch.call(word, "Run", new Variant("macro1"));//在这个文档上运行宏

    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代码
    执行完成之后,可以发现被撤销的宏影响又回来了,说明宏调用成功。 6 s! v4 o8 e1 `8 {. v6 [% R1 A+ z2 n
    第五步,高级特性
    在相同目录下(文档存放目录没有规定)新建一个空白的word文档test2.doc,然后将以上代码修改为: ! c5 [7 K4 Z1 M( \9 }  [3 e2 u
Java代码 [url=] [/url]
$ K9 D: b1 |# ~+ b% M3 l; W* P
  • 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"));//在这个文档上运行宏5 J3 q3 ?/ S& S  I8 x0 V
$ p- l# {# e  L9 E0 T
    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"));//在这个文档上运行宏 1 q  ?7 z4 R' u8 k9 N2 `
    执行以上代码,可以发现,我们在test1.doc上录制的宏也可以在test2.doc上运行成功(当然选择宏保存时必须要保存到“所有文档(Normal)”中)。
    深入探索 6 q. @9 t% D  A& \: }  X& V
    以上的例子只是一个很简单的没有参数的宏调用,如果有参数又该如何调用呢?其实有参数的情况也不是很复杂,只需将以上调用的java代码稍微修改下即可实现: / a- d/ b( F: ]$ ^& R: N
Java代码 [url=] [/url]

  • 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),..);//在这个文档上运行宏,并包含多个参数
2 ]5 f7 l, e& }: |4 }
    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宏 6 `3 ~$ }8 K% H: p( J( [2 A
    调用excel宏和调用word宏有点区别,因为excel不能将宏保存到“所有文档(Normal)”上,因此在调用宏的时候需要指明宏所在的具体文档,最后一条语句需要这么写: ( A$ ]( F" h* ~  {8 U
Java代码 [url=] [/url] 4 e- o+ D% L' h* Y4 D0 v: ^
' i% m) j8 |7 ~6 G& j
  • Variant result = Dispatch.call(excel, "Run", new Variant("test.xls!Module1.test"),//这里需要说明宏所在的文档
  • 3 y( \5 Y4 a0 V: ~
    new Variant(arg1),   

  • new Variant(arg2));  

    Variant result = Dispatch.call(excel, "Run", new Variant("test.xls!Module1.test"),//这里需要说明宏所在的文档                                            new Variant(arg1),                                            new Variant(arg2));
    总结 ( F7 q- W( L# f: |$ {
    利用java直接调用office宏的应用场景非常广泛,比如在对文档进行加密、解密和其它保护时特别有用。带参数的宏调用甚至可以灵活的编写成模版宏然后将业务数据注入到相关文档中,而且因为是通过office自己操作自己,所以office文档绝不会出现其它的用java操作office文档时可能出现的文档变异问题,在某些重要文档的操作上非常有用(比如文档格式要求非常严格的合同文档上)。另外,Jacob本身就可以通过调用com来直接操作office(包括编辑),而且office文档不会有任何变异,只是编码难度可能比较大,具体的操作方式这里就不赘述了,可以参考相关api。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jacob-1.18 包含jacob-1.18-x64.dll jacob-1.18-x86.dll 亲测可用: 下面为转pdf使用方法 package com.pdf.doctopdf.pdf; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; import java.io.File; public class TestJacob { public static void main(String args[]) { ActiveXComponent app = null; String wordFile = "C:\\Users\\admin\\Desktop\\jar\\年会系统优化_20210820_V0.2.docx"; String pdfFile = "C:\\Users\\admin\\Desktop\\jar\\测试pdf.pdf"; System.out.println("开始转换..."); // 开始时间 long start = System.currentTimeMillis(); try { // 打开word app = new ActiveXComponent("Word.Application"); // 获得word中所有打开的文档 Dispatch documents = app.getProperty("Documents").toDispatch(); System.out.println("打开文件: " + wordFile); // 打开文档 Dispatch document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch(); // 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在 File target = new File(pdfFile); if (target.exists()) { target.delete(); } System.out.println("另存为: " + pdfFile); // 另存为,将文档报错为pdf,其中word保存为pdf的格式的值是17 Dispatch.call(document, "SaveAs", pdfFile, 17); // 关闭文档 Dispatch.call(document, "Close", false); // 结束时间 long end = System.currentTimeMillis(); System.out.println("转换成功,用时:" + (end - start) + "ms"); }catch(Exception e) { e.getMessage(); System.out.println("转换失败"+e.getMessage()); }finally { // 关闭office app.invoke("Quit", 0); } } }
### 回答1: Java可以通过使用相关的库或插件来支持微软Office和金山的WPS预览。这些库或插件可以实现将Office文档(如Word、Excel和PowerPoint文档)和WPS文档加载到Java应用程序中进行预览的功能。使用这些库或插件,我们可以在Java应用程序中打开、预览和操作这些文档。 对于微软Office文档的预览,Java可以使用一些第三方库,如Apache POI或Aspose来实现。这些库可以读取Office文档的内容,并提供访问和处理文档的功能。例如,我们可以使用Apache POI库将Word文档打开并将其内容显示在Java应用程序中,或者使用Aspose来将Excel表格加载到Java应用程序中进行预览。 对于WPS文档的预览,Java可以使用金山提供的WPS Office软件的开发包(SDK)来实现。WPS Office提供了Java版本的SDK,它可以用于在Java应用程序中加载和预览WPS文档。使用WPS SDK,我们可以打开、读取和显示WPS文档的内容,以实现WPS文档的预览功能。 通过使用这些库或SDK,Java可以与微软Office和金山的WPS进行集成,从而在Java应用程序中实现对Office和WPS文档的预览功能。这使得开发者可以使用Java来处理并展示这些常见的办公文档格式,提供更好的用户体验,满足用户对预览功能的需求。 ### 回答2: 是的,Java可以支持微软Office和金山WPS的预览功能。Java提供了丰富的API和库,用于处理各种文件格式,包括Microsoft Office和WPS的文档格式。通过使用Java的相关类,可以读取和解析这些文档的内容,并将其显示在应用程序中,实现预览的功能。 对于Microsoft OfficeJava提供了Apache POI库,它可以读取和处理Word文档(doc和docx)、Excel电子表格(xls和xlsx)以及PowerPoint演示文稿(ppt和pptx)等格式。开发者可以使用POI库来从Office文档中提取文本、图像、表格等内容,并在Java应用程序中进行显示和预览。 对于金山WPS,Java也可以通过API来实现预览功能。金山WPS的文档格式与微软Office类似,大部分文件都可以使用Apache POI库进行处理。另外,金山WPS也提供了自己的Java SDK,开发者可以使用它来读取和处理WPS文档,并进行预览。 总的来说,Java提供了丰富的功能和库,可以支持微软Office和金山WPS的预览功能。开发者可以根据具体的需求,选择适合自己的API和库来实现预览,从而提供更好的用户体验和功能扩展。 ### 回答3: Java 的确支持微软 Office 和金山的 WPS 预览。这得益于 Java 语言强大的跨平台特性和丰富的第三方库支持。 对于微软 Office 预览,Java 提供了 Apache POI 这个开源项目。Apache POI 是一个 Java API,它允许我们读取、写入和操作 Microsoft Office 格式的文件,包括 Word 文档 (.docx),Excel 电子表格 (.xlsx) 和 PowerPoint 演示文稿 (.pptx) 等。 使用 Apache POI,我们可以从 Java 程序中读取 Office 文件内容,包括文本、样式、表格、图表等。同时,我们也可以通过 Apache POI 创建、编辑以及生成 Office 文件。这使得 Java 程序能够轻松实现对微软 Office 文件的预览功能。 至于金山 WPS 的预览,Java 提供了 Jacob 这个开源项目。Jacob 是一个 Java-COM 桥接器,通过它可以在 Java 程序中调用 COM 组件,而 WPS 就是一个 COM 组件。借助 Jacob,我们可以在 Java 中使用 WPS 的 COM 接口,实现对 WPS 文档的打开、预览和操作等功能。 需要注意的是,使用 Apache POI 和 Jacob 需要获取相应的库文件,并在 Java 程序中进行引用。并且,在使用 Jacob 时还需要配置正确的 COM 组件路径。但是,一旦正确配置并引入所需库,Java 就能很方便地支持微软 Office 和金山 WPS 的预览。 综上所述,Java 确实支持微软 Office 和金山 WPS 的预览,而 Apache POI 和 Jacob 这两个开源项目为我们提供了强大的工具和桥接器,使得我们能够在 Java 中实现对这两种格式的文档进行预览操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值