| |
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编辑器,辅助功能,都能发掘出来。 |
|