如果你想写一个JAVA代码,其中需要调用JACOB提供的功能,而你还是新手,也许篇文章会大大降低你的花费时间。
我将一个关于JACOB的代码分成下面几个步骤:
1) ActiveXComponent ax = new ActiveXComponent("a1");//构建ActiveX组件实例
其中的a1的值和你需要调用的ActiveX控件有关
MS控件名 | a1的值 |
InternetExplorer | InternetExplorer.Application |
Excel | Excel.Application |
Word | Word.Application |
Powerpoint | Powerpoint.Application |
vb/java Script | ScriptControl |
windows media Player | WMPlayer.OCX |
Outlook | Outlook.Application |
Visio | Visio.Application |
DAO | DAO.PrivateDBEngine.35 |
MultiFace | MultiFace.Face |
2) Dispatch ds = ax.getObject().toDispatch();//获取Dispatch对象,我们可以把每个Dispatch对象看成是对Activex控件的一个操作,这一步是获得该ActiveX控件的控制权。
(注:浅析JACOB 中提到过Variant类,这里的ax.getObject()便是获得该对象,我们将其转化为任何对象(类型))
3) Dispatch ds1 = Dispatch.get(ds, "a2").toDispatch(); //获取该ActiveX对象数据结构中的a2属性
4) Dispatch d2 = Dispatch.invoke(ds1, "a3", a4, a5, a6).toDispatch(); //功能调用,对ActiveX对象ds1的a3属性执行a4(Dispatch.Put\Dispatch.Get等)操作,执行后a3的值为a5,a6为错误参数码常定义为new int[1],(注:call、get和put方法都是通过该方法实现的)
5) Dispatch ds2 = Dispatch.put(ds, "a7","a8").toDispatch();//将ActiveX对象ds的属性a4的值设置为a5,该方法返回类型同get一样
6) Dispatch ds3 = Dispatch.call(ds1, "a9", a10);//该方法和get方法非常类似,他是把a9属性赋值给a10
Ok其他的方法我觉得很容易理解,这里就不再做描述了。
下面是一个关于excel的代码,也许对您的进一步自学,会有好处
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class ExcelDispatchTest {
public static void main(String[] args) {
ComThread.InitSTA();
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
try {
System.out.println("version=" + xl.getProperty("Version"));
System.out.println("version=" + Dispatch.get(xl, "Version"));
Dispatch.put(xl, "Visible", new Variant(true));
Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
Dispatch workbook = Dispatch.get(workbooks, "Add").toDispatch();
Dispatch sheet = Dispatch.get(workbook, "ActiveSheet").toDispatch();
Dispatch a1 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
new Object[] { "A1" }, new int[1]).toDispatch();
Dispatch a2 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
new Object[] { "A2" }, new int[1]).toDispatch();
Dispatch.put(a1, "Value", "123.456");
Dispatch.put(a2, "Formula", "=A1*2");
System.out.println("a1 from excel:" + Dispatch.get(a1, "Value"));
System.out.println("a2 from excel:" + Dispatch.get(a2, "Value"));
Variant f = new Variant(false);
Dispatch.call(workbook, "Close", f);
} catch (Exception e) {
e.printStackTrace();
} finally {
xl.invoke("Quit", new Variant[] {});
ComThread.Release();
}
}
以上转载自网管之家:http://www.bitscn.com/pdb/java/200904/161117.html
环境搭建:
1、使用JACOB需要下载jacob.jar包,还有支持的Jacob.dll
2、先导jar包进工程中,再把 DLL 文件添加到系统的 PATH 环境变量中(根据系统操作位导入32或64位)
下载jacob-1.17-M2: http://yunpan.cn/QpnjIZK7D4jKC
翻译:http://www.ibm.com/developerworks/cn/java/j-lo-jacob/
jacob常见问题解决方法:
使用jacob时,把dll放到window/system32下就成,不需要注册
1、如果出现下面的错误
com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: Version
Description: An unknown COM error has occured.
表示dll的版本不对,换成最新版本即可。
2、如果出现下面的错误
no jacob in java.library.path
java.lang.UnsatisfiedLinkError: no jacob in java.library.path
表示把dll放到path下即可,设置path或是放到window/system32下
1、介绍
Jacob 是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。至于什么是COM组件,大家自己Google吧。
2、安装和配置
Jacob是一个开源软件,它的官方站点是:http://danadler.com/jacob/ 大家可以到上面下载源代码研究,也可以直接下载编译后的二进制文件。
- 下载包jacob_x.x.zip,解压后有几个文件:jacob.jar、jacob-x.x-M2-x86.dll
- 把jacob-x.x-M2-x86.dll拷贝到%JAVA_HOME%\jre\bin目录下,其中,%JAVA_HOME%就是JDK的安装目录。接着直接在java IDE中引用jacob.jar就可以使用了。
- 3、读、写Word的简单示例
package jacobproject;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Variant;
import com.jacob.com.Dispatch;
public class Word {
String strDir = "c:jacob_1.9";
String strInputDoc = strDir + "file_in.doc";
String strOutputDoc = strDir + "file_out.doc";
String strOldText = "[label:import:1]";
String strNewText =
"I am some horribly long sentence, so long that [insert anything]";
boolean isVisible = true;
boolean isSaveOnExit = true;
public Word() {
ActiveXComponent oWord = new ActiveXComponent("Word.Application");
oWord.setProperty("Visible", new Variant(isVisible));
Dispatch oDocuments = oWord.getProperty("Documents").toDispatch();
Dispatch oDocument = Dispatch.call(oDocuments, "Open", strInputDoc).
toDispatch();
Dispatch oSelection = oWord.getProperty("Selection").toDispatch();
Dispatch oFind = oWord.call(oSelection, "Find").toDispatch();
Dispatch.put(oFind, "Text", strOldText);
Dispatch.call(oFind, "Execute");
Dispatch.put(oSelection, "Text", strNewText);
Dispatch.call(oSelection, "MoveDown");
Dispatch.put(oSelection, "Text",
"nSo we got the next line including BR.n");
Dispatch oFont = Dispatch.get(oSelection, "Font").toDispatch();
Dispatch.put(oFont, "Bold", "1");
Dispatch.put(oFont, "Italic", "1");
Dispatch.put(oFont, "Underline", "0");
Dispatch oAlign = Dispatch.get(oSelection, "ParagraphFormat").
toDispatch();
Dispatch.put(oAlign, "Alignment", "3");
Dispatch oWordBasic = (Dispatch) Dispatch.call(oWord, "WordBasic").
getDispatch();
Dispatch.call(oWordBasic, "FileSaveAs", strOutputDoc);
Dispatch.call(oDocument, "Close", new Variant(isSaveOnExit));
oWord.invoke("Quit", new Variant[0]);
}
public static void main(String[] args) {
Word word = new Word();
}
}
jacob包括两个部分:
- com.jacob.activeX: ActiveXComponent类
- com.jacob.com: 其它类和元素
5、Jacob类
Jacob的结构很简单,包含以下几个类:
- ActiveXComponent Class:封装了Dispatch对象,用于创建一个封装了COM组件对象的Java Object
- Dispatch Class:用于指向封装后的MS数据结构。常用的方法有call,subcall,get,invoke…后面会介绍使用方法。
- Variant Class:用于映射COM的Variant数据类型。提供Java和COM的数据交换。
ComException Class:异常类
6、Jacob方法
用于访问COM/DLL对象的方法,读取、修改COM/DLL对象的属性。
- call method:属于Dispatch类。用于访问COM/DLL对象的方法。方法进行了重载,方便不同场合调用。返回一个Variant类型的值。
- callSub method:使用方法和call一样,不过它不返回值。
- get method:读取COM对象的属性值,返回一个Variant类型值。
- put method:设置COM对象的属性值。
- invoke method:call的另一种用法,更复杂一些。
- invokesub method:subcall的另一种用法
- getProperty method:属于ActiveXComponent类,读取属性值,返回一个Variant类型值。
setProperty method:属于ActiveXComponent类,设置属性值。
要注意一点:在使用Jacob时,很重要的一点是,用户必须安装有Office的应用程序。否则也就无法建立Java-COM桥,进而无法解析了。
文献出处:http://www.cnblogs.com/vulcans/archive/2009/09/08/1562588.html