JAVA 深度控制 WORD JavaVBOffice
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 推荐读物与源代码阅读
下一篇: 怎么样修改图片才不会被拉伸