技术文档>>JAVA>>新手入门>>JDK>查看文档  
  利用java语言深度控制word     
  文章作者:未知  文章来源:中国IT实验室  
  查看:906次  录入:管理员--2007-11-20  
  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编辑器,辅助功能,都能发掘出来。
 
 
上一篇: java ejb容器的存取和实现    下一篇: jdk和tomcat的安装与配置
  相关文档
利用java语言深度控制word 11-20
分享关于jdk1.5 scanner类的说明 11-20
j2se 1.4.2增强功能与改变 11-20
熟练掌握jdk1.5枚举类型 11-20
j2se综合:对java.util的总结 六 11-20
谈谈j2se中的序列化之接受默认序列化 11-20
java.lang包概述(可以当作学习索引) 11-20
jdk的安装 11-20
提升性能:使用string还是stringbuffer? 11-20
jdk6.0的新特性:轻量级http server 11-20
java基础知识——jni入门介绍(上) 11-20
jre与jdk在启动应用服务器中的作用 11-20
j2se1.4的i/o新特性 11-20
collection类的使用总结 11-20
j2se 1.4 中assertion 功能介绍 11-20
安装j2se 11-20
用于正则表达式的抽象java api 11-20
从集合类的升级联想到java适配器模式 11-20
了解java密码扩展的基础 11-20
jdk5 新特性之新的格式化输出 11-20
返回首页 | 关于我们 | J网章程 | JSP空间 | 免责声明 | 常见问题 | JSP空间操作手册

@2005-2012福建JSP技术网 版权所有 闽ICP备09012882号
技术电话:13616026886 谢宁松
邮箱:fjjsp @ vip.163.com 站长QQ,点击这里给我发消息