龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

利用JAVA语言深度控制Word

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
Java控制Office控件是非常麻烦的一件事情。 自从有了JACOB后,事情变得简单多了。 但是要实现Java灵活的控制Word还是一件非常麻烦的事情。 下面介绍几个WORD常见的对象以及一些典型的处

   Java 控制Office 控件是非常麻烦的一件事情。
    自从有了JACOB后,事情变得简单多了。
    但是要实现Java灵活的控制Word还是一件非常麻烦的事情。
    
    下面介绍几个WORD常见的对象以及一些典型的处理过程,希望对大家有帮助。
    (请注重:JDK1.3.2运行 Jacob比较正常,JDK1.4有问题)
    /** WORD对象*/
    private ActiveXComponent word = null;
    /** 文档对象*/
  private Dispatch documents = null;
  /** selection 对象是比较重要的一个对象 */
    private Dispatch vSelection = null;
    /** 一个WORD文档 */
    private Dispatch wordfile = null;
  1,初始化
      word = new ActiveXComponent("Word.Application");
      documents = word.getProperty("Documents").toDispatch();
      (将JACOB 放在 WINNTsystem32 下比较简单省事)
  2,打开文件
        wordfile = Dispatch.invoke(
          documents,
          "Open",
          Dispatch.Method,
            new Object[] {
  strFileName,
  new Variant(true),//是否进行转换 ConfirmConversions
              new Variant(false)//是否只读
  }, new int[1]).toDispatch();
  vSelection = word.getProperty("Selection").toDispatch();
  在WORD中,选定内容进行转换时,不用象Java对象一样往返的重新取,这个对象一直有效。
  3,显示WORD
      word.setProperty("Visible", new Variant(visible));
  4,设置WORD的位置
      Dispatch activeWindow = Dispatch.get(word, "Application").toDispatch();
      Dispatch.put(activeWindow, "WindowState", new Variant(0));
      Dispatch.put(activeWindow, "Top", new Variant(0));
      Dispatch.put(activeWindow, "Left", new Variant(0));
      Dispatch.put(activeWindow, "Height", new Variant(600));
      Dispatch.put(activeWindow, "width", new Variant(800));
  
  进行将JAVA内的数据和WORD交换,常用的做法是,在WORD上作一些非凡的标记,利用 FIND 和 Replace的方法进行,这个方法不是太好。
  个人觉得使用超链接的模式比较方便。
  有几大优点:
  1,  Hyperlink 有3个区域可以让开发者自己利用
  ActiveDocument.Hyperlinks.Add
  Anchor:=Selection.Range,
  Address:="位置", //地址(可以利用) 有个缺点
  SubAddress:="",//子位置(可以利用)
  ScreenTip:="", //屏幕提示
  TextToDisplay:="显示内容"//最好利用的东西
  
  个人建议使用TextToDisplay。
  Address 会在保存时被替换成绝对路径。
  比如你录入一个
  “AA.BB.CC”
  保存时可能会被替换成
  C:Documents and SettingsAdministrator My DocumentsAA.BB.CC
  2,  可以进行自动定位
  利用Hyperlinks 可以将文章中所有的超链接得到。
  也可以将指定范围的超链接得到。
  3,  可以自由排版
  4,  可以拷贝粘贴
  
  添加超链接:
    Dispatch Hyperlinks = Dispatch.get(wordfile, "Hyperlinks").toDispatch();
    Dispatch range = Dispatch.get(vSelection, "Range").toDispatch();
    Dispatch h=Dispatch.invoke(Hyperlinks,
  "Add", Dispatch.Method, new Object[]
  { range,
          new Variant("Address"),
  new Variant("SubAddress"),
  new Variant("{table.fieldName}"),//建议的数据链接处
          new Variant("姓名") }, // 在WORD中显示的内容
  new int[4]).toDispatch();
      Dispatch hRange=Dispatch.get(h, "Range").toDispatch();
      Dispatch.call(hRange,"select");
      //设置字体,颜色
      Dispatch font = Dispatch.get(vSelection, "Font").toDispatch();
      Dispatch.put(font,"Underline", new Variant(0));
      Dispatch.put(font,"Color", new Variant(0));
      //取消选择
      Dispatch.call(vSelection,"MoveRight",new Variant(1),new Variant(1));
  
  超链接替换内容:
  1,  得到所有的超链接
  //选择对象
     Dispatch.call(dObject, "select");
      //得到超链接集合
     Dispatch Hyperlinks = Dispatch.get(vSelection,  "Hyperlinks").toDispatch();
      //得到有多少个超链接
     int nHyperlink = Dispatch.get(Hyperlinks, "count").toInt();
      //得到一个超链接
      Dispatch hyperlink=Dispatch.invoke(Hyperlinks, "item",
        Dispatch.Method, new Object[] { new Integer(i + 1)},
     new int[1]).toDispatch()));
  2,  替换内容
  Dispatch.put(hyperlink, "TextToDisplay", information);
  3,  取消超链接,将超链接变成普通文字。
  Dispatch.call(hyperlink, "delete");
  
  如何实现批量数据自动扩展,建议使用表格进行自动扩展,方便简单。
  结合使用上面超链接的技术。会非常简单:
  
  比如有如下数据:
      
  DataA
  DataB
  
  1,  列出所有表格
  和列出所有超链接基本一样:
  private void getTables01(Dispatch objcet,Vector vTableStore) {
  Dispatch tables = Dispatch.get(objcet, "tables").toDispatch();
  int nTableAmount = Dispatch.get(tables, "count").toInt();
  for (int i = 0; i < nTableAmount; i++) {
  Dispatch table =
  Dispatch
  .invoke(
  tables,
  "item",
  Dispatch.Method,
  new Object[] { new Integer(i + 1)},
  new int[1])
  .toDispatch();
  vTableStore.add(new DTable(table));
  getTables01(table,vTableStore);//处理表格套用表格的情况
  }
  }
  2,  表格的可以控制的对象
      Dispatch dRows = Dispatch.get(dTable, "rows").toDispatch();//所有行
      int nRows = Dispatch.get(dRows, "count").toInt();
  3,  取得一行的内容
    Dispatch dRow =
      Dispatch
        .invoke(
          rows,
          "item",
          Dispatch.Method,
          new Object[] { new Integer(row + 1)},
          new int[1])
        .toDispatch();
         return dRow;
    }catch(ComFailException cfe)
    {
      /** 带有合并行的情况*/
      return null;
    }
  4,  得到一行的超链接
  DHyperlink dhInRow[] = listHyperlinks(dRow);
  5,  将某一行拷贝很多次
      Dispatch.call(dRow, "select");
      Dispatch.call(vSelection, "Copy");
      int nCopyNow = nDataBlockRow - 1;
      for (int nCopys = 0; nCopys < nCopyNow; nCopys++) {
     try   {
  Dispatch.call(vSelection, "Paste");
     }catch(Exception e)   {   e.printStackTrace();
       //有时候文档损坏,可以忽略本问题,实际上已经粘贴上了  
     }
      }
  6,  替换内容,读到这里就不用介绍了。
  
  打印预览:
  Dispatch.call(wordfile,"PrintPreView");
  
  其他的功能发掘
    利用WORD的宏录制,以及VB编辑器,辅助功能,都能发掘出来。
  
精彩图集

赞助商链接