由于工作的原因开始使用jacob操作OFFICE对象,这几天总算摸出了一些脉络,记录下来。
jacob目前的版本是1.10。如果要在jdk1.4.2以上使用jacob时务必使用此版本。
在打开OFFICE文档(包括模板)前,应先检查文件是否存在,因为COM桥只能抛出Invoke异常不会抛出FileNotFoundException异常,有时会把自己搞糊涂。
在关闭WordApp对象时,如果不希望出现类似提示保存Normal.dot的现象,应该使用如下方法:
<code>Dispatch.call((Dispatch)wordApp,"Quit", new Variant(0));
ComThread.Release();
wordApp = null;</code>
Quit方法的第1个参数0表示不保存更改,当然在此之前应该主动调用SaveAs方法保存文档。这样就不会出现讨厌的“Normal.dot正在被使用”的问题了。
call和invoke的区别
这个一开始捆饶了我很久,后来逐渐体会出了他们间的区别,我猜想call是invoke的特例,call是对Dispatch.Method一类成员的invoke。后来在http://www.koders.com/java/fid629A5A200CEB64EBA85ECB893DC646E60A1A31B3.aspx看到了IDispatch.java的代码,其中的
public Variant call(Dispatch dispatch, String name, Variant[] argv, int[] argc)
{
return (Dispatch.invoke(dispatch, name, Dispatch.Method, argv, argc));
}
间接证明了我的猜想。另外还有一点是call方法使用参数列表而invoke方法使用参数数组传递参数。