本章包括jacob基本类的学习和jacob对office的组件操作方法封装,方便以后使用;
COM(Component Object Model组对象模型) 提供了一种与其他语言的互操作方式,叫做自动化(Automation)。现有的 Java COM 互操作的解决方案有很多种,由于设计目的的不同,在性能、易用性等方面都有很大的区别。JACOB 开源项目提供的是一个 JVM 独立的自动化服务器实现,其核心是基于 JNI 技术实现的 Variant, Dispatch 等接口,设计参考了 Microsoft VJ++ 内置的通用自动化服务器,但是 Microsoft 的实现仅仅支持自身的 JVM。通过 JACOB,您可以方便地在 Java 语言中进行晚期绑定方式的调用。
参考:http://www.soft6.com/tech/13/135038.html
java connection Bridge;下载jacob.jar ,对应(86/64)的dll文件放在c:/windows/system32下;也可以放在%Java_Home%jre/bin下
1.ActiveXComponent类;
public class ActiveXComponent extends Dispatch
这个对象与Dispatch.get()方法有关,ActiveXComponent ax = new ActiveXComponent("a1");//构建ActiveX组件实例;
组件名称 a1的值
InternetExplorer.Application | InternetExplorer |
Excel.Application | Excel |
Word.Application | Word |
Powerpoint.Application | Powerpoint |
ScriptControl | vb/java Script |
WMPlayer.OCX | windows media Player |
Outlook.Application | Outlook |
Visio.Application | Visio |
DAO.PrivateDBEngine.35 | DAO |
MultiFace.Face | MultiFace |
2、Dispatch类;
public class Dispatch extends JacobObject { public static Variant get(Dispatch dispatchTarget, String name) { public static Variant get(Dispatch dispatchTarget, int dispid) { public static native Variant invokev(Dispatch dispatchTarget, String name,int dispID, int lcid, int wFlags, Variant[] vArg, int[] uArgErr); 重要的两个类com.jacob.com.Dispatch和com.jacob.com.Variant继承基础类com.jacob.com.JacobObject。(com.jacob.com.Dispatch;提供了调度MS(Microsoft) windows系统API,比如进程的管理。com.jacob.com.Variant; 里面数据类型的转换的方法,Variant类本身是JACOB的最最基本的数据类,他可以被转换成任何的类,使用toDispatch();可以将Variant转化成Dispatch对象。 COM(Component Object Model组对象模型)线程管理:com.jacob.com.ComThread
activeX是由微软公司推出的用于Internet的技术,以前曾经被称为OLE 和OCX,activeX web插件可以用于各种非HTML的工作,比如,对MicrosoftExcel 或 MicrosoftWord 文件做操作、解析JS,VB脚本、播放FALSH、调用Microsoft MediaPlayer等。
2、Libarary
package org.Smart; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /* Jacob 是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁。使用Jacob自带 的DLL动态链接库,并通过JNI的方式实现了在Java平台上对COM程序的调用。 Jacob是一个开源软件,它的官方站点是:http://danadler.com/jacob/ 把jacob-x.x-M2-x86.dll拷贝到%JAVA_HOME%\jre\bin目录下, */ public class DOC_Jacob_Tool { // 表示一个MS组件 private ActiveXComponent MSword = null; // 表示要进行处理的(word)文档,指向封装后的MS数据结构 private Dispatch doc = null; // 表示文档集合 private Dispatch documents = null; public DOC_Jacob_Tool() { if (MSword == null) { MSword = new ActiveXComponent("Word.Application"); } } // 保存文档 public void save() { Dispatch.call(doc, "Save"); } //存为新docx文档,并可以指定保存路径filename="e:/jsL/2014.docx" public void saveFileAs(String filename) { Dispatch.call(doc, "SaveAs", filename); } public void closeDocument() { if (doc != null) { Dispatch.call(doc, "Close", new Variant(0)); //0不保存修改 -1 保存修改 -2 提示是否保存修改 doc = null; } } public void closeWord() { Dispatch.call(MSword, "Quit"); MSword= null; doc = null; } // 设置是否在前台打开 word 程序 , public void setVisible(boolean visible) { MSword.setProperty("Visible", new Variant(visible)); } //创建新文档(在"库\文档"目录中 创建一个空白文档并打开) public void createNewDoc(){ setVisible(true); documents=Dispatch.get(MSword, "Documents").toDispatch();//documents表示word的所有文档窗口,(word是多文档应用程序) doc=Dispatch.call(documents, "Add").toDispatch(); // 使用Add命令创建一个新文档,用Open命令可以打开一个现有文档 } //打开一个存在的文档 public void openDoc(String docPath) { setVisible(true); documents = Dispatch.get(MSword, "Documents").toDispatch(); doc = Dispatch.call(documents, "Open", docPath,new Variant(true),new Variant(false)).toDispatch(); //编码转换,是否只读 } /* 在指定目录创建新文档 */ //向指定文档插入图片 public void insertPic(String docPath, String picPath) { documents = Dispatch.get(MSword, "Documents").toDispatch(); doc = Dispatch.call(documents, "Open", docPath,new Variant(true),new Variant(false)).toDispatch(); //编码转换,是否只读 Dispatch selection = Dispatch.get(MSword, "Selection").toDispatch(); Dispatch image = Dispatch.get(selection, "InLineShapes").toDispatch(); Dispatch.call(image, "AddPicture", picPath);//光标处于开头,图片在最前方插入 save(); closeDocument(); closeWord(); } //向指定文档添加字符串 public void insertString(String docPath, String words){ // setVisible(true); documents = Dispatch.get(MSword, "Documents").toDispatch(); doc = Dispatch.call(documents, "Open", docPath,new Variant(true),new Variant(false)).toDispatch(); //编码转换,是否只读 Dispatch wordContent = Dispatch.get(doc, "Content").toDispatch(); // 取得word文件的内容 Dispatch.call(wordContent, "InsertAfter", words); //光标处插入一条字符串 save(); closeDocument(); closeWord(); } }
3、测试
public static void main(String[] args) throws FileNotFoundException, IOException, InvalidFormatException { ComThread.InitSTA();// 初始化com的线程,非常重要!!使用结束后要调用 realease方法 // new DOC_Jacob_Tool().createNewDoc(); // new DOC_Jacob_Tool().openDoc("E:/jsL/2007.docx"); // new DOC_Jacob_Tool().insertPic("E:/jsL/2007.docx", "e:/jsL/20130415161705906.jpg"); new DOC_Jacob_Tool().insertString("E:/jsL/2007.docx", "e:/jsL/20130415161705906.jpg"); ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理 System.out.println("以上工作已完成"); }