一准备工作
先了解一下概念JACOB 就是 JAVACOM Bridge的缩写提供自动化的访问com的功能也是通过JNI功能访问windows平台下的com组件或者win系统库的这是一个开始于 年的开源项目的成果有很多使用者对该项目进行了修改做出了自己的贡献
Jacob下载地址?group_id=&package_id=
我在这里下载了Jacob和jacob的版本两个版本
这里下载的是目前最新的Jacob的Release版
另外java操作word方式还有(个人认为通过jacob最好自己可以扩展网上除poi之外几乎全是javacom技术实现的):
():Apache POI Java API To Access Microsoft Format Files();对word处理不够强处理Excel功能可以但是全是通过java完成的不需 要com组件支持;
():javaword 是一个在java程序中调用 MS Office Word 文档的组件(类库)该组件提供了一组简单的接口以便java程序调用他的服务操作Word 文档(好象也是用的javacom技术);
()web开发语言操作word的功能最好还是用第三方的控件 看看这个SOAOFFICE还可以使用js 写VBA呢
二安装Jacob
Jacob的安装非常的简单我们解开下载的jacob_zip在文件夹中找到jacobdll和jacobjar两个文件如果是 Jacob则是jacobxdll(位机和jacobxdll(位)和 jacobjar两个文件Jacobdll直接放到系统的system文件夹下就行了连注册都不用的(或者拷贝到jdk或者jre的bin目 录下也行当前测试文件所在的目录也行就是只要在javalibrarypath中就可以)而jacobjar设置到classpath中去就 可以了或者在IDE开发环境的工程中设置扩展库也一样的我是这样使用的将jacobxdll或复制 到%Tomcat%\bin目录下将jacobjar复制到%Tomcot%\Share\lib目录下我使用过程中感觉放到这里是一个最终解决 办法当你放哪都有问题的时候我这样用之后再没有出过因为系统不一样出现的各种各样的问题当然你作的是web的项目
注意使用jacob一写要安装word我装的word如果是操作word就不用jacob了(好像这方面的API)
对jacobdll几种配置方法 (网上看到)
::
把jacobdll文件复制到 windows\system 目录下(注我用的时候这个方法不能运行)
把jacobdll放入 Java\jdk_\jre\bin目录下把jacobjar放入 Java\jdk_\jre\lib\ext目录下可以正常运行
把jacobdll放入 \glc\src目录下把jacobjar放入WEBINF\lib目录下也是可以正常运行
三使用(以下是我改写的一个word操作类希望有兴趣的朋友完善记得发给我一份)
//注意java操作word关键是定位操作对象;
import comjacobactiveXActiveXComponent;
import Dispatch;
import Variant;
/**
* jacob操作MSword类
* @author
*/
public class WordBean {
// word文档
private Dispatch doc;
// word运行程序对象
private ActiveXComponent word;
// 所有word文档集合
private Dispatch documents;
// 选定的范围或插入点
private Dispatch selection;
private boolean saveOnExit = true;
public WordBean()throws Exception{
if (word == null) {
word = new ActiveXComponent(WordApplication);
wordsetProperty(Visible new Variant(false)); //不可见打开word
wordsetProperty(AutomationSecurity new Variant()); //禁用宏
}
if (documents == null)
documents = wordgetProperty(Documents)toDispatch();
}
/**
* 设置退出时参数
*
* @param saveOnExit
* boolean true退出时保存文件false退出时不保存文件
*/
public void setSaveOnExit(boolean saveOnExit) {
thissaveOnExit = saveOnExit;
}
/**
* 创建一个新的word文档
*
*/
public void createNewDocument() {
doc = Dispatchcall(documents Add)toDispatch();
selection = Dispatchget(word Selection)toDispatch();
}
/**
* 打开一个已存在的文档
*
* @param docPath
*/
public void openDocument(String docPath) {
closeDocument();
doc = Dispatchcall(documents Open docPath)toDispatch();
selection = Dispatchget(word Selection)toDispatch();
}
/**
*只读 打开一个保护文档
* @param docPath文件全名
* @param pwd密码
*/
public void openDocumentOnlyRead(String docPath String pwd)throws Exception {
closeDocument();
// doc = Dispatchinvoke(documents Open DispatchMethod
// new Object[]{docPath new Variant(false) new Variant(true) new Variant(true) pwd}
// new int[])toDispatch();//打开word文件
doc = DispatchcallN(documents Open new Object[]{docPath new Variant(false)
new Variant(true) new Variant(true) pwd new Variant(false)})toDispatch();
selection = Dispatchget(word Selection)toDispatch();
}
public void openDocument(String docPath String pwd)throws Exception {
closeDocument();
doc = DispatchcallN(documents Open new Object[]{docPath new Variant(false)
new Variant(false) new Variant(true) pwd})toDispatch();
selection = Dispatchget(word Selection)toDispatch();
}
/**
* 把选定的内容或插入点向上移动
*
* @param pos
* 移动的距离
*/
public void moveUp(int pos) {
if (selection == null)
selection = Dispatchget(word Selection)toDispatch();
for (int i = ; i < pos; i++)
Dispatchcall(selection MoveUp);
}
/**
* 把选定的内容或者插入点向下移动
*
* @param pos
* 移动的距离
*/
public void moveDown(int pos) {
if (selection == null)
selection = Dispatchget(word Selection)toDispatch();
for (int i = ; i < pos; i++)
Dispatchcall(selection MoveDown);
}
/**
* 把选定的内容或者插入点向左移动
*
* @param pos
* 移动的距离
*/
public void moveLeft(int pos) {
if (selection == null)
selection = Dispatchget(word Selection)toDispatch();
for (int i = ; i < pos; i++) {
Dispatchcall(selection MoveLeft);
}
}
/**
* 把选定的内容或者插入点向右移动
*
* @param pos
* 移动的距离
*/
public void moveRight(int pos) {
if (selection == null)
selection = Dispatchget(word Selection)toDispatch();
for (int i = ; i < pos; i++)
Dispatchcall(selection MoveRight);
}
/**
* 把插入点移动到文件首位置
*
*/
public void moveStart() {
if (selection == null)
selection = Dispatchget(word Selection)toDispatch();
Dispatchcall(selection HomeKey new Variant());
}
/**
* 从选定内容或插入点开始查找文本
*
* @param toFindText
* 要查找的文本
* @return boolean true查找到并选中该文本false未查找到文本
*/
@SuppressWarnings(staticaccess)
public boolean find(String toFindText) {
if (toFindText == null || toFindTextequals())
return false;
// 从selection所在位置开始查询
Dispatch find = wordcall(selection Find)toDispatch();
// 设置要查找的内容
Dispatchput(find Text toFindText);
// 向前查找
Dispatchput(find Forward True);
// 设置格式
Dispatchput(find Format True);
// 大小写匹配
Dispatchput(find MatchCase True);
// 全字匹配
Dispatchput(find MatchWholeWord True);
// 查找并选中
return Dispatchcall(find Execute)getBoolean();
}
/**
* 把选定选定内容设定为替换文本
*
* @param toFindText
* 查找字符串
* @param newText
* 要替换的内容
* @return
*/
public boolean replaceText(String toFindText String newText) {
if (!find(toFindText))
return false;
Dispatchput(selection Text newText);
return true;
}
/**
* 全局替换文本
*
* @param toFindText
* 查找字符串
* @param newText
* 要替换的内容
*/
public void replaceAllText(String toFindText String newText) {
while (find(toFindText)) {
Dispatchput(selection Text newText);
Dispatchcall(selection MoveRight);
}
}
/**
* 在当前插入点插入字符串
*
* @param newText
* 要插入的新字符串
*/
public void insertText(String newText) {
Dispatchput(selection Text newText);
}
/**
*
* @param toFindText
* 要查找的字符串
* @param imagePath
* 图片路径
* @return
*/
public boolean replaceImage(String toFindText String imagePath) {
if (!find(toFindText))
return false;
Dispatchcall(Dispatchget(selection InLineShapes)toDispatch()
AddPicture imagePath);
return true;
}
/**
* 全局替换图片
*
* @param toFindText
* 查找字符串
* @param imagePath
* 图片路径
*/
public void replaceAllImage(String toFindText String imagePath) {
while (find(toFindText)) {
Dispatchcall(Dispatchget(selection InLineShapes)toDispatch()
AddPicture imagePath);
Dispatchcall(selection MoveRight);
}
}
/**
* 在当前插入点插入图片
*
* @param imagePath
* 图片路径
*/
public void insertImage(String imagePath) {
Dispatchcall(Dispatchget(selection InLineShapes)toDispatch()
AddPicture imagePath);
}
/**
* 合并单元格
*
* @param tableIndex
* @param fstCellRowIdx
* @param fstCellColIdx
* @param secCellRowIdx
* @param secCellColIdx
*/
public void mergeCell(int tableIndex int fstCellRowIdx int fstCellColIdx
int secCellRowIdx int secCellColIdx) {
// 所有表格
Dispatch tables = Dispatchget(doc Tables)toDispatch();
// 要填充的表格
Dispatch table = Dispatchcall(tables Item new Variant(tableIndex))
toDispatch();
Dispatch fstCell = Dispatchcall(table Cell
new Variant(fstCellRowIdx) new Variant(fstCellColIdx))
toDispatch();
Dispatch secCell = Dispatchcall(table Cell
new Variant(secCellRowIdx) new Variant(secCellColIdx))
toDispatch();
Dispatchcall(fstCell Merge secCell);
}
/**
* 在指定的单元格里填写数据
*
* @param tableIndex
* @param cellRowIdx
* @param cellColIdx
* @param txt
*/
public void putTxtToCell(int tableIndex int cellRowIdx int cellColIdx
String txt) {
// 所有表格
Dispatch tables = Dispatchget(doc Tables)toDispatch();
// 要填充的表格
Dispatch table = Dispatchcall(tables Item new Variant(tableIndex))
toDispatch();
Dispatch cell = Dispatchcall(table Cell new Variant(cellRowIdx)
new Variant(cellColIdx))toDispatch();
Dispatchcall(cell Select);
Dispatchput(selection Text txt);
}
/**
* 获得指定的单元格里数据
*
* @param tableIndex
* @param cellRowIdx
* @param cellColIdx
* @return
*/
public String getTxtFromCell(int tableIndex int cellRowIdx int cellColIdx) {
// 所有表格
Dispatch tables = Dispatchget(doc Tables)toDispatch();
// 要填充的表格
Dispatch table = Dispatchcall(tables Item new Variant(tableIndex))
toDispatch();
Dispatch cell = Dispatchcall(table Cell new Variant(cellRowIdx)
new Variant(cellColIdx))toDispatch();
Dispatchcall(cell Select);
String ret = ;
ret = Dispatchget(selection Text)toString();
ret = retsubstring( retlength()); //去掉最后的回车符;
return ret;
}
/**
* 在当前文档拷贝剪贴板数据
* @param pos
*/
public void pasteExcelSheet(String pos) {
moveStart();
if (thisfind(pos)) {
Dispatch textRange = Dispatchget(selection Range)toDispatch();
Dispatchcall(textRange Paste);
}
}
/**
* 在当前文档指定的位置拷贝表格
*
* @param pos
* 当前文档指定的位置
* @param tableIndex
* 被拷贝的表格在word文档中所处的位置
*/
public void copyTable(String pos int tableIndex) {
// 所有表格
Dispatch tables = Dispatchget(doc Tables)toDispatch();
// 要填充的表格
Dispatch table = Dispatchcall(tables Item new Variant(tableIndex))
toDispatch();
Dispatch range = Dispatchget(table Range)toDispatch();
Dispatchcall(range Copy);
if (thisfind(pos)) {
Dispatch textRange = Dispatchget(selection Range)toDispatch();
Dispatchcall(textRange Paste);
}
}
/**
* 在当前文档指定的位置拷贝来自另一个文档中的表格
*
* @param anotherDocPath
* 另一个文档的磁盘路径
* @param tableIndex
* 被拷贝的表格在另一格文档中的位置
* @param pos
* 当前文档指定的位置
*/
public void copyTableFromAnotherDoc(String anotherDocPath int tableIndex
String pos) {
Dispatch doc = null;
try {
doc = Dispatchcall(documents Open anotherDocPath)
toDispatch();
// 所有表格
Dispatch tables = Dispatchget(doc Tables)toDispatch();
// 要填充的表格
Dispatch table = Dispatchcall(tables Item
new Variant(tableIndex))toDispatch();
Dispatch range = Dispatchget(table Range)toDispatch();
Dispatchcall(range Copy);
if (thisfind(pos)) {
Dispatch textRange = Dispatchget(selection Range)
toDispatch();
Dispatchcall(textRange Paste);
}
} catch (Exception e) {
eprintStackTrace();
} finally {
if (doc != null) {
Dispatchcall(doc Close new Variant(saveOnExit));
doc = null;
}
}