jacob 抽取word文档

介绍一下jacob: jacob是在java与微软的com组件之间的桥梁,通过使用jacob自带的dll动态链接库通过jni的方式实现了在sun java平台上的程序对com调用! 下载地址: http://sourceforge.net/project/showfiles.php?group_id=109543&package_id=118368

可用的版本很多,现在我用的是:jacob_1.11.1 功能:可以实现word与pdf和excel的操作,与转换! JDK版本:jdk1.4 我实现的作用:使用插件:按照word规定的格式创建word 文件

配置说明::

解压文件:jacob_1.11.1.zip ,copy jacob.jar文件加入到classpath

copy jacob.dll 放在java jdk bin目录下

copy template.doc到web-inf下

注:template: 可以修改为自己的任意格式的doc 先看一下我的template.doc: 下面是我的类文件:Java2Word.java

下载: Java2Word.java

package com.cenbow.web.produceword;

/*************************************

*

*作用:利用jacob插件根据模板word生成word 文件!

*

*传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。

* word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……,以免执行错误的替换。

* 所有要替换为图片的字段,Key中需包含image或者Value为图片的全路径(目前只判断文件后缀名为:.bmp、.jpg、.gif)。

* 要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,其中:R代表从表格的第R行开始替换,N代表word模板中的第N张表格;

* Value为ArrayList对象,ArrayList中包含的对象统一为String[],一条String[]代表一行数据,ArrayList中第一条记录为特殊记录,

* 记录的是表格中要替换的列号,如:要替换第一列、第三列、第五列的数据,则第一条记录为String[3] {“1”,”3”,”5”}。

*

*

*create on 2007.3.6

*author fgl

*

*

************************************/

 

import java.util.Iterator; 



import java.util.List; 



import java.util.HashMap; 



  



import com.jacob.activeX.ActiveXComponent; 



import com.jacob.com.ComThread; 



import com.jacob.com.Dispatch; 



import com.jacob.com.Variant; 



  



