`
dingqijie
  • 浏览: 102238 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
   最近因为项目需要,特地研究了两天jacob--操作office的一个java插件,因时间缘故,只研究了操作word,特此共享:
    本人喜欢通过代码学习东西,所以,直接讲操作的代码拷贝出来,供大家分享。
   
public static void main(String args[]) {
ComThread.InitSTA();// 初始化com的线程,非常重要!!使用结束后要调用 realease方法
/**
完成初始化工作
*/
ActiveXComponent objWord = new ActiveXComponent("Word.Application");// Instantiate objWord and Declare word object
Dispatch wordObject = (Dispatch) objWord.getObject();// Assign a local word object
Dispatch.put((Dispatch) wordObject, "Visible", new Variant(true));// Variant(true)表示word应用程序可见
Dispatch documents = objWord.getProperty("Documents").toDispatch(); // documents表示word的所有文档窗口,(word是多文档应用程序)
Dispatch document = Dispatch.call(documents, "Add").toDispatch(); // 使用Add命令创建一个新文档,用Open命令可以打开一个现有文档

/**
*开始写word的工作,包括标题,正文(段落一、段落二)
*/
Dispatch wordContent = Dispatch.get(document, "Content").toDispatch(); // 取得word文件的内容
Dispatch selection = Dispatch.get(wordObject, "Selection").toDispatch();
Dispatch paragraphFormat=Dispatch.get(selection,"ParagraphFormat").getDispatch();
Dispatch font = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象
Dispatch.put(paragraphFormat, "Alignment", "1"); // 设置标题的对齐方式(1:置中 2:靠右 3:靠左)
Dispatch.put(font, "Bold", "1"); // 字型租体
Dispatch.put(font, "Color", "1,0,0,0"); // 字型颜色(1,0,0,0=>红色  1,1,0,0=>棕色)
Dispatch.put(font, "Italic", "1"); //字型斜体
Dispatch.call(selection, "TypeText", "标题"); // 写入标题内容
Dispatch.call(selection, "TypeParagraph"); // 空一行段落
Dispatch.put(paragraphFormat, "Alignment", "3"); // 设置正文的对齐方式(1:置中 2:靠右 3:靠左)
Dispatch.put(selection, "Text", "  段落one");
Dispatch.call(selection,"MoveRight");
Dispatch.call(selection, "TypeParagraph"); // 空一行段落
Dispatch.put(selection, "Text", "  段落two");
Dispatch.call(selection,"MoveRight");
/**
* 写一个新的table
*/
Dispatch tables = Dispatch.get(wordContent, "Tables").toDispatch();
        Dispatch tablerange = Dispatch.get(selection, "Range").toDispatch();
        Dispatch newTable = Dispatch.call(tables, "Add", tablerange,
                new Variant(2), new Variant(3)).toDispatch();
       
        /**
         * 往表格中填写内容。
         */
        Dispatch newtables = Dispatch.get(wordContent, "Tables").toDispatch();
        Dispatch table = Dispatch.call(newtables, "Item", new Variant(1)).toDispatch(); // 要填充的表格         
        Dispatch cols = Dispatch.get(table, "Columns").toDispatch(); // 表格的所有行
        Dispatch rows = Dispatch.get(table, "Rows").toDispatch(); // 表格的所有列
        int colsCount=Dispatch.get(cols, "Count").toInt();
        int rowsCount=Dispatch.get(rows,"Count").toInt();
        Dispatch col = Dispatch.get(cols, "First").toDispatch();
        for(int i=1;i<=rowsCount;i++)
        {
        for(int m=1;m<=colsCount;m++)
        {
        Dispatch cell=Dispatch.call(table,"Cell",new Variant(i),new Variant(m)).getDispatch();
        Dispatch.call(cell, "Select");
        Dispatch.put(selection, "Text",i*m );
        Dispatch.call(selection,"MoveRight");
        }
        }
        Dispatch.call(selection, "EndKey",6);

/**
* 开始读word的工作
*/
Dispatch paragraphs = Dispatch.get(wordContent, "Paragraphs").toDispatch(); // 所有段落
int paragraphCount = Dispatch.get(paragraphs, "Count").toInt(); // 一共的段落数
for(int i =1;i<=paragraphCount;i++)
{
Dispatch paragraph = Dispatch.call(paragraphs, "Item", new Variant(i)).toDispatch();
Dispatch range = Dispatch.call(paragraph,"Range").toDispatch();
String ptext = Dispatch.get(range, "text").getString();
System.out.println(ptext);
}
/**
*加入图片
*/
String picturePath="E:\\照片\\苏歆然\\2009-01-08-00.bmp";//图片的路径
Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),
                "AddPicture", picturePath);
/**
* 关闭文档
*/
Dispatch.call(document, "SaveAs", new Variant("d://abc1.doc")); // 保存一个新文档
ComThread.Release();//释放com线程。根据jacob的帮助文档,com的线程回收不由java的垃圾回收器处理
}     

       生成的word 的格式如下:              
               


     补充:jacob操作powerpoint
     ActiveXComponent ppt = new ActiveXComponent("PowerPoint.Application");

Dispatch pptObject=ppt.getObject();

Dispatch.put((Dispatch) pptObject, "Visible", new Variant(true));

// 设置程序界面是否可见

ActiveXComponent presentations = ppt.getPropertyAsComponent("Presentations");

// 生成一个新的ppt 对象

ActiveXComponent presentation =presentations.invokeGetComponent("Add", new Variant(1));
Dispatch windows = presentation.getProperty("Windows").toDispatch();
Dispatch window = Dispatch.call(windows, "Item", new Variant(1)).toDispatch();
Dispatch selection = Dispatch.get(window, "Selection").toDispatch();

ActiveXComponent slides = presentation.getPropertyAsComponent("Slides");

//添加第一张幻灯片;
slides.invoke("Add", new Variant(1), new Variant(1));


Dispatch slideRange=Dispatch.get(selection, "SlideRange").getDispatch();
Dispatch shapes=Dispatch.get(slideRange, "Shapes").getDispatch();
Dispatch shape1 = Dispatch.call(shapes, "Item", new Variant(2)).toDispatch();

Dispatch.call(shape1, "Select");

Dispatch shapeRange=Dispatch.get(selection, "ShapeRange").getDispatch();
Dispatch textFrame=Dispatch.get(shapeRange, "TextFrame").getDispatch();
Dispatch textRange=Dispatch.get(textFrame, "TextRange").getDispatch();
Dispatch.call(textRange, "Select");
Dispatch.put(textRange,"Text","测试");
//添加第二张幻灯片;
slides.invoke("Add", new Variant(2), new Variant(1));
// powerpoint幻灯展示设置对象
ActiveXComponent setting = presentation.getPropertyAsComponent("SlideShowSettings");
setting.invoke("Run");

//保存ppt
presentation.invoke("SaveAs", new Variant(PPT_FILE));
// 释放控制线程
ComThread.Release();

  • 大小: 19.4 KB
分享到:
评论
18 楼 sks8058 2018-05-29  
博主你好,请问怎么获取文本框的宽高和位置?谢谢
17 楼 lt26w 2014-07-01  
楼主,请教有没有办法高亮字体啊?
16 楼 cbxvsli 2011-09-22  
楼主,请教个问题:
   jacob如何将很多附件word中的内容copy到一个word中,不知道如何实现。用流的话附件中的table和image都没有了,只能copy文本,你是怎么处理copy问题的?
15 楼 zhangyongfeng 2010-07-12  
非常感谢楼主
14 楼 lyd967 2009-12-17  
楼主您好,,,,不知道您知不知道要在EXCEL中插入图片要怎么写呀。。。如有任何见教麻烦发邮件给我lytlyd@163.com
13 楼 逆风的香1314 2009-10-26  
请问如何利用Jacob生成word时自动添加页码呢?
格式如:
1/3
2/3
3/3

如有见教,请发邮件:wangxiaojs@gmai.co中 多谢
12 楼 dingqijie 2009-05-31  
我感觉你应该是jacob.dll配置问题,你可以测试下面三种方式:
一、将jacob.dll拷贝到windows/system32下
二、如果通过上述配置还不能正确运用该包,则将jacob.dll放入 Java\jdk\jre\bin目录下,
三、如果不行,将jacob.dll放到Java\jdk\jre\lib\ext目录下
jre在运行中要调用操作系统中的word库来执行相应的word命令。所以需要jacob.dll,不过有一些系统的补丁已经包含了这功能,所以我的系统运行就不需要这么配置。
11 楼 liyanhui 2009-05-31  
把你给我的内容粘贴过去,经过eclipse错误提示改成下面的样子:
                for(int i=1;i<=rowsCount;i++) 
                { 
                for(int m=1;m<=colsCount;m++) 
                { 
                Dispatch cell=(Dispatch) Dispatch.call(table,"Cell",new Variant(i),new Variant(m)).getDispatch(); //获得表格的操作句柄 
                Dispatch.call(cell, "Select"); //获得selection操作句柄 
               [color=red] Dispatch.put(selection, i*m,"Text" ); [/color]//对表格内容进行插入; 
                Dispatch.call(selection,"MoveRight"); //将光标右移; 
                } 
                } 
                [color=red]Dispatch.call(selection, "EndKey"); [/color]//调用endkey功能键。即将光标移到文档最后。

我在网上查了一下怕版本不稳定,我改用的是jacobBin_17和
jdk1.5,并把jacobBin_18的dll文件拷到system32下面
还是报
java.lang.UnsatisfiedLinkError: createInstance
	at com.jacob.com.Dispatch.createInstance(Native Method)
	at com.jacob.com.Dispatch.<init>(Dispatch.java)
	at com.jacob.activeX.ActiveXComponent.<init>(ActiveXComponent.java)
	at com.JacobToWordTest.main(JacobToWordTest.java:20)
Exception in thread "main" 

版本不支持 ,实在想不明白??????????
10 楼 liyanhui 2009-05-31  
[img][/img]我怀疑我是的jdk或jacob的版本不对,我应用你上面的内容,可是Dispatch.put()方法里的参数类型却和你给的不一样。如图1.bmp,你给的是:Dispatch.put(selection, "Text", i * m); // 对表格内容进行插入;在我工程里面有错误,提示改为Dispatch.put(selection,i * m, "Text"); // 对表格内容进行插入;
第二个问题是:
Dispatch.call(selection, "EndKey", 6); // 调用endkey功能键。即将光标移到文档最后
在我工程里提示我改为:如图2.jpg
苦恼啊!!!
期待楼主。。。。。
9 楼 dingqijie 2009-05-27  
那个问题不是版本的问题,是你的使用方式不对,
不能够使用Dispatch.put(selection, "7","222");
selection中根本就没有“7”这个属性啊,你怎么可以使用使用put赋值呢?
对表格的操作如下,添加了注释,有什么问题的话可以继续讨论:
for(int i=1;i<=rowsCount;i++)
        {
        for(int m=1;m<=colsCount;m++)
        {
        Dispatch cell=Dispatch.call(table,"Cell",new Variant(i),new Variant(m)).getDispatch(); //获得表格的操作句柄
        Dispatch.call(cell, "Select"); //获得selection操作句柄
        Dispatch.put(selection, "Text",i*m ); //对表格内容进行插入;
        Dispatch.call(selection,"MoveRight"); //将光标右移;
        }
        }
        Dispatch.call(selection, "EndKey",6); //调用endkey功能键。即将光标移到文档最后。
8 楼 liyanhui 2009-05-26  
liyanhui 写道

不知道楼主用的是jacob那个版本啊,我用的是jacob_1.11,但是却报错: com.jacob.com.ComFailException: Can't map name to dispid: 7 at com.jacob.com.Dispatch.invokev(Native Method) at com.jacob.com.Dispatch.invokev(Dispatch.java:886) at com.jacob.com.Dispatch.invoke(Dispatch.java:565) at com.jacob.com.Dispatch.put(Dispatch.java:844) at com.JacobToWordTest.main(JacobToWordTest.java:69) Exception in thread "main" 不能写入数据和图片

                Dispatch newtables = Dispatch.get(wordContent, "Tables").toDispatch(); 
                Dispatch table = Dispatch.call(newtables, "Item", new Variant(1)).toDispatch(); // 要填充的表格          
                Dispatch cols = Dispatch.get(table, "Columns").toDispatch(); // 表格的所有行 
                Dispatch rows = Dispatch.get(table, "Rows").toDispatch(); // 表格的所有列 
                int colsCount=Dispatch.get(cols, "Count").toInt(); 
                int rowsCount=Dispatch.get(rows,"Count").toInt(); 
                Dispatch col = Dispatch.get(cols, "First").toDispatch(); 
                for(int i=1;i<=rowsCount;i++) 
                { 
                	System.out.println("000 = " + i);
                for(int m=1;m<=colsCount;m++) 
                { 
                	System.out.println("1111m = " + m);
                Dispatch cell=Dispatch.call(table,"Cell",new Variant(i),new Variant(m)).getDispatch(); 
                Dispatch.call(cell, "Select"); 
                [color=red]Dispatch.put(selection, "7","222");[/color]

执行到红色的部分报错,所以不能往表格里写入数据
7 楼 liyanhui 2009-05-26  
不知道楼主用的是jacob那个版本啊,我用的是jacob_1.11,但是却报错:
com.jacob.com.ComFailException: Can't map name to dispid: 7
at com.jacob.com.Dispatch.invokev(Native Method)
at com.jacob.com.Dispatch.invokev(Dispatch.java:886)
at com.jacob.com.Dispatch.invoke(Dispatch.java:565)
at com.jacob.com.Dispatch.put(Dispatch.java:844)
at com.JacobToWordTest.main(JacobToWordTest.java:69)
Exception in thread "main"

不能写入数据和图片
6 楼 dingqijie 2009-05-26  
liyanhui 写道

我现在正需要把页面的table内容以表格的方式写入到word中,不知道楼主的东西是否适合,不过先看看 ,支持!!!!

大家相互学习,碰到什么问题可以拿出来一起讨论提高
5 楼 liyanhui 2009-05-26  
我现在正需要把页面的table内容以表格的方式写入到word中,不知道楼主的东西是否适合,不过先看看 ,支持!!!!
4 楼 dingqijie 2009-03-26  
前段时间没来,今天刚看到问题:
Dispatch shapes=Dispatch.get(document, "Shapes").toDispatch();
        Dispatch newTable = Dispatch.call(shapes, "AddTextbox",new Variant(1),new Variant(100),new Variant(100),new Variant(100),new Variant(100)).toDispatch();
这个可以满足你的要求。
3 楼 hb640101297 2009-03-10  
请问楼主我怎么用jacob创建一个文本框呢?很想知道,如果你知道的话请发我的邮箱吧,谢谢


我的邮箱:dave640101297@126.com
2 楼 dingqijie 2009-03-06  
互相交流。。。
1 楼 tataky 2009-03-06  
学习学习 提高提高

相关推荐

    jacob-1.18.zip + jacob-1.19.zip + jacob-1.20.zip 最新版本(包含dll文件)

    1.将jacob-1.18.zip下载解压,在文件夹中找到jacob-1.18-x64.dll,jacob-1.18-x86.dll,jacob.jar 2.通过 pom.xml 新增 &lt;groupId&gt;com.hynnet&lt;/groupId&gt; &lt;artifactId&gt;jacob &lt;version&gt;1.18 3. 如果是32位系统...

    com.jacob.jacob_1.10jar包下载.zip

    《深入理解Java Jacob库:解析com.jacob.jacob_1.10.jar包》 在Java编程中,有时候我们需要与Windows API进行交互,比如自动化办公文档处理、打印任务或者访问硬件设备等。这时,Java Jacob库(Java和COM Bridge)...

    jacob安装包操作office的jacob安装包

    首先,JACOB的核心在于其动态链接库(DLL)文件,包括`jacob-1.14.3-x64.dll`和`jacob-1.14.3-x86.dll`。这两个文件分别对应于64位和32位的操作系统。在安装JACOB时,需要根据你的Java环境和操作系统版本选择正确的...

    jacob1.18,jacob1.19.zip两个版本

    本文将详细解析"jacob1.18"和"jacob1.19"这两个版本的特性、使用方法以及它们在Windows环境下的应用。 首先,我们来看"jacob1.18"版本。此版本是Jacob的一个较早发行版,它包含了一个名为"jacob.jar"的Java类库,这...

    最新版jacob 1.20.jar jacob-1.20-x64.dll jacob-1.20-x86.dll

    这个压缩包包含了Jacob的最新版本,即1.20版,包括两个动态链接库(DLL)文件:`jacob-1.20-x64.dll`和`jacob-1.20-x86.dll`,以及Java类库`jacob-1.20.jar`。这些文件分别用于64位和32位的Windows系统,确保了在...

    jacob1.19(包含jacob-1.19-x64.dll和jacob-1.19-x86.dll)

    这个压缩包"jacob1.19"包含了两个版本的Jacob动态链接库(DLL)文件:jacob-1.19-x64.dll适用于64位系统,而jacob-1.19-x86.dll则适用于32位系统。这两个文件是Jacob库的核心组成部分,它们实现了Java和COM之间的...

    jacob-1.18-x64.dll jacob-1.18-x86.dll jacob.jar

    "jacob-1.18-x64.dll" 和 "jacob-1.18-x86.dll" 是Jacob库的动态链接库文件,分别对应于64位和32位的Windows操作系统。Jacob的核心功能就是通过这些DLL文件来实现Java和COM接口的通信。 "jacob.jar" 是Jacob的Java...

    jacob-1.14.3.jar、jacob-1.14.3-x64.dll

    在本压缩包中,我们有两个关键文件:“jacob-1.14.3.jar”和“jacob-1.14.3-x64.dll”。 `jacob-1.14.3.jar` 是Java版的Jacob库,它是Java到COM桥接器(Java COM Bridge)的实现。Jacob库提供了一个纯Java接口,...

    jacob 1.180 jacob-1.18-x64.dll jacob-1.18-x86.dll

    这个压缩包文件包含了Jacob的版本1.18,提供了两个不同的DLL文件,分别是jacob-1.18-x64.dll和jacob-1.18-x86.dll,分别对应64位和32位的Windows系统。 首先,我们来深入理解Jacob库的核心功能。Jacob全称为Java ...

    jacob.jar及jacob-1.20-x64.dll文件

    **Jacob库介绍** Jacob(Java和COM Bridge)是一个开源Java库,它允许Java应用程序与Microsoft Windows平台上的COM组件进行交互。这个库的核心是通过JNI(Java Native Interface)实现的,使得Java代码能够调用COM...

    jacob-1.19.zip

    Java采用Jacob调用SAPI实现合成语音是一种在Java应用程序中集成语音合成技术的常见方法。Jacob(Java COM Bridge)是一个开源库,它为Java开发者提供了一个桥梁,让他们能够使用Microsoft的COM(Component Object ...

    jacob(包含jacob-1.19-x64.dll和jacob-1.19-x86.dll)

    **Jacob库详解** Jacob(Java-COM Bridge)是一个开源Java库,它允许Java应用程序与Microsoft Windows平台上的COM组件进行交互。这个库的核心是两个动态链接库(DLLs),即`jacob-1.19-x64.dll`和`jacob-1.19-x86....

    jacob1.9 jacob1.12 jacob1.14

    这个压缩包包含了Jacob的三个不同版本:1.9、1.12和1.14,每个版本都有其特定的适用场景和改进。由于不同机器可能对不同版本的Jacob有兼容性需求,所以提供了这三个版本供用户选择。 Jacob的核心功能在于为Java提供...

    JACOB各版本下载

    标题“JACOB各版本下载”表明我们将讨论JACOB的不同版本及其获取途径,而描述则突出了使用JACOB在Java中调用OCX控件的简便性。 JACOB的全称是Java COM Bridge,它通过JNI(Java Native Interface)技术实现了Java和...

    jacob的API,很详细

    **Jacob API 深度解析** Jacob,全称为Java-COM Bridge,是一个开源的Java库,旨在提供一种方式让Java程序能够与COM组件(Component Object Model)进行交互。这个库在Windows平台上尤其有用,因为COM是Microsoft ...

    jacob-1.14.3-x86

    《Jacob库详解:1.14.3-x86版本的使用与原理》 Jacob库,全称为Java COM Bridge,是Java与COM组件之间通信的一个重要桥梁。它为Java开发者提供了一个接口,使得在Java程序中能够调用Windows平台上的COM组件变得可能...

    jacob-1.18-M2(含Jacob.jar包以及Jacob.dll文件 说明文档API等)集合

    这个"jacob-1.18-M2"集合包含了Jacob项目的最新预发布版本,版本号为1.18-M2,它提供了完整的开发资源,包括Jacob.jar包、Jacob.dll文件以及相关的说明文档和API。 Jacob.jar是Jacob的核心库,它是Java类库,包含了...

    jacob-1.16.x.zip位jacob1.16版本集合资源包

    这个资源包"jacob-1.16.x.zip"包含了Jacob的1.16系列不同版本,包括1.16、1.16.1、1.16-M1和1.16-M2,这些是项目的预发布版本和维护更新。 Jacob的核心功能在于提供了一种在Java程序中调用COM对象的方法,通过它的...

    jacob1.18源码和jar包

    JACOB里的总共有两个包: com jacob activeX:JACOB可以通过它调度(Dispatch)activeX 控件 com jacob com:JACOB通过它调用系统DLL (activeX是由微软公司推出的用于Internet的技术 以前曾经被称为OLE 和OCX...

    jacob.jar和jacob.dll(配置说明和代码例子)

    在本文中,我们将深入探讨如何配置jacob.jar和jacob.dll,并通过代码示例了解如何使用Jacob处理Word文档。 首先,配置jacob.jar和jacob.dll是使用Jacob的关键步骤。jacob.jar是Jacob的Java类库,包含了与COM交互的...

Global site tag (gtag.js) - Google Analytics