如何利用Java-JACOB操作WORD文档
作者:Hu Baoshun
信箱:neu.hubs@gmail.com
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();
}
}
相关推荐
"使用jacob转pdf资料"这个主题涉及到一个名为jacob的Java库,它允许开发者通过Java代码来调用Microsoft Office或WPS组件,实现各种文档格式之间的转换。 首先,jacob(Java COM Bridge)是一个开源的Java库,它的...
在"Jacob实现文字转换语音"这个主题中,我们关注的是如何利用Jacob库将文本数据转换为语音输出。这个功能通常涉及到TTS(Text-to-Speech)技术,是自然语言处理和人机交互领域的一个重要组成部分。在Windows系统中,...
在IT行业中,转换Office文档为PDF格式是一种常见的需求,特别是在文档分发、打印或保持格式一致性时。...确保`jacob.dll`和`jacob.jar`正确配置,并处理好可能的兼容性和性能问题,是实现此功能时需要关注的重要点。
1. Jacob的核心功能: Jacob的核心在于其提供了Java和COM之间的接口,使得Java程序可以调用Windows系统中的COM组件,如Excel、Word等Office应用,或者任何其他基于COM的第三方工具。这极大地扩展了Java开发者的应用...
在Java编程环境中,有时我们需要实现一些与操作系统交互的功能,例如将文字转换为语音并进行播放。...通过学习和实践,你可以熟练掌握使用Jacob进行文字转语音播放的技术,从而提升你的Java应用程序的功能性。
学习jacob的绝对最佳代码。 其中基本包括所有word操作。 有时间大家可以一起交流。
"jacob office转pdf"这个主题涉及到的是使用Jacob库来实现这样的转换。Jacob是一个Java和COM(Component Object Model)之间桥接的开源库,它允许Java应用程序调用COM组件,从而能够与微软的Office应用程序进行交互...
通过以上介绍,我们可以看出这个实例代码是一个很好的学习资源,它展示了如何在Java中利用JACOB和Windows的TTS引擎将文字转化为声音。对于初学者来说,这是一个了解Java与本地系统交互、学习TTS技术的好例子。同时,...
1. **Java 与 Jacob 集成** - 在 Java 项目中引入 Jacob 库,通常需要将 `jacob-x.x.x.dll` 文件放在系统的 PATH 环境变量下或者项目的类路径中。 - 添加 Jacob 的 JAR 文件到项目的类路径,例如 `jacob.jar`。 2...
1. **安装Jacob**:下载Jacob的jar文件,并将其添加到你的Java项目的类路径中。同时,还需要将Jacob的动态链接库(dll文件)放到系统路径下的bin目录,以便Java能够找到并加载它。 2. **初始化COM**:在Java代码中...
《使用Jacob进行文字转音频操作详解》 在Java开发中,有时我们需要将文字转换为音频文件,例如制作有声读物、语音助手等应用。这时,一个强大的工具库——Jacob,就能派上用场。Jacob全称为Java Advanced ...
1. DLL文件版本不匹配:确保你使用的JACOB版本和你的Office版本兼容。 2. 权限问题:如果Word文档位于受保护的位置,可能需要以管理员权限运行程序。 3. 文档格式不支持:虽然JACOB支持XML格式的Word文档,但不是...
本篇文章将深入探讨如何使用Jacob来操作Word资料。 一、Jacob库的安装与配置 首先,你需要下载Jacob的JAR文件,将其添加到你的项目类路径中。如果是Maven项目,可以在pom.xml文件中添加对应的依赖。然后,确保你的...
1. **导入Jacob库**:在Java项目中,将`jacob.jar`添加到类路径中。如果是Maven项目,可以在pom.xml文件中添加对应的依赖。 2. **设置系统路径**:确保运行时环境的系统路径(PATH)包含了对应操作系统版本的`jacob...
标题提到的"Jacob Word excel 转PDF 合并PDF文件"是指使用Jacob库来将Microsoft Word和Excel文档转换为PDF格式,并进一步合并多个PDF文件。Jacob(Java Advanced COM Bridge)是一个Java库,它允许Java应用程序与...
《Jacob文字转语音工具包详解及应用》 在信息技术领域,人机交互的方式日益多样化,其中,文字转语音(TTS,Text-to-Speech)技术是实现无障碍沟通、提升用户体验的重要手段之一。Jacob,全称为Java COM Bridge,是...
以下是对利用Jacob实现Word转PDF的详细说明: 1. **Jacob库介绍**: Jacob是一个Java到COM桥接器,它使得Java开发者能够使用COM组件,如Microsoft Office的Word应用,来执行特定的任务。Jacob通过JNI(Java Native...
在Java项目中,将`jacob.jar`添加到类路径,并确保系统路径包含`jacob.dll`,这是运行Jacob的必要条件。 二、Jacob基本使用 Jacob的使用主要包括创建`ActiveXComponent`对象,通过这个对象可以调用COM组件的方法。...
### Jacob 学习笔记 #### 一、Jacob 概述 Jacob,即 Java COM Bridge,是一种用于连接 Java 应用程序与 COM 组件的技术。它允许开发者利用 Java 的跨平台特性,同时能够调用 Windows 平台上丰富的 COM 接口。这种...