首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 與 COM 物件互操作:使用 JACOB 實現 Word 轉 XML 完整指南

     編輯:Java 程式設計入門

前言

在 Java 應用開發中,經常需要與 Microsoft Office 等 Windows 原生應用程式進行互操作。其中最常見的需求便是將 Word 文檔轉換為其他格式(如 HTML 或 XML)。本文將詳細介紹如何使用 JACOB (Java-COM Bridge) 架設 Java 與 COM 物件的橋梁,實現 Word 文檔到 XML 的自動化轉換流程。

環境準備:獲取並配置 JACOB

JACOB 是一款開源的 Java-COM 橋接庫,允許 Java 程式呼叫 Windows 平台上的 COM 元件。請依照以下步驟完成環境配置:

  1. 前往官方網站 danadler.com/jacob/ 下載最新版本的 JACOB。
  2. 解壓縮後,你需要兩個核心檔案:jacob.jar(Java 類庫)與 jacob.dll(原生動態連結庫)。
  3. 將 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

關鍵技術點解析

  • ActiveXComponent:代表一個 COM 物件的代理,用於啟動 Word/Excel 應用程式實例。
  • Dispatch.invoke / Dispatch.call:核心呼叫機制,分別對應「有回傳值的方法呼叫」與「無回傳值的方法呼叫/屬性存取」。
  • Variant:JACOB 用於封裝 COM VARIANT 資料類型的包裝類別,傳遞參數時必須包裝。
  • 格式代碼:8 (wdFormatHTML) 與 46 (xlXMLSpreadsheet) 為 Office 內建列舉值,需參考官方文件確認版本相容性。

常見問題與最佳實踐

  1. 進程殘留:務必在 finally 區塊呼叫 Quit(),否則 Word/Excel 進程將常駐記憶體。
  2. 權限與安全性:伺服器端自動化 Office 需配置 DCOM 權限 (dcomcnfg),並建議使用專用服務帳號而非系統帳號。
  3. 效能考量:啟動 Office 應用程式耗時較長,高併發場景建議採用連線池或改用純 Java 庫 (如 Apache POI) 處理較新的 .docx 格式。
  4. 結語

    JACOB 為 Java 與 Windows COM 生態系提供了強大的連結能力。雖然現代開發傾向於使用 Apache POI 等純 Java 方案處理 Office Open XML 格式,但在面對舊版 .doc 二進制格式、需利用 Word 排版引擎精確轉換、或需自動化其他 COM 元件 (如 Outlook、IE) 時,JACOB 仍是不可替代的利器。掌握其核心 API 與資源管理模式,將大幅擴展 Java 應用在企業級整合場景的能力邊界。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved