介绍一下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);
}

jacob 抽取word文档相关推荐

  1. java使用jacob操作word文档

    ava使用jacob操作word文档 java调用com组件操作word使用总结(jacob) 简单描述 在此处输入简单摘要 特别声明:使用java-com技术可以完成任何VBA可以完成的office ...

  2. 批量抽取word文档中的表格

    用于抽取word文档中指定表格的指定数据 供学习交流 import pandas as pd import docx import osdef get_data_from_path(save_path ...

  3. Jacob操作Word文档转换-XXOO

    前言 JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32程序库. 一.准备 <!--添加本地的jacob.jar包--><depe ...

  4. Jacob处理Word文档总结以及Java操作Office2007

    使用Jacob来处理Word文档 Word或Excel程序是以一种COM组件形式存在的.如果能够在Java中调用Word的COM组件,就 能使用它的方法来获取Word文档中的文本信息.目前网上有许多提 ...

  5. 利用jacob操作word文档

    介绍一下jacob: jacob是在java与微软的com组件之间的桥梁,通过使用jacob自带的dll动态链接库通过jni的方式实现了在sun java平台上的程序对com调用! 下载地址: htt ...

  6. 使用JACOB操作word文档并实现打印

    由于项目需要,需要在后台对word文档中的书签进行重新填值,并进行打印.一开始已经使用Spire.Doc for Java实现了这个效果,但是这个插件是收费的,公司不想买,于是就在网上找了一段时间开源 ...

  7. java通过POI和jacob实现word文档的在线预览和下载

    通过POI和jacob可以实现word文档的在线预览和下载. 首先,引入以下maven依赖. <dependency><groupId>org.apache.poi</g ...

  8. Java 使用jacob打印word文档

    , 记录并整理自己网上查阅的资料,网上的代码感觉始终有点不全,一些操作没有完全关闭,比如打开的Word没有关闭,一直占用这系统资源:由于网上很多实例都是讲解打印Excel文档的,微软的MSDN上面的具 ...

  9. Jacob 导出word文档 资源无法正常释放 解决方法

    操作word文档失败!com.jacob.com.ComFailException: Can't map name to dispid: Open 2009-03-17 15:11:41,812 WA ...

最新文章

  1. Pyhton 内置 itertools 模块chain、accumulate、compress、drop、take等函数使用
  2. 2018-3-8(论文--网络评论中的非结构化信息表示与研究)笔记-----基于证据理论的网络评论综合方法
  3. 【Android 高性能音频】Oboe 开发流程 ( 包含头 Oboe 头文件 | 创建音频流 | 设置音频流 | 音频流回调类 AudioStreamCallback )
  4. 【一步一步学习spring】spring bean管理(上)
  5. Vue.js 2 渐进式前端框架 的最佳学习方法
  6. 【SA 认证课】来啦 这次陪你过双 11
  7. HD_1232畅通工程
  8. 《Windows高级调试》译者线上聊天活动获奖网友名单
  9. java udp 流量控制_基于UDP传输协议的实现分析之流量和拥塞控制
  10. centos 7 更换yum源
  11. Struts2标签库(四)之非表单标签
  12. linux复制远程文件和文件夹
  13. 加勒比海盗海盗不雅镜头_土豆,海盗和……编程?
  14. 中国联通家庭网关破解管理员账户
  15. Vue 腾讯防水墙验证
  16. 【数据挖掘】XGBoost面试题:与GBDT的区别?为什么使用泰勒二阶展开?为什么可以并行训练?为什么快?防止过拟合的方法?如何处理缺失值?
  17. Shiro框架 Subject、SecurityManager、线程之间的关系
  18. 胃溃疡能通过食疗自愈吗?
  19. Five-degree-of-freedom manipulation of an untethered magnetic device in fluid using a single permane
  20. Java_scaner用法

热门文章

  1. Generic WebHookTrigger 自动触发
  2. NXP推出新款UHF芯片UCODE 8,灵敏度更高
  3. 中国特殊钢行业市场供需与战略研究报告
  4. Day22——HTML
  5. 中国瓦楞纸箱行业发展现状及趋势分析,快递成为新的增长点「图」
  6. 欧拉函数(详解)-数论
  7. 多线程初级模拟12306抢票
  8. 戴尔poweredge r730服务器配置及系统安装详解教程
  9. JAVA句柄是什么?
  10. YBTOJ 数独游戏