使用Jacob自动替换书签内容
2016-06-12 15:38
429 查看
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)即可。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树