- 浏览: 109244 次
- 性别:
- 来自: 北京
文章分类
最新评论
JACOB是一个JAVA到微软的COM接口的桥梁。使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象。如果你要对 MS Word、Excel 进行处理,JACOB 是一个好的选择。JACOB目前已经成为sourceforge(http://sourceforge.net/projects/jacob-project/)的一个开源项目,本文使用的版本是1.10.1。
因为在项目中用到了这个技术,但是在网上没有查到很符合题目的文章,经过我自己的探索,总结写出了这篇文章。
这篇文章可能不能完全满足你的要求,你也可以按照我的探索方法进行探索:参阅VBA操作Office的组件的书籍,然后参考下面的Tip完成需要的功能。文章最后附完整的测试代码。
生成WORD文档的简单讲解:
1. 初始化com的线程,非常重要,否则第二次创建com对象的时候会出现can’t co-create object异常 (参见jacob的帮助文档),完成操作com组件后要调用 realease方法
ComThread.InitSTA();// 初始化com的线程,非常重要!!使用结束后要调用 realease方法
2. 初始化word应用程序,新建一个空白文档,取得文档内容对象//Instantiate objWord //Declare word object
ActiveXComponent objWord = new ActiveXComponent("Word.Application");
//Assign a local word object
Dispatch wordObject = (Dispatch) objWord.getObject();
//Create a Dispatch Parameter to show the document that is opened
Dispatch.put((Dispatch) wordObject, "Visible", new Variant(true));// new Variant(true)表示word应用程序可见
Tip:设置一个对象的属性的时候,利用Dispatch的put方法,给属性赋值。上面这行语句相当于vb的 wordObject.Visible = true 语句
//Instantiate the Documents Property
Dispatch documents = objWord.getProperty("Documents").toDispatch(); //documents表示word的所有文档窗口,(word是多文档应用程序)
//Add a new word document, Current Active Document
Dispatch document = Dispatch.call(documents, "Add").toDispatch(); // 使用Add命令创建一个新文档,用Open命令可以打开一个现有文档
Tip:调用一个对象的方法的时候,利用Dispatch的call方法,上面的语句相当于vb的document = documents.Add() 语句。
Dispatch wordContent = Dispatch.get(document, "Content").toDispatch(); // 取得word文件的内容
Tip:取得一个对象的成员变量(属性)时利用Dispatch的get方法,上面的语句相当于vb的wordContent = document.Content语句
3. 取得word文档的内容后,可以对其内容进行操作
Dispatch.call(wordContent, "InsertAfter", "这里是一个段落的内容");//插入一个段落
4. 设置刚插入的段落的文字格式
Dispatch paragraphs = Dispatch.get(wordContent, "Paragraphs").toDispatch(); // 所有段落
int paragraphCount = Dispatch.get(paragraphs, "Count").toInt(); // 一共的段落数
// 找到刚输入的段落,设置格式
Dispatch lastParagraph = Dispatch.call(paragraphs, "Item",
new Variant(paragraphCount)).
toDispatch(); // 最后一段
Dispatch lastParagraphRange = Dispatch.get(lastParagraph, "Range").
toDispatch();
Dispatch font = Dispatch.get(lastParagraphRange, "Font").toDispatch();
Dispatch.put(font, "Bold", new Variant(true)); // 设置为黑体
Dispatch.put(font, "Italic", new Variant(true)); // 设置为斜体
Dispatch.put(font, "Name", new Variant("宋体")); //
Dispatch.put(font, "Size", new Variant(12)); //小四
注意:如果想插入一个新的空白行,也需要设置段落的文字格式,否则新插入行的文字格式会于刚插入的段落的格式相同。
5. 将当前文档保存
Dispatch.call(document, "SaveAs", new Variant("C:
abc.doc")); // 保存一个新文档
6. 释放COM线程
ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理
完整测试代码:(StudyJacob.java 附件中有本文章和java源文件)
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import com.jacob.com.ComThread;
public class StudyJacob {
public static void main(String[] args) {
ComThread.InitSTA();// 初始化com的线程,非常重要!!使用结束后要调用 realease方法
//Instantiate objWord //Declare word object
ActiveXComponent objWord = new ActiveXComponent("Word.Application");
//Assign a local word object
Dispatch wordObject = (Dispatch) objWord.getObject();
//Create a Dispatch Parameter to show the document that is opened
Dispatch.put((Dispatch) wordObject, "Visible", new Variant(true));// new Variant(true)表示word应用程序可见
//Instantiate the Documents Property
Dispatch documents = objWord.getProperty("Documents").toDispatch(); //documents表示word的所有文档窗口,(word是多文档应用程序)
//Add a new word document, Current Active Document
Dispatch document = Dispatch.call(documents, "Add").toDispatch(); // 使用Add命令创建一个新文档,用Open命令可以打开一个现有文档
Dispatch wordContent = Dispatch.get(document, "Content").toDispatch(); // 取得word文件的内容
Dispatch.call(wordContent, "InsertAfter", "这里是一个段落的内容");//插入一个段落
Dispatch paragraphs = Dispatch.get(wordContent, "Paragraphs").toDispatch(); // 所有段落
int paragraphCount = Dispatch.get(paragraphs, "Count").toInt(); // 一共的段落数
// 找到刚输入的段落,设置格式
Dispatch lastParagraph = Dispatch.call(paragraphs, "Item",
new Variant(paragraphCount)).
toDispatch(); // 最后一段
Dispatch lastParagraphRange = Dispatch.get(lastParagraph, "Range").
toDispatch();
Dispatch font = Dispatch.get(lastParagraphRange, "Font").toDispatch();
Dispatch.put(font, "Bold", new Variant(true)); // 设置为黑体
Dispatch.put(font, "Italic", new Variant(true)); // 设置为斜体
Dispatch.put(font, "Name", new Variant("宋体")); //
Dispatch.put(font, "Size", new Variant(12)); //小四
Dispatch.call(document, "SaveAs", new Variant("C:
abc.doc")); // 保存一个新文档
ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
如果你想写一个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控件的控制权。
(注: 中提到过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();
}
}
发表评论
-
解决excel文字读取错误 可能某些数字格式已丢失
2018-12-29 09:11 618ServletOutputStream ... -
struts上传下载多个文件
2015-04-30 11:24 512实例: 第一步导入包: commons-fileupload- ... -
jdcob--Could not initialize class com.jacob.com.ComThread
2015-02-27 09:00 19081--dll 文件 放在tomcat/bin 下面 ... -
ntko打印公章
2014-12-02 09:04 566//TANGER_OCX_OBJ.ActiveDocument ... -
hibernate 映射文件生成数据库表脚本
2011-03-28 16:20 865import org.hibernate.cfg.Config ... -
java换肤改变页面肤色
2011-03-02 14:05 994import java.io.IOException;impo ... -
java 过滤未登录的用户
2011-03-02 14:03 1102<filter> <filte ... -
java 在线用户统计
2011-03-02 13:47 1629web.xml <listener> ... -
java 过滤乱码
2011-03-02 13:44 947web.xml <filter> <f ... -
hibernate 查询乱码
2010-10-06 15:12 746在使用HQL进行查询时,如果查询语句中存在中文字符,则会有乱码 ... -
java 多线程代码
2010-09-30 12:44 1489package com.jacob.activeX; imp ... -
过滤未登录的用户
2010-09-15 10:59 880package com.filter; import jav ... -
jacob操作word 解决换页问题
2010-09-13 08:17 3765package audit.pub.word; imp ... -
jacob操作word增加表格 行列
2010-08-10 09:52 2940import com.jacob.activeX.Activ ... -
jsp导出word 带图片
2010-04-12 17:28 33881.将word另存为html格式,然后将html格式的文件另存 ... -
读取blob格式图片上传到服务器目录
2010-04-12 17:21 1989//得到blob格式图片 String fileUrl = ... -
批量导入图片保存成blob格式
2010-03-31 15:15 1688/** * 创建目录 * @param director ... -
org.apache.tools包 解压缩zip 解决中文乱码 ant 版本冲突
2010-03-30 12:50 3039private void createDirectory(St ... -
java 获取文件大小
2010-03-29 14:32 15807import java.io.*; public class ... -
xml的读取分析 key value
2010-03-23 15:20 1588package com.basedata.xml; impo ...
相关推荐
本篇文章将深入探讨如何使用Jacob来操作Word资料。 一、Jacob库的安装与配置 首先,你需要下载Jacob的JAR文件,将其添加到你的项目类路径中。如果是Maven项目,可以在pom.xml文件中添加对应的依赖。然后,确保你的...
这个开发文档及其示例资源是开发者理解和应用Jacob的重要参考资料。 **Jacob的核心功能** 1. **COM接口封装**:Jacob使得Java程序能够调用COM组件,这意味着你可以通过Java来操作Microsoft Word、Excel等应用程序...
官方网站通常会提供最新的版本、API文档、示例代码以及常见问题解答,这对于开发者来说是非常有价值的参考资料。 4. 使用Jacob库的步骤: - 引入库:在Java项目中,需要将Jacob的jar文件添加到类路径中。 - 加载...
除了DLL文件,Jacob-1.17-M2可能还包含了一些文档资料,这些文档通常会提供详细的API参考、示例代码以及使用指南,帮助开发者更好地理解和使用Jacob。这些文档对于初学者来说尤其重要,因为Jacob的使用涉及到一些COM...
"使用jacob转pdf资料"这个主题涉及到一个名为jacob的Java库,它允许开发者通过Java代码来调用Microsoft Office或WPS组件,实现各种文档格式之间的转换。 首先,jacob(Java COM Bridge)是一个开源的Java库,它的...
说明文档和API资料是学习和使用Jacob的重要参考资料。它们详细解释了Jacob的使用方法、类库结构以及各种接口的功能,帮助开发者快速理解和应用。API文档通常会列出每个类和方法的详细描述,包括参数、返回值、异常...
尽管目前只有英文版,但它是学习和使用Jacob的重要参考资料。 使用Jacob时,开发者可以执行以下操作: - **创建和初始化COM对象**:通过Jacob提供的Java类,可以实例化并初始化COM对象,如Excel、Word等Microsoft ...
这个压缩包包含了Jacob的32位和64位版本的jar文件,以及相关的文档资料,使得开发人员可以在Java应用中无缝地利用MS Office的功能,如Word、Excel和PowerPoint,进行文件转换和其他自动化任务。 **主要功能** 1. *...
综上所述,这个压缩包提供了使用Java和Jacob库将Word文档转换为PDF的解决方案,结合Maven进行项目管理,并附带了DLL处理工具和相关资料。开发者需要了解Java、Jacob、Maven以及COM组件的基本概念,以便成功地在项目...
压缩包中的"jacob-1.17-M2 驱动 带文档"可能表示除了DLL文件外,还包含了相关的驱动程序文件以及文档资料。驱动程序是使硬件设备与操作系统进行通信的软件,对于Jacob来说,这个“驱动”可能指的是与Jacob相关的COM...
### Jacob与Excel集成知识点 #### 一、Jacob简介 Jacob(Java-COM Bridge)是一个开源的Java库,它允许Java应用程序调用COM组件。通过Jacob,开发者能够利用Java语言的强大功能来操作Windows平台上的各种COM对象,...
这些资源通常包括API文档、示例代码、安装指南等,对于初次接触Jacob的开发者来说,是非常有价值的参考资料。 总结起来,Jacob-1.18是一个强大的工具,使得Java开发者能够利用Windows的COM组件扩展其应用程序的功能...
对于初学者而言,这些文档是快速理解和使用Jacob的重要参考资料。 4. **使用示例** - 创建COM对象:通过`com.jacob.com.ComThread.init Jacob()`初始化线程,然后使用`com.jacob.activeX.ActiveXComponent`类创建...
通过学习这些资料,开发者可以掌握如何在Java中使用Jacob库来高效地处理Microsoft Office文档,包括读写、转换和生成HTML,这对于自动化办公流程或构建基于Web的文档处理系统非常有帮助。此外,对于不熟悉Jacob的...
Jacob是Java和COM之间的一个桥梁,它允许Java代码与COM组件进行交互,使得开发者能够利用Java编程...它包含了运行和使用Jacob所需的全部组件,以及可能的文档资料,能够帮助开发者快速上手并成功集成到他们的项目中。
2. 如果你的系统是64位的,可能还需要添加对应的dll文件(例如,jacob.dll)到系统路径,因为Jacob在运行时需要这个本地库。 3. 创建`DynamicDispatchObject`实例,这通常是COM对象的根,比如`ActiveXObject`。 4. ...
这个文档是开发者使用Jacob进行开发的重要参考资料,应当仔细阅读。 **五、示例应用** 例如,使用Jacob创建一个新的Excel工作簿并保存的Java代码示例: ```java import com.jacob.activeX.ActiveXComponent; ...
API文档是开发者的重要参考资料,它详细列出了Jacob的所有类、方法和属性,以及如何使用它们来实现特定功能。有了这份文档,开发者可以更方便地学习和掌握Jacob的使用。 **4. 使用Jacob的步骤** 使用Jacob时,通常...
描述中的“javadoc”是指Jacob的API文档,它是Java开发者的重要参考资料,提供了详细的类、方法和接口说明,帮助开发者理解和使用Jacob的功能。"dll"文件是Windows下的动态链接库,它包含了Jacob运行时所需的COM交互...
Jacob,全称Java-COM Bridge,是一个开源Java库,它为...总之,Jacob用户指南中文版是Java开发者在处理与Windows COM组件交互时的重要参考资料,通过深入学习和实践,可以极大地扩展Java应用在Windows环境下的功能。