public class Java2Word { 



private boolean saveOnExit; 



/** 



* word文档 



*/ 



private Dispatch doc = null; 



/** 



* word运行程序对象 



*/ 



private ActiveXComponent word; 



/** 



* 所有word文档 



*/ 



private Dispatch documents; 



/** 



* 构造函数 



*/ 



public Java2Word() { 



saveOnExit = false; 



word = new ActiveXComponent("Word.Application"); 



word.setProperty("Visible",new Variant(false)); 



documents = word.getProperty("Documents").toDispatch(); 



} 



/** 



* 设置参数:退出时是否保存 



* @param saveOnExit true-退出时保存文件,false-退出时不保存文件 



*/ 



public void setSaveOnExit(boolean saveOnExit) { 



this.saveOnExit = saveOnExit; 



} 



/** 



* 得到参数:退出时是否保存 



* @return boolean true-退出时保存文件,false-退出时不保存文件 



*/ 



public boolean getSaveOnExit() { 



return saveOnExit; 



} 



/** 



* 打开文件 



* @param inputDoc 要打开的文件,全路径 



* @return Dispatch 打开的文件 



*/ 



public Dispatch open(String inputDoc) { 



return Dispatch.call(documents,"Open",inputDoc).toDispatch(); 



} 



/** 



* 选定内容 



* @return Dispatch 选定的范围或插入点 



*/ 



public Dispatch select() { 



return word.getProperty("Selection").toDispatch(); 



} 



/** 



* 把选定内容或插入点向上移动 



* @param selection 要移动的内容 



* @param count 移动的距离 



*/ 



public void moveUp(Dispatch selection,int count) { 



for(int i = 0;i < count;i++) 



Dispatch.call(selection,"MoveUp"); 



} 



/** 



* 把选定内容或插入点向下移动 



* @param selection 要移动的内容 



* @param count 移动的距离 



*/ 



public void moveDown(Dispatch selection,int count) { 



for(int i = 0;i < count;i++) 



Dispatch.call(selection,"MoveDown"); 



} 



/** 



* 把选定内容或插入点向左移动 



* @param selection 要移动的内容 



* @param count 移动的距离 



*/ 



public void moveLeft(Dispatch selection,int count) { 



for(int i = 0;i < count;i++) 



Dispatch.call(selection,"MoveLeft"); 



} 



/** 



* 把选定内容或插入点向右移动 



* @param selection 要移动的内容 



* @param count 移动的距离 



*/ 



public void moveRight(Dispatch selection,int count) { 



for(int i = 0;i < count;i++) 



Dispatch.call(selection,"MoveRight"); 



} 



/** 



* 把插入点移动到文件首位置 



* @param selection 插入点 



*/ 



public void moveStart(Dispatch selection) { 



Dispatch.call(selection,"HomeKey",new Variant(6)); 



} 



/** 



* 从选定内容或插入点开始查找文本 



* @param selection 选定内容 



* @param toFindText 要查找的文本 



* @return boolean true-查找到并选中该文本,false-未查找到文本 



*/ 



public boolean find(Dispatch selection,String toFindText) { 



// 从selection所在位置开始查询 



Dispatch find = Dispatch.call(selection,"Find").toDispatch(); 



// 设置要查找的内容 



Dispatch.put(find,"Text",toFindText); 



// 向前查找 



Dispatch.put(find,"Forward","True"); 



// 设置格式 



Dispatch.put(find,"Format","True"); 



// 大小写匹配 



Dispatch.put(find,"MatchCase","True"); 



// 全字匹配 



Dispatch.put(find,"MatchWholeWord","True"); 



// 查找并选中 



return Dispatch.call(find,"Execute").getBoolean(); 



} 



/** 



* 把选定内容替换为设定文本 



* @param selection 选定内容 



* @param newText 替换为文本 



*/



public void replace(Dispatch selection,String newText) { 



// 设置替换文本 



Dispatch.put(selection,"Text",newText); 



} 



/** 



* 全局替换 



* @param selection 选定内容或起始插入点 



* @param oldText 要替换的文本 



* @param newText 替换为文本 



*/ 



public void replaceAll(Dispatch selection,String oldText,Object replaceObj) { 



// 移动到文件开头 



moveStart(selection); 



if(oldText.startsWith("table") || replaceObj instanceof List) { 



replaceTable(selection,oldText,(List) replaceObj); 



} else { 



String newText = (String) replaceObj; 



if(oldText.indexOf("image") != -1 



|| newText.lastIndexOf(".bmp") != -1 



|| newText.lastIndexOf(".jpg") != -1 



|| newText.lastIndexOf(".gif") != -1) 



while (find(selection,oldText)) { 



replaceImage(selection,newText); 



Dispatch.call(selection,"MoveRight"); 



} 



else 



while (find(selection,oldText)) { 



replace(selection,newText); 



Dispatch.call(selection,"MoveRight"); 



} 



} 



} 



/** 



* 替换图片 



* @param selection 图片的插入点 



* @param imagePath 图片文件(全路径) 



*/ 



public void replaceImage(Dispatch selection,String imagePath) { 



Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath); 



} 



/** 



* 替换表格 



* @param selection 插入点 



* @param tableName 表格名称,形如table$1@1、table$2@1...table$R@N,R代表从表格中的第N行开始填充, 



*                  N代表word文件中的第N张表 



* @param fields 表格中要替换的字段与数据的对应表 



*/ 



