- 浏览: 107482 次
- 性别:
- 来自: 北京
文章分类
最新评论
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 599ServletOutputStream ... -
struts上传下载多个文件
2015-04-30 11:24 479实例: 第一步导入包: commons-fileupload- ... -
jdcob--Could not initialize class com.jacob.com.ComThread
2015-02-27 09:00 18871--dll 文件 放在tomcat/bin 下面 ... -
ntko打印公章
2014-12-02 09:04 541//TANGER_OCX_OBJ.ActiveDocument ... -
hibernate 映射文件生成数据库表脚本
2011-03-28 16:20 846import org.hibernate.cfg.Config ... -
java换肤改变页面肤色
2011-03-02 14:05 972import java.io.IOException;impo ... -
java 过滤未登录的用户
2011-03-02 14:03 1084<filter> <filte ... -
java 在线用户统计
2011-03-02 13:47 1612web.xml <listener> ... -
java 过滤乱码
2011-03-02 13:44 924web.xml <filter> <f ... -
hibernate 查询乱码
2010-10-06 15:12 732在使用HQL进行查询时,如果查询语句中存在中文字符,则会有乱码 ... -
java 多线程代码
2010-09-30 12:44 1471package com.jacob.activeX; imp ... -
过滤未登录的用户
2010-09-15 10:59 867package com.filter; import jav ... -
jacob操作word 解决换页问题
2010-09-13 08:17 3722package audit.pub.word; imp ... -
jacob操作word增加表格 行列
2010-08-10 09:52 2925import com.jacob.activeX.Activ ... -
jsp导出word 带图片
2010-04-12 17:28 33611.将word另存为html格式,然后将html格式的文件另存 ... -
读取blob格式图片上传到服务器目录
2010-04-12 17:21 1965//得到blob格式图片 String fileUrl = ... -
批量导入图片保存成blob格式
2010-03-31 15:15 1664/** * 创建目录 * @param director ... -
org.apache.tools包 解压缩zip 解决中文乱码 ant 版本冲突
2010-03-30 12:50 3009private void createDirectory(St ... -
java 获取文件大小
2010-03-29 14:32 15781import java.io.*; public class ... -
xml的读取分析 key value
2010-03-23 15:20 1566package com.basedata.xml; impo ...
相关推荐
jacob操作word资料
jacob将word转pdf,它是直接调用Microsoft Office 或 WPS组件实现word、excel、PPT转换成PDF。
jacob excel,安装配置,使用jacob进行Excel控制,个测试程序代码.
jacob-1.14.3.jar 包 ,内含有相关资料以及常见错误解决方案 !
本文件夹中的示例程序中JacobWordBeanServiceImpl.java是由XiaoKai参考网上资料,整理而成的一个类,本类提供了Jacob对Word的基本操作的一些方法,包括:文档的打开、保存、关闭、打印等基本操作,同时定义了复制、...
Java操作MicrosoftWord之jacob.pdf
将文字转换为声音源代码 , 代码中含有注释,再Eclipse中直接导入就可以使用,找了许多资料才整理好,东西不多,很有价值。
适用于Java开发中用于处理上传文档转成PDF的文件的形式,其中包含jar包等资料和信息,可直接引用进行操作
很好的资料,请大家下载。
最近因为项目的原因,整理了一下网上关于java对word文档操作的相关资料,资源中的代码绝大部分也是参考网上整理的。希望能对有java操作word这方面的需求的朋友一点参考和帮助。
描述 C# 的 解析 visio的过程。 和 java jacob 解析visio的思路。 关于visio 解析xml 的资料很少。 本文来自百度文库!
储存库JACOB(Java-COM桥) Source在上在Sourceforge上托管了十多年讨论论坛仍在源的根存储库不在文献资料您可以在文件夹中找到其他信息有关创建详细说明。用法将适合您平台的DLL放入运行时库路径。 用于32位窗口的...
jacob.jar: a JAR file for the java classes which you must add to your CLASSPATH. The package names replace com.ms with com.jacob (for example com.ms.com.Variant maps to com.jacob.com.Variant. ...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
最近做了一个java发送传真程序,在网上搜了半天,没找到相关资料,最后找到了java api的一些资料,才解决了这个问题
社交媒体映射工具,可通过Jacob Wilkin( )的面部识别来关联个人资料。 Social Mapper是一个开放源代码情报工具,它使用面部识别来大规模关联跨不同站点的社交媒体配置文件。 它采用一种自动方法在流行的社交媒体...
针对松散含水层求参的问题,自行设计建设野外试验场并以抽水试验资料为依据,利用Hantush-Jacob直线图解法,Theis配线法,Dupuit单孔求参法和Dupuit多孔求参法分别计算了含水层的渗透系数和给水度,通过计算均方根RMSE的...
5G峰会演讲Slide 5G通讯技资料通信调研报告系统技术标准与进展关于趋势探讨资料合集: 4G5G频段介绍.pdf 5G-SDIO口的WIFI模块在开启会议系统的新时代.pdf 5G-无线通信网络蜂窝结构体系和关键技术.pdf 5Gsps高速数据...
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:jacobs_json_doc-0.11.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Jeopardy团队的ECE183D和MAE162D顶板课程最终项目的小组资料库,分别由加利福尼亚大学洛杉矶分校的Ankur Mehta教授和Jacob Rosen教授领导。 欧洲经委会成员: 法鲁克·阿赫塔尔(Farooq Akhtar) 加藤ato人 马修·...