服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > JDK > 查看文档

利用java语言深度控制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 放在 winnt\system32\ 下比较简单省事)
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 settings\administrator \my documents\aa.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编辑器,辅助功能,都能发掘出来。

扫描关注微信公众号