这个文章给的文档和API下载地址有问题,下载问题,请大家参照下个文章
这些文章好象都有问题,等我整整写个文章给大家吧
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编辑器,辅助功能,都能发掘出来
地震让大伙知道:居安思危,才是生存之道。