首页 > 编程语言 > 详细

Java文件操作系列[3]——使用jacob操作word文档

时间:2016-01-31 03:10:16      阅读:284      评论:0      收藏:0      [点我收藏+]

Java对word文档的操作需要通过第三方组件实现,例如jacob、iText、POI和java2word等。
jacob组件的功能最强大,可以操作word,Excel等格式的文件。该组件调用的的是操作系统底层的dll文件。在使用Java操作word文件时,jacob组件是最常用的一个。

1.准备工作

  根据上面的描述,需要两类文件:

  ①jacob.jar

  ②dll文件

  下载地址:百度云盘下载

  ③电脑上有Microsoft Office软件(WPS、LibreOffice未经试验)

2.开始编程

技术分享
 1 package com.myeclipse;
 2 
 3 import com.jacob.activeX.ActiveXComponent;
 4 import com.jacob.com.Dispatch;
 5 import com.jacob.com.Variant;
 6 
 7 /**
 8  * 使用jacob操作word文档
 9  * @author MrChen
10  *
11  */
12 public class JacobOperateDoc{
13 
14     
15     private ActiveXComponent MSWordApp = null;    //声明一个word对象
16     private Dispatch document = null;
17 
18 
19     /**
20      * 打开word文档
21      * @param makeVisible    是否以可读写方式打开
22      */
23     public void  openWord( boolean makeVisible) {
24         if( MSWordApp == null ) {
25             MSWordApp = new ActiveXComponent("Word.Application");
26         }
27         //设置visible
28         Dispatch.put(MSWordApp,"Visible",new Variant(makeVisible));
29 
30     }
31     
32     /**
33      * 新建word文档
34      */
35     public void createNewDocument() {
36         //获取文档集合
37         Dispatch documents = Dispatch.get(MSWordApp, "Documents").toDispatch();
38         //调用add方法向文档集合中添加一个新的Word文件
39         document = Dispatch.call(documents, "Add").toDispatch();
40     }
41     
42     /**
43      * 向word中写入字符串
44      * @param text
45      */
46     public void insertText(String txt) {
47         //获取当前执行写入的位置,如果是新word文件操作位置为文档开始
48         Dispatch selection = Dispatch.get(MSWordApp, "Selection").toDispatch();
49         //将字符串写入
50         Dispatch.put(selection, "Text", txt);
51     }
52     
53     /**
54      * 另存为
55      * @param fileName
56      */
57     public void saveFileAs(String fileName) {
58         Dispatch.call(document, "SaveAs",fileName);
59     }
60     
61     /**
62      * 打印
63      */
64     public void printFile() {
65         //采用默认打印机打印
66         Dispatch.call(document, "PrintOut");
67     }
68     
69     /**
70      * 关闭文档
71      * @param     type
72      *             0:    关闭文档不改变保存信息
73      *             -1:    关闭文档改变保存信息
74      *             -2:    关闭文档提示是否保存改变信息,请求确认
75      */
76     public void closeDocument(Integer type) {
77         //如果关闭类型不正确,则默认为
78         if((type!=0 && type!=-1 && type != -2) || type == null){
79             type = -2;
80         }
81         Dispatch.call(document, "Close", new Variant(type));
82         document = null;
83     }
84     
85     /**
86      * 退出
87      */
88     public void closeWord() {
89         Dispatch.call(MSWordApp, "Quit");
90         MSWordApp = null;
91         document = null;
92     }
93 }
JacobOperateDoc
技术分享
 1 package com.myeclipse;
 2 
 3 /**
 4  * 测试JacobOperateDoc类
 5  * @author MrChen
 6  *
 7  */
 8 public class Test {
 9 
10     /**
11      * @param args
12      */
13     public static void main(String[] args) {
14         System.out.println("start!");
15         System.out.println(System.getProperty("java.library.path")); 
16         JacobOperateDoc jac = new JacobOperateDoc();
17         jac.openWord(true);
18         jac.createNewDocument();
19         jac.insertText("helloworld!");
20         jac.saveFileAs("D:\\hell.doc");
21         try{
22             jac.closeDocument(null);
23         }catch(NullPointerException e){
24             //捕捉空指针异常,什么也不做
25         }
26         jac.closeWord();
27         System.out.println("end!");
28     }
29 
30 }
测试JacobOperateDoc类

3.遇见的问题及解决方案

  在研究jacob的过程中遇到了一些问题,导致笔者一度想放弃,但这种想法不过一秒而已。笔者一直坚持这样的观点:一件正确的事,既然开始了,就坚持到底,决不放弃!下面是对其中一些问题的摘录。

  (1) 执行Test类,报错Unsupported major.minor version 51.0

必要的资料:各JDK版本对应的错误编号如下:
  J2SE 8 = 52,
  J2SE 7 = 51,
  J2SE 6.0 = 50,
  J2SE 5.0 = 49,
  JDK 1.4 = 48,
  JDK 1.3 = 47,
  JDK 1.2 = 46,
  JDK 1.1 = 45。

    原因:通过搜寻到的JDK版本对应错误资料,可以得出结论:外部jar包使用jdk1.7(jdk7)编译,而使用此jar包的工程jdk版本为jdk1.6(jdk6),故版本不支持。

    解决目标:项目使用的JRE System Library和外用JDK版本保持一致。即修改后是这样的:

      技术分享

    解决步骤

      第一大步:修改JDK版本

      第二大步:修改JRE system library

      注:这两大步必不可少。

  (2) 解决完以上错误之后,执行Test类,出现异常Exception in thread "main" java.lang.UnsatisfiedLinkError: no jacob-1.18-x64 in java.library.path

    错误原因:path路径下找不到jacob-1.18-x64.dll文件

    解决方案

    ① 找到path路径。

      在Test类中增加输出:

System.out.println(System.getProperty("java.library.path")); 

      执行得到:

D:\Java\jdk1.7.0_80\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:/Program Files/MyEclipse-8.6/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client;  .......(还有很多,不再列举)

    ② 将dll文件复制到C:\Windows\system32路径之下。

    再次执行Test类,成功!

    画外音:通过输出path路径,同时也更清楚地看到,Java程序在运行的时候会从前往后扫描path路径,故在解决第一个错误之前使用的JDK版本是1.6。要是早将dll放在C:\Windows\system32路径之下,就不会出现这第二个异常了。

4.进一步了解jacob

 

5.小结

  (1)JDK版本应该保持一致。

  (2)dll文件要放在C:\Windows\system32路径之下。

Java文件操作系列[3]——使用jacob操作word文档

原文:http://www.cnblogs.com/helloIT/p/5172790.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!