9、jacob操作word控件

本章包括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("以上工作已完成");
	}

猜你喜欢

转载自nickfover.iteye.com/blog/2118905