Java 控制Office 控件是非常麻煩的一件事情。
自從有了JACOB後,事情變得簡單多了。
但是要實現Java靈活的控制Word還是一件非常麻煩的事情。
下面介紹幾個Word常見的對象以及一些典型的處理過程,希望對大家有幫助。
(請注意:JDK1.3.2運行 Jacob比較正常,JDK1.4有問題) /** Word對象*/
1,初始化
private ActiveXComponent Word = null;
/** 文檔對象*/
private Dispatch documents = null;
/** selection 對象是比較重要的一個對象 */
private Dispatch vSelection = null;
/** 一個Word文檔 */
private Dispatch Wordfile = null; word = new ActiveXComponent("Word.Application");
2,打開文件
documents = Word.getProperty("Documents").toDispatch();
(將JACOB 放在 WINNTsystem32 下比較簡單省事) Wordfile = Dispatch.invoke(
在Word中,選定內容進行轉換時,不用象Java對象一樣來回的重新取,這個對象一直有效。
documents,
"Open",
Dispatch.Method,
new Object[] {
strFileName,
new Variant(true),//是否進行轉換 ConfirmConversions
new Variant(false)//是否只讀
}, new int[1]).toDispatch();
vSelection = Word.getProperty("Selection").toDispatch();
3,顯示Word
Word.setProperty("Visible", new Variant(visible));
4,設置Word的位置 Dispatch activeWindow = Dispatch.get(Word, "Application").toDispatch();
進行將Java內的數據和WORD交換,常用的做法是,在Word上作一些特殊的標記,利用 FIND 和 Replace的方法進行,這個方法不是太好。
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));
個人覺得使用超鏈接的模式比較方便。
有幾大優點:
1, Hyperlink 有3個區域可以讓開發者自己利用 ActiveDocument.Hyperlinks.Add
個人建議使用TextToDisplay。
Anchor:=Selection.Range,
Address:="位置", //地址(可以利用) 有個缺點
SubAddress:="",//子位置(可以利用)
ScreenTip:="", //屏幕提示
TextToDisplay:="顯示內容"//最好利用的東西
Address 會在保存時被替換成絕對路徑。
比如你錄入一個
“AA.BB.CC”
保存時可能會被替換成
C:Documents and SettingsAdministrator My DocumentsAA.BB.CC
2, 可以進行自動定位
利用Hyperlinks 可以將文章中所有的超鏈接得到。
也可以將指定范圍的超鏈接得到。
3, 可以自由排版
4, 可以拷貝粘貼
添加超鏈接:
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, 得到一行的超鏈接 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, 替換內容,讀到這裡就不用介紹了。