在 Java 應用開發中,經常需要與 Microsoft Office 等 Windows 原生應用程式進行互操作。其中最常見的需求便是將 Word 文檔轉換為其他格式(如 HTML 或 XML)。本文將詳細介紹如何使用 JACOB (Java-COM Bridge) 架設 Java 與 COM 物件的橋梁,實現 Word 文檔到 XML 的自動化轉換流程。
JACOB 是一款開源的 Java-COM 橋接庫,允許 Java 程式呼叫 Windows 平台上的 COM 元件。請依照以下步驟完成環境配置:
jacob.jar(Java 類庫)與 jacob.dll(原生動態連結庫)。jacob.dll 所在的目錄加入系統環境變數 PATH 中,確保 JVM 能在執行時正確載入原生庫。由於 Word 無法直接另存為標準 XML(早期版本限制),本範例採用「Word → HTML → XML」的兩階段轉換策略,並利用 Excel 作為中介工具完成 HTML 到 XML 的最終轉換。
import java.io.File;
import com.jacob.com.*;
import com.jacob.activeX.*;
public class WordToXmlConverter {
public static void main(String[] args) {
// 階段一:使用 Word 將 .doc 轉為 .htm
ActiveXComponent wordApp = new ActiveXComponent("Word.Application");
String inFile = "H:\\Majix-1_2_2_full\\sample\\my.doc";
String tpFile = "H:\\Majix-1_2_2_full\\sample\\my.htm";
String otFile = "H:\\Majix-1_2_2_full\\sample\\my.xml";
boolean stage1Success = false;
try {
// 設定 Word 於背景執行,不顯示視窗
wordApp.setProperty("Visible", new Variant(false));
// 取得 Documents 集合並開啟目標文件
// 參數:檔案路徑, ConfirmConversions=false, ReadOnly=true
Object docs = wordApp.getProperty("Documents").toDispatch();
Object doc = Dispatch.invoke(
docs, "Open", Dispatch.Method,
new Object[]{inFile, new Variant(false), new Variant(true)},
new int[1]
).toDispatch();
// 另存為 HTML 格式 (格式代碼 8 代表 wdFormatHTML)
Dispatch.invoke(
doc, "SaveAs", Dispatch.Method,
new Object[]{tpFile, new Variant(8)},
new int[1]
);
// 關閉文件,不儲存變更
Dispatch.call(doc, "Close", new Variant(false));
stage1Success = true;
} catch (Exception e) {
e.printStackTrace();
} finally {
// 確保 Word 進程正確退出
wordApp.invoke("Quit", new Variant[]{});
}
// 階段二:使用 Excel 將 .htm 轉為 .xml
if (stage1Success) {
ActiveXComponent excelApp = new ActiveXComponent("Excel.Application");
try {
excelApp.setProperty("Visible", new Variant(false));
Object workbooks = excelApp.getProperty("Workbooks").toDispatch();
Object workbook = Dispatch.invoke(
workbooks, "Open", Dispatch.Method,
new Object[]{tpFile, new Variant(false), new Variant(true)},
new int[1]
).toDispatch();
// 另存為 XML 格式 (格式代碼 46 代表 xlXMLSpreadsheet)
Dispatch.invoke(
workbook, "SaveAs", Dispatch.Method,
new Object[]{otFile, new Variant(46)},
new int[1]
);
Dispatch.call(workbook, "Close", new Variant(false));
} catch (Exception e) {
e.printStackTrace();
} finally {
excelApp.invoke("Quit", new Variant[]{});
// 清理暫存的 HTML 檔案
try {
new File(tpFile).delete();
} catch (Exception ignore) {}
}
}
}
}
確認 jacob.dll 已在 PATH 中,然後執行以下指令:
javac -classpath jacob.jar WordToXmlConverter.java
java -cp jacob.jar;. WordToXmlConverter
8 (wdFormatHTML) 與 46 (xlXMLSpreadsheet) 為 Office 內建列舉值,需參考官方文件確認版本相容性。finally 區塊呼叫 Quit(),否則 Word/Excel 進程將常駐記憶體。JACOB 為 Java 與 Windows COM 生態系提供了強大的連結能力。雖然現代開發傾向於使用 Apache POI 等純 Java 方案處理 Office Open XML 格式,但在面對舊版 .doc 二進制格式、需利用 Word 排版引擎精確轉換、或需自動化其他 COM 元件 (如 Outlook、IE) 時,JACOB 仍是不可替代的利器。掌握其核心 API 與資源管理模式,將大幅擴展 Java 應用在企業級整合場景的能力邊界。