- 浏览: 277991 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
typ0520:
推荐一个socket编程的异步socket类库,https:/ ...
java之Scoket 客户端和服务器的发送与接收 -
GGGGeek:
处理excel的时候,列太多,已经把pdf设置横向,依然不行, ...
jacob操作office分享 -
men4661273:
小白马 写道能不能发一下源代码啊https://git.osc ...
android自定义popupwindow仿微信 -
贝塔ZQ:
不错不错,总结的挺好的。插件实现也是不错的,PageOffi ...
jacob操作office分享 -
小白马:
能不能发一下源代码啊
android自定义popupwindow仿微信
现在的项目中操作word文件比较多,word文件的加密解密,转换为各种格式,插入图片,添加水印、html转word等等各种东西,大家也都知道,java语言是不能直接操作word或者excel的,不像C#,可以调用VBA的类来直接操作office。
目前java也有一些操作office的开源框架,比如poi,这个没怎么研究过,我估摸着它是通过解析office的xml文档模型来操作office的,因为office03和office07以及以上的文档模型结构不太一样,导致了poi处理不同版本office时要用不同的类,我用的最多的是jacob,它对office03和office07的操作基本一致,高版本的还没有试过,通过最近一段时间的使用,给大家分享一下我的心得。
简介:
jacob(java com bridge,java com桥)分为两个部分,jacob.jar,jacob.dll,使用时两个东西的版本要一致,而且还分32位和64位,它的位数和jdk的位数有关,与操作系统的位数无关。它的原理是通过java的jni功能,调用系统组件dll,通过这个com桥来操作com组件(windows的一种软件编程技术吧),最终完成对office文档的操作。
环境配置:
1、在工程中引入jar包
2、将dll文件放在jdk的path目录下面,通过System.getProperty("java.library.path");可以看到path路径,或者直接放到jdk/bin、jre/bin、system32/system64下面都放一份,总能找得到,版本要急着对应好。
3、附件为我使用的组件,好像是1.14版本,配合32位jdk使用。
常用类以及方法
ComThread:com组件管理,用来初始化com线程,释放线程,所以会在操作office之前使用,操作完成再使用。
ActiveXComponent:创建office的一个应用,比如你操作的是word还是excel
Dispatch:调度处理类,封装了一些操作来操作office,里面所有的可操作对象基本都是这种类型,所以jacob是一种链式操作模式,就像StringBuilder对象,调用append()方法之后返回的还是StringBuilder对象
Variant:封装参数数据类型,因为操作office是的一些方法参数,可能是字符串类型,可能是数字类型,虽然都是1,但是不能通过,可以通过Variant来进行转换通用的参数类型,new Variant(1),new Variant("1"),
Dispatch的几种静态方法:这些方法就是要用来操作office的。
•call( )方法:调用COM对象的方法,返回Variant类型值。
•invoke( )方法:和call方法作用相同,但是不返回值。
•get( )方法:获取COM对象属性,返回variant类型值。
•put( )方法:设置COM对象属性。
以上方法中有的有很多重载方法,调用不同的方法时需要放置不同的参数,至于哪些参数代表什么意思,具体放什么值,就需要参考vba代码了,仅靠jacob是无法进行变成的。
Variant对象的toDispatch()方法:将以上方法返回的Variant类型转换为Dispatch,进行下一次链式操作。
结合vba来进行一些操作的解读(以word为例,excel基本上差不多)
jacob操作office网上也有很多教程,比如打开文档,保存,插入图片之类的,看了那些,也只能会这几种操作,jacob文档中也不会有那种操作参数是什么,现在我结合vba代码分享一下我的理解,有什么新的操作就可以自己来完成。
1、初始化com线程
使用jacob之前使用下面的语句来初始化com线程,大概意思是打开冰箱门,准备放大象。。。
使用完成后使用下面的语句来关闭现场,大概意思是关上冰箱门。。。
2、创建应用程序对象,设置参数,得到文档集合
操作一个文档之前,我们必须要创建一个应用对应,比如是word还是excel,设置一些文档应用的参数,得到文档集合对象,(大家应该知道word是Documents,excel是WorkBooks)
这个操作就是模仿vba的写法,Application.Visible = False;vba代码中的对application的设置这里都可以用
C#的写法:new Microsoft.Office.Interop.Word.Application().Visible = false; 意思差不多
获得文档集合,用来操作我们需要处理的文档,
vba写法Application.Documents,C#的写法:new Microsoft.Office.Interop.Word.Application().Documents
可以看出来基本相似,如果对c#比较熟悉的话,可以直接从c#中翻译过来,不熟悉的话可以直接网上查vba代码,进行翻译。
3、打开文档
有了文档对象集合,我们就可以来操作文档了,链式操作就此开始:
call方法,调用open方法,传递一个参数,返回一个我们的word文档对象,
同样从vba代码翻译过来,很多vba代码我们可以在word文档中自己找到,
从vba代码中可以看到documents的open方法打开了一个文档,第一个参数就是文档的路径,后面的参数大家可以自己去研究,参数多的有多参数的方法,还有数据参数的方法,都可以用来调用。
现在打开了一个文档,我们可以进行操作了。
4、操作文档,每页插入一个图片,并调整大小和位置
我录制一个宏插入图片,翻到下一页,再插入一个图片,查看vba代码如下:
其中里面的Selection代表当前光标位置或者所选范围,官方解释如下:
该对象代表窗口或窗格中的当前所选内容。所选内容代表文档中被选定(或突出显示的)的区域,若文档中没有所选内容,则代表插入点。每个文档窗格只能有一个活动的 Selection对象,并且整个应用程序中只能有一个活动的 Selection对象。
翻译为java代码为:
从上面的代码可以看出,每一行代码获取一个对象,相应于vba的用“.”点出来的一个对象,大概意思就是得到选中位置,得到图形范围,插入图片,选中图片,设置宽高,设置相对当前页的左边距,上边距,然后将Application.Browser.Next翻译为最后两行代码,翻到下一页,继续插入图片进行处理。
这里是固定的页码,如果我们不知道文档的页码呢,请看下一个案例。
5、得到word文档的页码:
网上找到一段获取文档页数的VBA代码Selection.Information(wdNumberOfPagesInDocument),按照我们的理解,翻译为java代码为:
调用selection的Information方法,传入一个参数可以看到,参数中我写的是4,哪里来的呢?
vba中的wdNumberOfPagesInDocument,我们不知道是什么,肯定是一个常量,都说在msdn上能找到,我是找不到,我有个办法,
打开我们word中的vba编辑器,吧vba代码贴到我们录制的宏的第一行,左边添加一个端点,运行一下,
这样就可以看到常量值了,是4,写上就行可,可以得到页码的结果,另外还有一种获得页数的方法:
ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
比葫芦画瓢,翻译为java代码为
通过wordApp获取ActiveDocument对象,调用它的BuiltInDocumentProperties方法,传入一个参数wdPropertyPages的值是14,而上面的还有另外一种写法,官方解释说以下两行代码意思一样,所以还可以翻译为另一种写法
BuiltinDocumentProperties.Item(1)
BuiltinDocumentProperties(1)
先获取BuiltinDocumentProperties对象,再调用Item方法
6、保存文档
doc是我们打开的文档的对象
7、退出wordapplication
参数有很多个,我们一个都不传,执行完后winword进程关闭
8、释放com线程
结束
以上是两个小案例还分享一下我个人的心得,个人感觉jacob还是很好用的,只不过有时候有的对象不知道怎么获取,只能一点一点的尝试,比如selection,activeDocument,录制宏也看不到是怎么来的,最终发现都是wordapplication来的,所以宏里面开始的东西如果找不到都可以从application里面去找的。
欢迎大家共同研究,如有不正确的地方欢迎指正。
目前java也有一些操作office的开源框架,比如poi,这个没怎么研究过,我估摸着它是通过解析office的xml文档模型来操作office的,因为office03和office07以及以上的文档模型结构不太一样,导致了poi处理不同版本office时要用不同的类,我用的最多的是jacob,它对office03和office07的操作基本一致,高版本的还没有试过,通过最近一段时间的使用,给大家分享一下我的心得。
简介:
jacob(java com bridge,java com桥)分为两个部分,jacob.jar,jacob.dll,使用时两个东西的版本要一致,而且还分32位和64位,它的位数和jdk的位数有关,与操作系统的位数无关。它的原理是通过java的jni功能,调用系统组件dll,通过这个com桥来操作com组件(windows的一种软件编程技术吧),最终完成对office文档的操作。
环境配置:
1、在工程中引入jar包
2、将dll文件放在jdk的path目录下面,通过System.getProperty("java.library.path");可以看到path路径,或者直接放到jdk/bin、jre/bin、system32/system64下面都放一份,总能找得到,版本要急着对应好。
3、附件为我使用的组件,好像是1.14版本,配合32位jdk使用。
常用类以及方法
ComThread:com组件管理,用来初始化com线程,释放线程,所以会在操作office之前使用,操作完成再使用。
ActiveXComponent:创建office的一个应用,比如你操作的是word还是excel
Dispatch:调度处理类,封装了一些操作来操作office,里面所有的可操作对象基本都是这种类型,所以jacob是一种链式操作模式,就像StringBuilder对象,调用append()方法之后返回的还是StringBuilder对象
Variant:封装参数数据类型,因为操作office是的一些方法参数,可能是字符串类型,可能是数字类型,虽然都是1,但是不能通过,可以通过Variant来进行转换通用的参数类型,new Variant(1),new Variant("1"),
Dispatch的几种静态方法:这些方法就是要用来操作office的。
•call( )方法:调用COM对象的方法,返回Variant类型值。
•invoke( )方法:和call方法作用相同,但是不返回值。
•get( )方法:获取COM对象属性,返回variant类型值。
•put( )方法:设置COM对象属性。
以上方法中有的有很多重载方法,调用不同的方法时需要放置不同的参数,至于哪些参数代表什么意思,具体放什么值,就需要参考vba代码了,仅靠jacob是无法进行变成的。
Variant对象的toDispatch()方法:将以上方法返回的Variant类型转换为Dispatch,进行下一次链式操作。
结合vba来进行一些操作的解读(以word为例,excel基本上差不多)
jacob操作office网上也有很多教程,比如打开文档,保存,插入图片之类的,看了那些,也只能会这几种操作,jacob文档中也不会有那种操作参数是什么,现在我结合vba代码分享一下我的理解,有什么新的操作就可以自己来完成。
1、初始化com线程
使用jacob之前使用下面的语句来初始化com线程,大概意思是打开冰箱门,准备放大象。。。
ComThread.InitSTA();
使用完成后使用下面的语句来关闭现场,大概意思是关上冰箱门。。。
ComThread.Release();
2、创建应用程序对象,设置参数,得到文档集合
操作一个文档之前,我们必须要创建一个应用对应,比如是word还是excel,设置一些文档应用的参数,得到文档集合对象,(大家应该知道word是Documents,excel是WorkBooks)
ActiveXComponent wordApp = new ActiveXComponent("Word.Application");//word ActiveXComponent wordApp = new ActiveXComponent("Excel.Application");//excel wordApp.setProperty("Visible", new Variant(false));//设置应用操作是文档不在明面上显示,只在后台静默处理。
这个操作就是模仿vba的写法,Application.Visible = False;vba代码中的对application的设置这里都可以用
C#的写法:new Microsoft.Office.Interop.Word.Application().Visible = false; 意思差不多
获得文档集合,用来操作我们需要处理的文档,
Dispatch document = wordApp.getProperty("Documents").toDispatch();
vba写法Application.Documents,C#的写法:new Microsoft.Office.Interop.Word.Application().Documents
可以看出来基本相似,如果对c#比较熟悉的话,可以直接从c#中翻译过来,不熟悉的话可以直接网上查vba代码,进行翻译。
3、打开文档
有了文档对象集合,我们就可以来操作文档了,链式操作就此开始:
call方法,调用open方法,传递一个参数,返回一个我们的word文档对象,
Dispatch doc = Dispatch.call(document, "Open",new Variant("D:\\my.doc")).toDispatch();
同样从vba代码翻译过来,很多vba代码我们可以在word文档中自己找到,
从vba代码中可以看到documents的open方法打开了一个文档,第一个参数就是文档的路径,后面的参数大家可以自己去研究,参数多的有多参数的方法,还有数据参数的方法,都可以用来调用。
现在打开了一个文档,我们可以进行操作了。
4、操作文档,每页插入一个图片,并调整大小和位置
我录制一个宏插入图片,翻到下一页,再插入一个图片,查看vba代码如下:
其中里面的Selection代表当前光标位置或者所选范围,官方解释如下:
该对象代表窗口或窗格中的当前所选内容。所选内容代表文档中被选定(或突出显示的)的区域,若文档中没有所选内容,则代表插入点。每个文档窗格只能有一个活动的 Selection对象,并且整个应用程序中只能有一个活动的 Selection对象。
翻译为java代码为:
for(int i = 0; i < 2;i++){ Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch(); Dispatch inLineShapes = Dispatch.get(selection, "InLineShapes").toDispatch(); Dispatch picture = Dispatch.call(inLineShapes, "AddPicture", imgPath).toDispatch(); //选中图片 Dispatch.call(picture, "Select"); //设置宽度高度 Dispatch.put(picture, "Width", new Variant(10)); Dispatch.put(picture, "Height", new Variant(10)); //设置图片相对左上角偏移位置 selection = Dispatch.get(wordApp, "Selection").toDispatch(); Dispatch shapeRange = Dispatch.get(selection, "ShapeRange").toDispatch(); Dispatch.put(shapeRange, "Left", new Variant(left)); Dispatch.put(shapeRange, "Top", new Variant(top)); //翻到下一页 Dispatch browser = Dispatch.get(wordApp, "Browser").toDispatch(); Dispatch.call(browser, "Next"); }
从上面的代码可以看出,每一行代码获取一个对象,相应于vba的用“.”点出来的一个对象,大概意思就是得到选中位置,得到图形范围,插入图片,选中图片,设置宽高,设置相对当前页的左边距,上边距,然后将Application.Browser.Next翻译为最后两行代码,翻到下一页,继续插入图片进行处理。
这里是固定的页码,如果我们不知道文档的页码呢,请看下一个案例。
5、得到word文档的页码:
网上找到一段获取文档页数的VBA代码Selection.Information(wdNumberOfPagesInDocument),按照我们的理解,翻译为java代码为:
Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch(); //如果调用方法或者属性要得到某个值的话,直接tostring或者别的就可以了 pages = Dispatch.call(selection, "Information",new Variant(4)).toString();
调用selection的Information方法,传入一个参数可以看到,参数中我写的是4,哪里来的呢?
vba中的wdNumberOfPagesInDocument,我们不知道是什么,肯定是一个常量,都说在msdn上能找到,我是找不到,我有个办法,
打开我们word中的vba编辑器,吧vba代码贴到我们录制的宏的第一行,左边添加一个端点,运行一下,
这样就可以看到常量值了,是4,写上就行可,可以得到页码的结果,另外还有一种获得页数的方法:
ActiveDocument.BuiltInDocumentProperties(wdPropertyPages)
比葫芦画瓢,翻译为java代码为
Dispatch activeDocument = Dispatch.get(wordApp, "ActiveDocument").toDispatch(); pages = Dispatch.call(activeDocument, "BuiltInDocumentProperties",new Variant(14)).toString();
通过wordApp获取ActiveDocument对象,调用它的BuiltInDocumentProperties方法,传入一个参数wdPropertyPages的值是14,而上面的还有另外一种写法,官方解释说以下两行代码意思一样,所以还可以翻译为另一种写法
BuiltinDocumentProperties.Item(1)
BuiltinDocumentProperties(1)
先获取BuiltinDocumentProperties对象,再调用Item方法
Dispatch activeDocument = Dispatch.get(wordApp, "ActiveDocument").toDispatch(); Dispatch builtInDocumentProperties = Dispatch.get(activeDocument, "BuiltInDocumentProperties").toDispatch(); pages = Dispatch.call(builtInDocumentProperties, "Item",new Variant(14)).toString();
6、保存文档
Dispatch.call(doc, "Save");
doc是我们打开的文档的对象
7、退出wordapplication
参数有很多个,我们一个都不传,执行完后winword进程关闭
wordApp.invoke("Quit", new Variant[] {});
8、释放com线程
ComThread.Release();
结束
以上是两个小案例还分享一下我个人的心得,个人感觉jacob还是很好用的,只不过有时候有的对象不知道怎么获取,只能一点一点的尝试,比如selection,activeDocument,录制宏也看不到是怎么来的,最终发现都是wordapplication来的,所以宏里面开始的东西如果找不到都可以从application里面去找的。
欢迎大家共同研究,如有不正确的地方欢迎指正。
评论
2 楼
GGGGeek
2017-05-02
处理excel的时候,列太多,已经把pdf设置横向,依然不行,导致跨页,如何自定义pdf长宽
1 楼
贝塔ZQ
2016-09-20
不错不错,总结的挺好的。插件实现也是不错的,PageOffice插件就是专门操作office文档的,也是很方便的
发表评论
-
一致性hash的Java实现
2018-04-07 11:57 1358关于一致性hash的讲解有很多,也不难理解,具体可以翻看其他 ... -
java.util.Timer源代码解读
2018-04-03 21:26 1530相关类: Timer : 创建定时任务调度的主类 ... -
jdbc的ResultSet结果集,数字类型的null取出后为0
2017-03-06 19:14 7393数据库里面的int,decimal等类型的字段值为null, ... -
Java中Thread的Interrupt与终止线程
2017-03-05 18:14 3762有时候我们会需要将正在执行的线程进行打断,可能我们会想到使 ... -
java中的Thread类的join
2017-03-05 16:43 2374join是Thread的实例方法,官方解释为:等待该线程终 ... -
Java的Thread,Runnable、Callable、Future、FutureTask、Executors,ExecutorService
2017-03-05 09:53 1339定义解释 Runnable ... -
springMVC响应json结果生成is开头的属性
2017-02-14 16:45 1137本来在开发中尽量不用以is开头的变量名的,但是因为开发中用 ... -
springMVC源码解读总结
2017-02-13 20:05 799HandlerMapping负责管理Web请求到具体的处 ... -
跳出多重for循环
2017-02-10 13:29 13111、变量标记形式,循环层级太多比较麻烦。 boolean ... -
Calender不是单例
2014-11-19 08:39 1904在我们使用Calender的时候,使用过 ... -
java中的值传递,引用传递
2014-11-19 08:14 1540无意中看到一个问题,java是值传递还是引 ... -
java设计模式-单例模式
2014-11-17 22:00 960单例模式1,饿汉模式 //饿汉式单例类 ... -
java多线程编程记录(一)
2012-08-22 11:15 1309参考:http://hi.baidu.com/xiaolinc ... -
java之Scoket 客户端和服务器的发送与接收
2012-08-21 15:05 40239什么是socket 所谓socket通常也称 ... -
java设计模式- Factory Method(工厂方法)模式
2012-08-20 14:24 2006Factory Method定义 ... -
java设计模式- abstract Factory (抽象工厂)模式
2012-08-20 11:32 4670Abstract Factory定义 为一系列相 ... -
java设计模式-Adapter(适配器)模式
2012-08-20 09:33 1269参考:http://www.java3z.com/cw ... -
java设计模式-Visitor(访问者)模式
2012-08-17 15:46 1888visitor定义 作用于某个对象群中各 ... -
java设计模式-Mediator(中介者)模式
2012-08-17 12:44 7209Mediator中介者模式定义 Mediator ... -
java设计模式-Template Method(模板方法)模式
2012-08-17 09:33 1147模板是指在薄片塑料板上面写字后挖空,再使用毛笔或 ...
相关推荐
"jacob1.7操作OFFICE转PDF"这个主题涉及到一个名为JACOB (Java COM Bridge) 的Java库,它允许Java应用程序与COM组件进行交互。在这个场景下,JACOB被用来调用Microsoft Office的COM接口来实现Office文档向PDF的转换...
标题中的“jacob操作实例+lib”指的是使用Jacob库在Java中进行Microsoft Office文档操作的实践案例和相关库文件。Jacob(Java and .NET Bridge)是一个开源Java库,它允许Java应用程序调用.NET组件,包括对Microsoft...
4. **文件操作**:通过`Dispatch`对象,可以访问和操作Office文档的各种属性和方法,进行读写、格式转换等操作。 5. **释放资源**:完成操作后,记得正确关闭并释放所有使用的COM对象,以避免资源泄漏。 **注意...
在Windows操作系统下,如果你已经安装了Microsoft Office,可以借助Java的一个开源库——Jacob来实现这个功能。本文将详细介绍如何使用Jacob 1.19库将Word文件转换为PDF。 Jacob(Java COM Bridge)是一个Java语言...
例如,你可以使用Jacob来自动化Office文档的生成、修改或分析,也可以与数据库、打印机驱动等进行交互。 安装和使用64位Jacob库时,需要注意以下几点: 1. 确保你的Java环境是64位的,因为32位Java环境无法加载64位...
Jacob是一个Java和COM(Component Object Model)之间桥接的库,允许Java程序通过COM接口与Microsoft Office应用程序交互,例如Word、Excel和PowerPoint。 Jacob库的主要功能是提供对Word的全面控制,这包括但不...
- 使用Jacob进行跨线程操作时,需要额外注意线程安全问题,避免数据竞争和死锁。 - 在释放COM对象时,务必正确处理,以防止内存泄漏。 6. 相关学习资源: 对于初学者,可以通过阅读Jacob的官方文档、在线教程...
通过Jacob,开发者可以在Java程序中调用任何支持COM接口的应用程序,例如Microsoft Office套件,进行文档操作。它通过JNI(Java Native Interface)来实现这一目标,使得Java代码可以调用C++编写的COM组件。 在Word...
在代码层面,你可以创建一个Jacob的ActiveX Invoker,然后通过它来操作Word对象。以下是一个简单的示例,展示了如何使用Jacob生成一个新的Word文档并写入内容: ```java import com.jacob.activeX.ActiveXComponent...
这个包在Windows环境下特别有用,因为它利用了COM自动化接口来操作Office应用程序。以下是对Jacob包及其在Word合并功能中的应用的详细解释。 1. **Jacob简介** Jacob全称为"Java COM Bridge",是一个开源Java库,...
由于Microsoft Office本身支持脚本语言操作,因此通过Jacob,我们可以借助Java代码控制Office软件,从而完成文件格式的转换。 在实际使用Jacob_1.15时,你需要先在你的开发环境中配置好Jacob库,包括添加相应的jar...
本示例主要涉及的是将Excel电子表格转换为PDF文档,这是一个实用的操作,能够方便地分享、打印或保存内容,而不用担心编辑问题。"jacob的excel转pdf"项目提供了一种解决方案,它可能利用了Java的Jacob库来实现这个...
文件列表中的"code"可能是指博主分享的一些示例代码或者插件项目的源码,读者可以通过下载并研究这些代码来更好地理解和应用Java插件技术。 总的来说,这篇博客可能会涵盖以下几个方面: 1. **Java插件基本概念**...
在本文档的描述中,虽然没有具体的细节,但我们可以推断作者可能分享了一个博客文章,链接是,该文章详细介绍了如何使用Jacob库来实现这个功能。通常,这样的过程会包括以下步骤: 1. **引入Jacob库**:首先,你...
这些文件是Jacob(Java COM Bridge)的一部分,Jacob是一个开源项目,它的主要功能是提供一个Java到COM的桥接,使得开发者可以在Java程序中无缝地使用Microsoft Office(如Word、Excel)和其他支持COM接口的应用程序...
虽然描述中没有提供具体细节,但我们可以推测博主可能分享了关于如何设置和配置Jawin与Jacob,以及如何利用它们创建、读取、修改或导出Word文档的步骤和示例代码。 标签“源码”暗示了博客内容可能包括了一些实际的...
在Java中,由于没有内置的方式来直接操作Word文档,因此Jacob这样的库成为了一个重要的工具。 在"WordUtil.java"这个文件中,可能包含了使用Jacob进行文件转换的核心代码。这个类可能会有方法如`convertToHtml`,它...
通过jacob,开发者可以在Java程序中直接操作Office应用程序,包括创建、编辑和转换文档。例如,你可以使用jacob来自动化批量转换大量Word、Excel或PowerPoint文档为PDF。这种方法适用于需要编程解决方案或者大量转换...