`
minejava
  • 浏览: 9825 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Jacob学习心得(一)

阅读更多

      最近项目中要实现读写word文件,于是偶就开始在网上和群里查询和询问,终于找到了个叫做Jacob的组件可以搞定这个问题。

第一步,下载Jacob;地址为:http://sourceforge.net/projects/jacob-project/files/jacob-project/

目前最新的版本为jacob-1.15-M4

第二步,部署Jacob;

            a。在Eclipse或Myeclipse中建立一个项目(web或普通的java项目都可):JacobDemo;

            b。将下载好的jacob-1.15-M4.zip解压,将jacob.jar导入新建立的项目中;

            c。将jacob-1.15-M4-x86.dll或jacob-1.15-M4-x64.dll拷贝到C:\WINDOWS\system32,由于我的电脑比较老所以我拷贝的是jacob-1.15-M4-x86.dll。

第三步,在新建立的项目中建立测试类:WordOperate.java,该文件是我在网上拷贝的,特此声明。

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class WordOperate {
 public static void main(String args[]) {
  ActiveXComponent wordApp = new ActiveXComponent("Word.Application"); // 启动word
  // Set the visible property as required.
  Dispatch.put(wordApp, "Visible", new Variant(true));// //设置word可见
  Dispatch docs = wordApp.getProperty("Documents").toDispatch();
  // String inFile = "d:\\test.doc";
  // Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method,
  // new Object[] { inFile, new Variant(false), new Variant(false)},//参数3,false:可写,true:只读
  // new int[1]).toDispatch();//打开文档
  Dispatch document = Dispatch.call(docs, "Add").toDispatch();// create new document

  //String userName = wordApp.getPropertyAsString("Username");// 显示用户信息
  /*String userName = wordApp.getProperty("Username");// 显示用户信息
  System.out.println("用户名:" + userName);*/
  // 文档对齐,字体设置////////////////////////
  Dispatch selection = Dispatch.get(wordApp, "Selection").toDispatch();
  Dispatch align = Dispatch.get(selection, "ParagraphFormat")
    .toDispatch(); // 行列格式化需要的对象
  Dispatch font = Dispatch.get(selection, "Font").toDispatch(); // 字型格式化需要的对象
  // 标题处理////////////////////////
  Dispatch.put(align, "Alignment", "1"); // 1:置中 2:靠右 3:靠左
  Dispatch.put(font, "Bold", "1"); // 字型租体
  Dispatch.put(font, "Color", "1,0,0,0"); // 字型颜色红色
  Dispatch.call(selection, "TypeText", "Word文档处理"); // 写入标题内容
  Dispatch.call(selection, "TypeParagraph"); // 空一行段落
  Dispatch.put(align, "Alignment", "3"); // 1:置中 2:靠右 3:靠左
  Dispatch.put(selection, "Text", "        ");
  Dispatch.call(selection, "MoveDown"); // 光标标往下一行
  //表格处理////////////////////////
  Dispatch tables = Dispatch.get(document, "Tables").toDispatch();
  Dispatch range = Dispatch.get(selection, "Range").toDispatch();
  Dispatch table1 = Dispatch.call(tables, "Add", range, new Variant(3),
    new Variant(2), new Variant(1)).toDispatch(); // 设置行数,列数,表格外框宽度
  // 所有表格
  Variant tableAmount = Dispatch.get(tables, "count");
  System.out.println(tableAmount);
  // 要填充的表格
  Dispatch t1 = Dispatch.call(tables, "Item", new Variant(1))
    .toDispatch();
  Dispatch t1_row = Dispatch.get(t1, "rows").toDispatch();// 所有行
  int t1_rowNum = Dispatch.get(t1_row, "count").getInt();
  Dispatch.call(Dispatch.get(t1, "columns").toDispatch(), "AutoFit");// 自动调整
  int t1_colNum = Dispatch.get(Dispatch.get(t1, "columns").toDispatch(),
    "count").getInt();
  System.out.println(t1_rowNum + " " + t1_colNum);
  for (int i = 1; i <= t1_rowNum; i++) {
   for (int j = 1; j <= t1_colNum; j++) {
    Dispatch cell = Dispatch.call(t1, "Cell", new Variant(i),
      new Variant(j)).toDispatch();// 行,列
    Dispatch.call(cell, "Select");
    Dispatch.put(selection, "Text", "cell" + i + j); // 写入word的内容
    Dispatch.put(font, "Bold", "0"); // 字型租体(1:租体 0:取消租体)
    Dispatch.put(font, "Color", "1,1,1,0"); // 字型颜色
    Dispatch.put(font, "Italic", "1"); // 斜体 1:斜体 0:取消斜体
    Dispatch.put(font, "Underline", "1"); // 下划线
    Dispatch Range = Dispatch.get(cell, "Range").toDispatch();
    String cellContent = Dispatch.get(Range, "Text").toString();
    System.out.println((cellContent.substring(0, cellContent
      .length() - 1)).trim());
   }
   Dispatch.call(selection, "MoveDown"); // 光标往下一行(才不会输入盖过上一输入位置)
  }
  //合并单元格////////////////////////
  Dispatch.put(selection, "Text", "        ");
  Dispatch.call(selection, "MoveDown"); // 光标标往下一行
  Dispatch range2 = Dispatch.get(selection, "Range").toDispatch();
  Dispatch table2 = Dispatch.call(tables, "Add", range2, new Variant(8),
    new Variant(4), new Variant(1)).toDispatch(); // 设置行数,列数,表格外框宽度
  Dispatch t2 = Dispatch.call(tables, "Item", new Variant(2))
    .toDispatch();
  Dispatch beginCell = Dispatch.call(t2, "Cell", new Variant(1),
    new Variant(1)).toDispatch();
  Dispatch endCell = Dispatch.call(t2, "Cell", new Variant(4),
    new Variant(4)).toDispatch();
  Dispatch.call(beginCell, "Merge", endCell);

  for (int row = 1; row <= Dispatch.get(
    Dispatch.get(t2, "rows").toDispatch(), "count").getInt(); row++) {
   for (int col = 1; col <= Dispatch.get(
     Dispatch.get(t2, "columns").toDispatch(), "count").getInt(); col++) {

    if (row == 1) {
     Dispatch cell = Dispatch.call(t2, "Cell", new Variant(1),
       new Variant(1)).toDispatch();// 行,列
     Dispatch.call(cell, "Select");
     Dispatch.put(font, "Color", "1,1,1,0"); // 字型颜色
     Dispatch.put(selection, "Text", "merge Cell!");
    } else {
     Dispatch cell = Dispatch.call(t2, "Cell", new Variant(row),
       new Variant(col)).toDispatch();// 行,列
     Dispatch.call(cell, "Select");
     Dispatch.put(font, "Color", "1,1,1,0"); // 字型颜色
     Dispatch.put(selection, "Text", "cell" + row + col);
    }
   }
   Dispatch.call(selection, "MoveDown");
  }
  //Dispatch.call(selection, "MoveRight", new Variant(1), new Variant(1));// 取消选择
  // Object content = Dispatch.get(doc,"Content").toDispatch();
  // Word文档内容查找及替换////////////////////////
  Dispatch.call(selection, "TypeParagraph"); // 空一行段落
  Dispatch.put(align, "Alignment", "3"); // 1:置中 2:靠右 3:靠左
  Dispatch.put(font, "Color", 0);
  Dispatch.put(selection, "Text", "欢迎,Hello,world!");
  Dispatch.call(selection, "HomeKey", new Variant(6));// 移到开头
  Dispatch find = Dispatch.call(selection, "Find").toDispatch();// 获得Find组件
  Dispatch.put(find, "Text", "hello"); // 查找字符串"hello"
  Dispatch.put(find, "Forward", "True");// 向前查找
  // Dispatch.put(find, "Format", "True");// 设置格式
  Dispatch.put(find, "MatchCase", "false");// 大小写匹配
  Dispatch.put(find, "MatchWholeWord", "True"); // 全字匹配
  Dispatch.call(find, "Execute"); // 执行查询
  Dispatch.put(selection, "Text", "你好");// 替换为"你好"
  //使用方法传入的参数parameter调用word文档中的MyWordMacro宏//
  //Dispatch.call(document,macroName,parameter);
  //Dispatch.invoke(document,macroName,Dispatch.Method,parameter,new int[1]);
  //页眉,页脚处理////////////////////////
  Dispatch ActiveWindow = wordApp.getProperty("ActiveWindow")
    .toDispatch();
  Dispatch ActivePane = Dispatch.get(ActiveWindow, "ActivePane")
    .toDispatch();
  Dispatch View = Dispatch.get(ActivePane, "View").toDispatch();
  Dispatch.put(View, "SeekView", "9"); //9是设置页眉
  Dispatch.put(align, "Alignment", "1"); // 置中
  Dispatch.put(selection, "Text", "这里是页眉"); // 初始化时间
  Dispatch.put(View, "SeekView", "10"); // 10是设置页脚
  Dispatch.put(align, "Alignment", "2"); // 靠右
  Dispatch.put(selection, "Text", "这里是页脚"); // 初始化从1开始
  //书签处理(打开文档时处理)////////////////////////
  //Dispatch activeDocument = wordApp.getProperty("ActiveDocument").toDispatch();
  Dispatch bookMarks = Dispatch.call(document, "Bookmarks").toDispatch();
  boolean isExist = Dispatch.call(bookMarks, "Exists", "bookMark1")
    .getBoolean();
  if (isExist == true) {
   Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", "bookMark1")
     .toDispatch();
   Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();
   Dispatch.put(range1, "Text", new Variant("当前是书签1的文本信息!"));
   String bookMark1Value = Dispatch.get(range1, "Text").toString();
   System.out.println(bookMark1Value);
  } else {
   System.out.println("当前书签不存在,重新建立!");
   Dispatch.call(bookMarks, "Add", "bookMark1", selection);
   Dispatch rangeItem1 = Dispatch.call(bookMarks, "Item", "bookMark1")
   .toDispatch();
   Dispatch range1 = Dispatch.call(rangeItem1, "Range").toDispatch();
   Dispatch.put(range1, "Text", new Variant("当前是书签1的文本信息!"));
   String bookMark1Value = Dispatch.get(range1, "Text").toString();
   System.out.println(bookMark1Value);

  }
  //保存操作////////////////////////
  Dispatch.call(document, "SaveAs", "D:/wordOperate.doc");
  //Dispatch.invoke((Dispatch) doc, "SaveAs", Dispatch.Method, new Object[]{htmlPath, new Variant(8)}, new int[1]);   //生成html文件
  // 0 = wdDoNotSaveChanges
  // -1 = wdSaveChanges
  // -2 = wdPromptToSaveChanges
  //Dispatch.call(document, "Close", new Variant(0));
  // // worddoc.olefunction("protect",2,true,"");
  // // Dispatch bookMarks = wordApp.call(docs,"Bookmarks").toDispatch();
  // // System.out.println("bookmarks"+bookMarks.getProgramId());
  // //Dispatch.call(doc, "Save"); //保存
  // // Dispatch.call(doc, "Close", new Variant(true));
  // //wordApp.invoke("Quit",new Variant[]{});
  // wordApp.safeRelease();//Finalizers call this method
 }
}

 运行即可看到效果,需要说明的是你的电脑上要安装好word。

 

异常处理:

如果在运行过程中遇到[JACOB] ------>no jacob in the java.library.path异常,请尝试将 jacob.dll放到System.getProperty("java.library.path")取到的目录下。

 

分享到:
评论

相关推荐

    jacob学习笔记

    ### Jacob 学习笔记 #### 一、Jacob 概述 Jacob,即 Java COM Bridge,是一种用于连接 Java 应用程序与 COM 组件的技术。它允许开发者利用 Java 的跨平台特性,同时能够调用 Windows 平台上丰富的 COM 接口。这种...

    jacob的学习最佳代码

    学习jacob的绝对最佳代码。 其中基本包括所有word操作。 有时间大家可以一起交流。

    jacob.rar 一个64位一个32位

    标题中的“jacob.rar 一个64位一个32位”指的是这个压缩包包含了两个版本的JACOB库,一个是适用于64位操作系统的jacob-1.18-x64.dll,另一个是适用于32位操作系统的jacob-1.18-x86.dll。JACOB全称为Java COM Bridge...

    jacob使用入门

    #### 一、Jacob简介与工作原理 Jacob,全称为Java-COM Bridge,是一款开源的Java库,旨在为Java程序提供访问Windows COM(Component Object Model)组件的能力。COM是一种由Microsoft开发的对象模型,允许不同编程...

    jacob1.9 jacob1.12 jacob1.14

    这个压缩包中的“Jacob大全”可能包含所有这些版本的jar包,以及一个详细的使用说明文档,帮助开发者了解如何在项目中集成和使用Jacob。通过选择合适的版本和遵循使用说明,Java开发者可以在Windows环境中充分利用...

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

    下面是一个简单的示例,展示如何使用Jacob创建一个新的Excel工作簿并添加数据: ```java import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public ...

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

    总的来说,JACOB是一个强大的工具,它使得Java开发者可以轻松地集成Office应用程序的功能,而无需深入学习COM编程。不过,由于JACOB是基于COM,所以它仅适用于Windows平台。在实际应用中,需要考虑到兼容性和性能的...

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

    Jacob,全称Java COM Bridge,是一个Java到COM互操作库,允许Java程序调用Windows的COM组件和DLL。本文将详细解析"jacob1.18"和"jacob1.19"这两个版本的特性、使用方法以及它们在Windows环境下的应用。 首先,我们...

    jacob开发文档jacob

    **Jacob开发文档与示例详解** ...总的来说,Jacob是Java开发者在处理与Microsoft Office交互任务时的一个强大工具。通过深入理解其工作原理和示例,开发者可以有效地利用这个库在Java项目中实现复杂的文档处理功能。

    jacob(jacob.dll,jacob.jar)

    Jacob是Java和COM之间的一个桥梁,它允许Java代码与Windows平台上的COM组件进行交互。这个工具包包含了两个关键部分:`jacob.dll`和`jacob.jar`。 `jacob.dll`是一个动态链接库(Dynamic Link Library),在Windows...

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

    Jacob是Java和COM之间的一个桥梁,它允许Java应用程序与Windows平台上的COM组件进行交互。这个压缩包"jacob1.19"包含了两个版本的Jacob动态链接库(DLL)文件:jacob-1.19-x64.dll适用于64位系统,而jacob-1.19-x86....

    jacob-1.17-M2

    这些文档对于初学者来说尤其重要,因为Jacob的使用涉及到一些COM和Java交互的底层知识,可能需要一定的学习和实践才能掌握。 总的来说,Jacob-1.17-M2是一个强大的工具,它让Java开发者能够方便地利用Windows平台...

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

    例如,通过Jacob,你可以创建一个Excel工作簿,写入数据,然后保存为文件。 3. **多平台支持**:尽管Jacob主要用于Windows环境,但Java的跨平台特性意味着你可以在任何支持Java的平台上构建应用,然后在运行时连接...

    jacob1.18源码和jar包

    而com jacob com中有一个很基础的类com jacob com JacobObject 其中比较常用的两个类com jacob com Dispatch和com jacob com Variant便是继承自它 (com jacob com Dispatch;里面提供了调度MS windows系统API ...

    jacob-1.19.zip

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

    jacob各个版本好用

    Java中的Jacob库是一个非常有用的工具,它允许Java应用程序与Windows API进行交互,从而实现许多原本在Java中难以实现的功能,比如自动化Office文档处理、打印、COM组件交互等。标题提到"jacob各个版本好用",这暗示...

    JACOB各版本下载

    **JACOB(Java Advanced COM Bridge)**是一个强大的开源库,允许Java应用程序与COM(Component Object Model)组件进行交互。标题“JACOB各版本下载”表明我们将讨论JACOB的不同版本及其获取途径,而描述则突出了...

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

    Jacob的API文档是学习和使用Jacob的重要资源,它详尽地列出了Jacob提供的所有类、接口及其方法,有助于开发者快速定位所需功能。在开发过程中,开发者可以参考这些文档,了解如何正确创建和操作COM对象,以及如何...

Global site tag (gtag.js) - Google Analytics