JACOB类使用问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JACOB类使用问题相关的知识,希望对你有一定的参考价值。

最近需要将 WORD/EXCEL/PDF 与 html 互转,上网搜了很久找到了大量源代码,都是使用JACOB实现的,但是几乎所有源码都没有详细解释这行代码到底干什么用?JACOB1.9的API中也没有详细解释,有没有谁有相关资料(最好是中文的),详细介绍类中每个方法的作用,使用方法.
谢谢.

public class Jacob
/**
* 打开文件
*
* @param documents
* @param inputDocPath
* @return
*/
private Dispatch open(Dispatch documents, String inputDocPath)
return Dispatch.call(documents, "Open", inputDocPath).toDispatch();


/**
* 选定内容
*
* @param word
* @return
*/
private Dispatch select(ActiveXComponent word)
return word.getProperty("Selection").toDispatch();


/**
* 把插入点移动到文件首位置
*
* @param selection
*/
private void moveStart(Dispatch selection)
Dispatch.call(selection, "HomeKey", new Variant(6));


/**
* 从选定内容或插入点开始查找文本
*
* @param selection
* 选定内容
* @param toFindText
* 要查找的文本
* @return true:查找到并选中该文本;false:未查找到文本。
*/
private 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
*/
private void replace(Dispatch selection, String newText)
Dispatch.put(selection, "Text", newText);


/**
* 全局替换
*
* @param selection
* @param oldText
* @param replaceObj
*/
private void replaceAll(Dispatch selection, String oldText, Object replaceObj)
moveStart(selection);
String newText = (String) replaceObj;
while (find(selection, oldText))
replace(selection, newText);
Dispatch.call(selection, "MoveRight");



/**
* 打印
*
* @param document
*/
private void print(Dispatch document)
Dispatch.call(document, "PrintOut");


/**
* 保存文件
*
* @param word
* @param outputPath
*/
private void save(ActiveXComponent word, String outputPath)
Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(), "FileSaveAs", outputPath);


/**
* 关闭文件
*
* @param doc
*/
private void close(Dispatch doc)
Dispatch.call(doc, "Close", new Variant(true));


/**
* 保存打印doc文档
*
* @param inputDocPath
* @param outPutDocPath
* @param data
* @param isPrint
*/
public void saveDoc(String inputDocPath, String outPutDocPath, HashMap data, boolean isPrint)
// 初始化com的线程
ComThread.InitSTA();
// word运行程序对象
ActiveXComponent word = new ActiveXComponent("Word.Application");
// 文档对象
Dispatch wordObject = (Dispatch) word.getObject();
// 设置属性 Variant(true)表示word应用程序可见
Dispatch.put((Dispatch) wordObject, "Visible", new Variant(false));
// word所有文档
Dispatch documents = word.getProperty("Documents").toDispatch();
// 打开文档
Dispatch document = this.open(documents, inputDocPath);
Dispatch selection = this.select(word);
Iterator keys = data.keySet().iterator();
String oldText;
Object newValue;
while (keys.hasNext())
oldText = (String) keys.next();
newValue = data.get(oldText);
this.replaceAll(selection, oldText, newValue);

// 是否打印
if (isPrint)
this.print(document);

this.save(word, outPutDocPath);
this.close(document);
word.invoke("Quit", new Variant[0]);
// 关闭com的线程
ComThread.Release();

参考技术A 楼上的回答不错

jacob 问题,java 调用jacob,先操作word 转PDF,再操作excel 转pdf,这样就会报错

jacob 问题,java 调用jacob,先操作word 转PDF,再操作excel 转pdf,这样就会报错,是不是jacob没有被释放呢?但是已经释放了啊

错误信息:Can't map name to dispid: Visible

参考技术A 一个过程,让jacob做一次释放。。。。。。。。追问

怎么让释放啊?

本回答被提问者采纳
参考技术B
var model = new TheModel ArticleID = articleId, UserID = userId, Hits = 1 ;
return dal.Add(model);

以上是关于JACOB类使用问题的主要内容,如果未能解决你的问题,请参考以下文章

jacob 操作word

在web项目中使用jacob的问题

使用Jacob将Excel转换PDF问题总结

使用Jacob将Excel转换PDF问题总结

使用Jacob将Excel转换PDF问题总结

jacob运行tomcat报错 Could not initialize class com.jacob.com.ComThread