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