Java控制Office控件是非常麻烦的一件事情。
自从有了JACOB后,事情变得简单多了。
但是要实现Java灵活的控制Word还是一件非常麻烦的事情。
下面介绍几个WORD常见的对象以及一些典型的处理过程,希望对大家有帮助。
(请注意:JDK1.3.2运行Jacob比较正常,JDK1.4有问题)
/**WORD对象*/
privateActiveXComponentword=null;
/**文档对象*/
privateDispatchdocuments=null;
/**selection对象是比较重要的一个对象*/
privateDispatchvSelection=null;
/**一个WORD文档*/
privateDispatchwordfile=null;
1,初始化
word=newActiveXComponent("Word.Application");
documents=word.getProperty("Documents").toDispatch();
(将JACOB放在WINNT\system32\下比较简单省事)
2,打开文件
wordfile=Dispatch.invoke(
documents,
"Open",
Dispatch.Method,
newObject[]{
strFileName,
newVariant(true),//是否进行转换ConfirmConversions
newVariant(false)//是否只读
},newint[1]).toDispatch();
vSelection=word.getProperty("Selection").toDispatch();
在WORD中,选定内容进行转换时,不用象Java对象一样来回的重新取,这个对象一直有效。
3,显示WORD
word.setProperty("Visible",newVariant(visible));
4,设置WORD的位置
DispatchactiveWindow=Dispatch.get(word,"Application").toDispatch();
Dispatch.put(activeWindow,"WindowState",newVariant(0));
Dispatch.put(activeWindow,"Top",newVariant(0));
Dispatch.put(activeWindow,"Left",newVariant(0));
Dispatch.put(activeWindow,"Height",newVariant(600));
Dispatch.put(activeWindow,"width",newVariant(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:\DocumentsandSettings\Administrator\MyDocuments\AA.BB.CC
2,可以进行自动定位
利用Hyperlinks可以将文章中所有的超链接得到。
也可以将指定范围的超链接得到。
3,可以自由排版
4,可以拷贝粘贴
添加超链接:
DispatchHyperlinks=Dispatch.get(wordfile,"Hyperlinks").toDispatch();
Dispatchrange=Dispatch.get(vSelection,"Range").toDispatch();
Dispatchh=Dispatch.invoke(Hyperlinks,
"Add",Dispatch.Method,newObject[]
{range,
newVariant("Address"),
newVariant("SubAddress"),
newVariant("{table.fieldName}"),//建议的数据链接处
newVariant("姓名")},//在WORD中显示的内容
newint[4]).toDispatch();
DispatchhRange=Dispatch.get(h,"Range").toDispatch();
Dispatch.call(hRange,"select");
//设置字体,颜色
Dispatchfont=Dispatch.get(vSelection,"Font").toDispatch();
Dispatch.put(font,"Underline",newVariant(0));
Dispatch.put(font,"Color",newVariant(0));
//取消选择
Dispatch.call(vSelection,"MoveRight",newVariant(1),newVariant(1));
超链接替换内容:
1,得到所有的超链接
//选择对象
Dispatch.call(dObject,"select");
//得到超链接集合
DispatchHyperlinks=Dispatch.get(vSelection,"Hyperlinks").toDispatch();
//得到有多少个超链接
intnHyperlink=Dispatch.get(Hyperlinks,"count").toInt();
//得到一个超链接
Dispatchhyperlink=Dispatch.invoke(Hyperlinks,"item",
Dispatch.Method,newObject[]{newInteger(i+1)},
newint[1]).toDispatch()));
2,替换内容
Dispatch.put(hyperlink,"TextToDisplay",information);
3,取消超链接,将超链接变成普通文字。
Dispatch.call(hyperlink,"delete");
如何实现批量数据自动扩展,建议使用表格进行自动扩展,方便简单。
结合使用上面超链接的技术。会非常简单:
比如有如下数据:
DataA
DataB
1,列出所有表格
和列出所有超链接基本一样:
privatevoidgetTables01(Dispatchobjcet,VectorvTableStore){
Dispatchtables=Dispatch.get(objcet,"tables").toDispatch();
intnTableAmount=Dispatch.get(tables,"count").toInt();
for(inti=0;i<nTableAmount;i++){
Dispatchtable=
Dispatch
.invoke(
tables,
"item",
Dispatch.Method,
newObject[]{newInteger(i+1)},
newint[1])
.toDispatch();
vTableStore.add(newDTable(table));
getTables01(table,vTableStore);//处理表格套用表格的情况
}
}
2,表格的可以控制的对象
DispatchdRows=Dispatch.get(dTable,"rows").toDispatch();//所有行
intnRows=Dispatch.get(dRows,"count").toInt();
3,取得一行的内容
DispatchdRow=
Dispatch
.invoke(
rows,
"item",
Dispatch.Method,
newObject[]{newInteger(row+1)},
newint[1])
.toDispatch();
returndRow;
}catch(ComFailExceptioncfe)
{
/**带有合并行的情况*/
returnnull;
}
4,得到一行的超链接
DHyperlinkdhInRow[]=listHyperlinks(dRow);
5,将某一行拷贝很多次
Dispatch.call(dRow,"select");
Dispatch.call(vSelection,"Copy");
intnCopyNow=nDataBlockRow-1;
for(intnCopys=0;nCopys<nCopyNow;nCopys++){
try{
Dispatch.call(vSelection,"Paste");
}catch(Exceptione){e.printStackTrace();
//有时候文档损坏,可以忽略本问题,实际上已经粘贴上了
}
}
6,替换内容,读到这里就不用介绍了。
打印预览:
Dispatch.call(wordfile,"PrintPreView");
其他的功能发掘
利用WORD的宏录制,以及VB编辑器,辅助功能,都能发掘出来。