使用Jacob自动替换书签内容

jacob自动替换书签内容

通过java代码实现word中书签的替换


在Java项目开发过程中,需求涉及到了各种word文档内容自动替换变量,现在将实现方式整理如下:
一、了解Jacob
先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。
下载地址:http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368
二、Jacob安装
1、我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件
2、将压缩包解压后,Jacob.jar添加到Libraries中;
3、将Jacob.dll放至“WINDOWS\SYSTEM32”下面。


代码如下:



package ceshi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class JacobTest {

    public static void main(String[] args) {
        //启动word,生成一个ActivexComponent对象
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        //要转换的word文件
        String inFile = "C://Users/Desktop/bookmark.doc";
        //要保存的目标文件
        String tpFile ="C://Users/Desktop/new_bookmark.doc";
        boolean flag = true;
        boolean visible=false;
    Dispatch docs = app.getProperty("Documents").toDispatch();
    Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[]{inFile, new Variant(false)}, new int[1]).toDispatch();    //打开word文件 , false可写!!  注意 Variant的值
        Dispatch activeDocument=app.getProperty("ActiveDocument").toDispatch();
        Dispatch bookMarks = app.call(doc, "Bookmarks").toDispatch();
        int bCount = Dispatch.get(bookMarks, "Count").getInt();  //获取书签数
        //将书签列表存放到list + map 结构中    
         for (int i = 1; i <= bCount; i++){       
             Map bookMark = new HashMap();   //创建Map()
             Dispatch items = Dispatch.call(bookMarks, "Item", i).toDispatch();   
             String bookMarkKey = String.valueOf(Dispatch.get(items, "Name").getString()).replaceAll("null", "");   //读取书签命名
             Dispatch range = Dispatch.get(items, "Range").toDispatch();
             String bookMarkValue = String.valueOf(Dispatch.get(range, "Text").getString()).replaceAll("null", ""); //读取书签文本
             String MarkKey=bookMarkKey;
             String MarkValue=bookMarkValue;
             //书签名并替换的内容
                if( MarkKey.equals("xm"))//书签名为xm
                  {
                      MarkValue ="张三";  //该xm书签处插入张三;
                  }
                if( MarkKey.equals("lxdh")){//书签名为lxdh
                    MarkValue ="10086";  //在lxdh书签处插入10086
                }
                if( MarkKey.equals("****")){  //书签名自定义
                    MarkValue ="*****";   //在该书签插入自定义内容
                }
                    Dispatch.put(range, "Text", new Variant(MarkValue));
                    //通过打印查看便于debug
                    System.out.println(bookMarkValue);
                    System.out.println(MarkValue);
            //保存文件
                    Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {tpFile, new Variant(0)} , new int[1]);  //new Variant(),这里面的根据传入的参数不同,可以另存为不同的类型
                }
          try{
              Variant f = new Variant(false);
              Dispatch.call(doc, "Close", f);
              flag = true;
            }
            catch (Exception e) {
                    e.printStackTrace();
        }
        finally {
          app.invoke("Quit", new Variant[] {});
                }
             }
         }

出现以下异常解决方式:异常原因为word文档版本较低(如:word 2003及其以下),将word转换为较高版本即可。

Exception in thread "main" com.jacob.com.ComFailException: Invoke of: Item
Source: Microsoft Word
Description: 集合所要求的成员不存在。
    at com.jacob.com.Dispatch.invokev(Native Method)
    at com.jacob.com.Dispatch.invokev(Dispatch.java:625)
    at com.jacob.com.Dispatch.callN(Dispatch.java:453)
    at com.jacob.com.Dispatch.call(Dispatch.java:541)
    at ceshi.GW.table(GW.java:53)
    at ceshi.GW.main(GW.java:89)

转换过程中出现以下异常:
分析原因:word中没有插入书签,导出时不能正确定位导致;
解决办法:查看word文件,插入书签定位;完美解决;

com.jacob.com.ComFailException: Invoke of: Item
Source: Microsoft Word
Description: 集合所要求的成员不存在。

在转换过程中出现异常: com.jacob.com.ComFailException: Can’t get object clsid from progid
解决方法: 操作系统缺少办公软件,安装办公软件(WPS,Office)即可。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值