public void replaceTable(Dispatch selection,String tableName,List dataList) { 



if(dataList.size() <= 1) { 



System.out.println("Empty table!"); 



return; 



} 



// 要填充的列 



String[] cols = (String[]) dataList.get(0); 



// 表格序号 



String tbIndex = tableName.substring(tableName.lastIndexOf("@") + 1); 



// 从第几行开始填充 



int fromRow = Integer.parseInt(tableName.substring(tableName 



.lastIndexOf("___FCKpd___0quot;) + 1,tableName.lastIndexOf("@"))); 



// 所有表格 



Dispatch tables = Dispatch.get(doc,"Tables").toDispatch(); 



// 要填充的表格 



Dispatch table = Dispatch.call(tables,"Item",new Variant(tbIndex)) 



.toDispatch(); 



// 表格的所有行 



Dispatch rows = Dispatch.get(table,"Rows").toDispatch(); 



// 填充表格 



for(int i = 1;i < dataList.size();i++) { 



// 某一行数据 



String[] datas = (String[]) dataList.get(i); 



// 在表格中添加一行 



if(Dispatch.get(rows,"Count").getInt() < fromRow + i - 1) 



Dispatch.call(rows,"Add"); 



// 填充该行的相关列 



for(int j = 0;j < datas.length;j++) { 



// 得到单元格 



Dispatch cell = Dispatch.call(table,"Cell", 



Integer.toString(fromRow + i - 1),cols[j]).toDispatch(); 



// 选中单元格 



Dispatch.call(cell,"Select"); 



// 设置格式 



Dispatch font = Dispatch.get(selection,"Font").toDispatch(); 



Dispatch.put(font,"Bold","0"); 



Dispatch.put(font,"Italic","0"); 



// 输入数据 



Dispatch.put(selection,"Text",datas[j]); 



} 



} 



} 



/** 



* 保存文件 



* @param outputPath 输出文件(包含路径) 



*/ 



public void save(String outputPath) { 



Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath); 



} 



/** 



* 关闭文件 



* @param document 要关闭的文件 



*/ 



public void close(Dispatch doc) { 



Dispatch.call(doc,"Close",new Variant(saveOnExit)); 



} 



  



/** 



* 退出程序 



*/ 



public void quit() { 



word.invoke("Quit",new Variant[0]); 



ComThread.Release(); 



} 



/** 



* 根据模板、数据生成word文件 



* @param inputPath 模板文件(包含路径) 



* @param outPath 输出文件(包含路径) 



* @param data 数据包(包含要填充的字段、对应的数据) 



*/ 



public void toWord(String inputPath,String outPath,HashMap data) { 



String oldText; 



Object newValue; 



try { 



doc = open(inputPath); 



Dispatch selection = select(); 



Iterator keys = data.keySet().iterator(); 



while (keys.hasNext()) { 



oldText = (String) keys.next(); 



newValue = data.get(oldText); 



replaceAll(selection,oldText,newValue); 



} 



save(outPath); 



} catch (Exception e) { 



// debug.println("toword[Java2Word]------------操作word文件失败!"+e.getMessage(),true); 



  



} finally { 



if(doc != null) 



close(doc); 



} 



} 



}



下面是我在servlet调用的代码:



HashMap data = new HashMap(); 



data.put("$projects_title___FCKpd___0quot;,projects_title); 



data.put("$sort_name___FCKpd___0quot;,sort_name); 



data.put("$web_name___FCKpd___0quot;,web_name); 



data.put("$people_name___FCKpd___0quot;,people_name); 



data.put("$projects_manager___FCKpd___0quot;,projects_manager); 



data.put("$testaddresses___FCKpd___0quot;,testaddresses); 



data.put("$language_type___FCKpd___0quot;,language_type); 



data.put("$contact___FCKpd___0quot;,contact); 



data.put("$projects_progress___FCKpd___0quot;,projects_progress); 



data.put("$critique___FCKpd___0quot;,critique.toString()); 



  



try{ 



Java2Word j2w = new Java2Word(); 



long time1 = System.currentTimeMillis(); 



j2w.toWord(debug.LOCALPATH+"WEB-INF/template.doc",debug.LOCALPATH+"WEB-INF/classes/com/cenbow/web/produceword/New.doc",data); 



j2w=null; 



//debug.println(operatorid,"processPost[ProduceWordServlet]-------------time cost : " + (System.currentTimeMillis() - time1),true); 



time1=0; 



}catch(Exception ex){ 



// debug.println(operatorid,"processPost[ProduceWordServlet]-----------produceword failure:"+ex.getMessage(),true); 



}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值