它允许在java中调用com接口自动组件,它使用JNI(本地调用程序)来进行本地调用COM库。它可运行在x86和支持32位和64位Java虚拟机
X64的环境。
测试源码包:
密码: ej9u
JACOB项目的由来
首先,我们将了解JACOB项目的基本情况,探讨在什么样的情况下选择它来完成您的任务
COM中暴露出来的方法,主要有两种机制:早期绑定和晚期绑定。
大桥调用可以参考IBM的RJCB项目,它提供了一套高性能的解决方案。当然您需要了解更多的COM组件的细节,虽然框架为您完成了大部分的生成桥
RJCB仅支持那些提供早期绑定的虚函数表的接口的COM API。
而晚期绑定方式是通过IDispatch的接口来实现,类似的Java的反射机制,您可以按照名称或者ID进行方法调用,这种设计主要目的是支持脚本语言操作COM,因为脚本是解释执行的,通常都不支持指针也就没有C
+中的虚函数表 ID
雅各开源项目提供的是一个JVM独立的自动化服务器的实现,其核心是基于JNI技术实现的变异,调度等接口,设计参考了微软VJ
+
+内置的通用自动化服务器,但是微软的实现仅仅支持自身的JVM。通过雅各,您可以方便地在Java的语言中进行晚期绑定方式的调用,开源项目实现了一种简单,灵活的Java与COM的通信方式,为您充分利用现有应用提供了可能。
Jacob安装
下载jacob的zip包,如jacob-1.18-M3.zip。
将jacob.jar引入项目。
将dll库放到指定位置,dll分为64位和32位,jacob-xx-x64.dll和jacob-xx-x32.dll,不知道放哪个都放上是一个好的选择。
为了确保能使程序找到库,可能考虑入到如下位置:
“WINDOWS\SYSTEM32”下面。
运行程序的jdk或jre的bin目录下。
如果用MyEclipse,可以指定运行程序所用的jdk,否则要放入MyEclipse自己的jdk里一份。
一般系统没有加载到Jacob.dll文件时,报错信息为:”java.lang.UnsatisfiedLinkError:
no jacob in java.library.path”
Jacob基础语法说明
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 |
+———————————–+———————————–+
Dispatch ds = ax.getObject(). toDispatch();
获取Dispatch对象,我们可以把每个Dispatch对象看成是对Activex控件的一个操作,这一步是获得该ActiveX控件的控制权。
(注:浅析JACOB 中提到过Variant类,这里的ax.getObject()便是获得该对象,我们将其转化为任何对象(类型))
Dispatch.get(ds, “a1”);
返回Variant类型,获取ds对象的a1属性,通过to…()和get...()方法可以转换为java的很多类型
Dispatch.put(ds, “a1”, …);
设置ds对象a1属性,具体参数为…指定
ActiveXComponent有setProperty(“a1”,
…)和getProperty(“a1”)方法,比Dispatch的put和get方法方便!
Dispatch.invoke(ds, “a3”, a4, a5, a6).toDispatch();
说明:ds为要执行操作的对象,a3为要执行的操作名称;a4一般为Dispatch.Method、Dispatch.Put、Dispatch.Get三种,正是这三种指定让此方法可以执行put、set、call同样操作;a5为一个对象数组,形如:new
Object[]{},一般的当Method时为三个参数,Get时没有参数,Put是为两个参数;a6一般为new
int[1]
Dispatch.call(ds, “a1”, …) .toDispatch();
和invoke差不多,执行a1名称的操作,少了invoke中的a4和a6参数;…和invoke中newObject[]{}中参数一样
所以Dispatch.call()和Dispatch.invoke()方法可以执行Dispatch.put()和Dispatch.set()的操作,反之不可以
Word中的属性参数
Documents:所有文档
Open:打开文档
ActiveXComponent.Visible:设置编辑器是否可见
Tables:获得所有的表格
Bookmarks:所有标签
Selection:光标所在处或选中的区域
select:选中
typeParagraph:设置为一个段落
ParagraphFormat:段落格式,用alignment设置
alignment:1、居中,2、靠右,3、靠左
Add:新建一个word文档
Close:关闭文档,0不保存,-1保存,-2弹出框确认,注意ComThread.Release();关闭整个word进程
SaveAS:另存为
save:保存
printOut:打印
Application:得到ActiveXComponent的实例
WindowState:Application的属性,表示窗口的大小,0、default,1、maximize,2、minimize
top、left、height、width:application的属性,表示窗口的位置
ActiveXComponent.Quit:关闭所有word文档,但是不退出整个word程序
Range:表示文档中的一个连续范围,由一个起始字符位置和一个终止字符位置定义,进而可以得到格式的信息
Item:得到指定的表格
Rows:得到表格的所有行
Cell:表格的一个单元格
Text:word的文本内容
InsertFile:插入文件
InsertRowsBelow:在指定的行下面插入一行
InsertAfter:在指定对象后插入
Delete:删除,可以是表格的行
Count:返回数目,比如Rows、Tables的数目
Height:返回高度,比如行高、表格行的高
Split:拆分单元格,要指定行数和列数
Merge:合并单元格
Exists:指定的对象是否存在,返回bool值
Copy:复制
Paste:粘贴
Font:字体
Name:字体的名字
Bold:字体是否为粗体
Italic:字体是否为斜体
Underline:字体是否有下划线
Color:颜色
Size:大小
Borders:指定边框,-1为上边框,-2左边框,-3为下边框,-4有右边框,-5为横向边框,-6为纵向边框,-7从左上角开始的斜线,-8从左下角开始的斜线
AutoFitBehavior:自动调整大小,1为内容自动调整大小,2为窗口自动调整大小
Content:去的内容
InLineShapes:
AddPicture:增加一张图片,需要制定路径
homeKey:光标移到开头
moveDown:光标往下一行
moveUp:光标往上一行
moveRight:光标往左一列
moveLeft:光标往右一列
find:要查找的文本
Forward:向前查找
Format:查找的文本格式
MatchCase:大小写匹配
MatchWholeWord:全字匹配
Execute:开始执行查找