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