如何在 Java 中使用 GroupDocs Document Comparison API 比較 Excel 檔案

在許多企業中,您需要 在 Java 中比較 Excel 檔案 以發現財務報表變更、稽核資料修訂,或驗證遷移結果。手動開啟兩個活頁簿並逐格檢查容易出錯且浪費寶貴時間。本教學將示範如何使用 GroupDocs.Comparison for Java 以程式方式 比較 Excel 活頁簿,於數秒內產生像素級精確的差異報告。

快速解答

  • GroupDocs 能在 Java 中比較 Excel 檔案嗎? 可以 – 只要使用 Comparer 類別載入 .xlsx 檔案並呼叫 compare。
  • 如何忽略頁首/頁尾? 在 CompareOptions 中設定 setHeaderFootersComparison(false)。
  • 大型 PDF 該怎麼處理? 增加 JVM heap,啟用串流模式,並使用記憶體最佳化選項。
  • 能比較受密碼保護的 PDF 嗎? 在建立 Comparer 時提供密碼。
  • 有辦法變更標示顏色嗎? 使用 StyleSettings 針對插入、刪除與變更項目設定樣式。

什麼是 Excel 檔案比較(Java)?

在 Java 中比較 Excel 檔案指的是以程式方式偵測兩個 .xlsx 活頁簿之間每一格的新增、刪除或修改,並產生視覺化的差異報告以突顯這些變更。GroupDocs.Comparison 引擎會將每個試算表載入記憶體,評估公式、樣式與工作表結構,然後產生並排或疊加的 PDF/HTML 報告,開發者可將其嵌入儀表板或以電郵方式傳送給利害關係人。

為何使用 Java 文件比較 API?

自動化產生差異可消除人工審查中約 20 % 的遺漏錯誤,確保結果一致且可靠。GroupDocs 提供高精度的變更偵測、快速的處理時間,以及跨輸出格式統一的樣式,協助財務、法律與內容管理團隊提升生產力。

支援的檔案格式與功能

GroupDocs.Comparison for Java 支援 50+ 輸入與輸出格式,包括:

  • 文件:DOCX、DOC、PDF、RTF、ODT
  • 試算表:XLSX、XLS、CSV、ODS
  • 簡報:PPTX、PPT、ODP
  • 文字:TXT、HTML、XML、MD
  • 影像:PNG、JPEG、BMP、GIF(視覺比較)

進階功能包括受密碼保護文件的處理、多語言偵測、依文件類型自訂靈敏度、批次處理,以及雲端與本地部署選項。

前置條件與設定

系統需求

  1. Java Development Kit (JDK): 8 或以上(建議 JDK 11+)
  2. 建置工具: Maven 3.6+ 或 Gradle 6.0+
  3. 記憶體: 大檔案最低 4 GB RAM
  4. 儲存空間: 至少 500 MB 可供暫存比較資料

Maven 設定

在 pom.xml 中加入 GroupDocs 的倉庫與相依性,以確保取得官方發行版:

<repositories>
    <repository>
        <id>repository.groupdocs.com</id>
        <name>GroupDocs Repository</name>
        <url>https://releases.groupdocs.com/comparison/java/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>com.groupdocs</groupId>
        <artifactId>groupdocs-comparison</artifactId>
        <version>25.2</version>
    </dependency>
</dependencies>

授權設定

開發與測試用

正式環境

在應用程式啟動時初始化授權:

// License initialization - do this once at application startup
com.groupdocs.comparison.License license = new com.groupdocs.comparison.License();
license.setLicense("path/to/your/license/file.lic");

Pro tip: 將授權檔案放在 resources 資料夾,並以 getClass().getResourceAsStream() 載入,以利可移植部署。

核心實作指南

功能 1:忽略頁首與頁尾比較

setHeaderFootersComparison 方法會停用頁首與頁尾內容的比較,避免不相關的差異出現在 diff 中。

為何重要: 頁首與頁尾常包含時間戳或頁碼,版本間會變動卻不屬於實質內容。跳過它們可減少噪音並加快處理速度。

實務情境: 兩份合約草稿的頁腳顯示不同的產生日期;您只關心條款變更。

import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.options.CompareOptions;
import java.io.FileOutputStream;

public class IgnoreHeaderFooterExample {
    public static void main(String[] args) throws Exception {
        String outputFileName = "YOUR_OUTPUT_DIRECTORY/IgnoreHeaderFooter_result.docx";

        try (OutputStream resultStream = new FileOutputStream(outputFileName);
             Comparer comparer = new Comparer("YOUR_DOCUMENT_DIRECTORY/source_with_footer.docx")) {

            comparer.add("YOUR_DOCUMENT_DIRECTORY/target_with_footer.docx");

            // Set comparison options to ignore headers and footers
            CompareOptions compareOptions = new CompareOptions.Builder()
                    .setHeaderFootersComparison(false)
                    .build();

            final Path resultPath = comparer.compare(resultStream, new SaveOptions(), compareOptions);
        }
    }
}

主要好處: diff 結果更清晰、誤報減少,且執行更快,因為省略了這些區段。

功能 2:設定輸出紙張大小以產生專業報告

PaperSize 列舉定義了產生 PDF 時使用的標準頁面尺寸。

商業情境: 法務團隊常需將比較報告列印成特定紙張尺寸,以符合法院提交或客戶交付的要求。

使用方式: 在 CompareOptions 中使用 PaperSize 列舉設定目標尺寸。

import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.options.CompareOptions;
import com.groupdocs.comparison.options.enums.PaperSize;

public class SetOutputPaperSizeExample {
    public static void main(String[] args) throws Exception {
        String outputFileName = "YOUR_OUTPUT_DIRECTORY/SetOutputPaperSize_result.docx";

        try (OutputStream resultStream = new FileOutputStream(outputFileName);
             Comparer comparer = new Comparer("YOUR_DOCUMENT_DIRECTORY/source_word.docx")) {

            comparer.add("YOUR_DOCUMENT_DIRECTORY/target1_word.docx");

            // Set the paper size to A6
            CompareOptions compareOptions = new CompareOptions.Builder()
                    .setPaperSize(PaperSize.A6)
                    .build();

            final Path resultPath = comparer.compare(resultStream, compareOptions);
        }
    }
}

支援的尺寸包括 A0‑A10、Letter、Legal、Tabloid 以及自訂尺寸。歐洲客戶可選 A4,美國合作夥伴則使用 Letter。

功能 3:微調比較靈敏度

setSensitivityOfComparison 方法調整比較引擎評估變更的粒度,範圍從大型結構編輯到單字元差異皆可。

挑戰: 不同文件類別需要不同的粒度。法律合約要求字元級精確,行銷文案則可能只需段落級變更。

靈敏度尺度(0‑100):

  • 0‑25: 僅偵測重大變更(段落新增/刪除)
  • 26‑50: 中度變更(句子編輯)
  • 51‑75: 詳細變更(單字級)
  • 76‑100: 細緻變更(字元級)
import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.options.CompareOptions;

public class AdjustComparisonSensitivityExample {
    public static void main(String[] args) throws Exception {
        String outputFileName = "YOUR_OUTPUT_DIRECTORY/AdjustComparisonSensitivity_result.docx";

        try (OutputStream resultStream = new FileOutputStream(outputFileName);
             Comparer comparer = new Comparer("YOUR_DOCUMENT_DIRECTORY/source_word.docx")) {

            comparer.add("YOUR_DOCUMENT_DIRECTORY/target1_word.docx");

            // Set sensitivity to 100 for maximum detail
            CompareOptions compareOptions = new CompareOptions.Builder()
                    .setSensitivityOfComparison(100)
                    .build();

            final Path resultPath = comparer.compare(resultStream, compareOptions);
        }
    }
}

最佳實務設定: 法務文件 90‑100,行銷內容 40‑60,技術規格 70‑80。

功能 4:自訂變更樣式以提升視覺傳達

StyleSettings 物件允許您為插入、刪除與修改的內容定義顏色、字型、邊框等視覺提示。

為何需要自訂樣式: 預設的高亮顏色可能與企業品牌或無障礙指引衝突。調整顏色、字型與邊框可讓 diff 一目了然。

範例: 刪除使用紅色背景,插入使用綠色背景,修改使用藍色背景。

import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.options.CompareOptions;
import com.groupdocs.comparison.options.save.SaveOptions;
import com.groupdocs.comparison.options.style.StyleSettings;

import java.awt.Color;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

public class CustomizeChangesStylesStreamExample {
    public static void main(String[] args) throws Exception {
        String outputFileName = "YOUR_OUTPUT_DIRECTORY/CustomizeChangesStylesStream_result.docx";

        try (InputStream sourceFile = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/source_word.docx");
             InputStream targetFile = new FileInputStream("YOUR_DOCUMENT_DIRECTORY/target1_word.docx");
             OutputStream resultStream = new FileOutputStream(outputFileName);
             Comparer comparer = new Comparer(sourceFile)) {

            comparer.add(targetFile);

            // Customize change styles for professional appearance
            StyleSettings insertedStyle = new StyleSettings();
            insertedStyle.setHighlightColor(Color.GREEN); // Green for additions
            StyleSettings deletedStyle = new StyleSettings();
            deletedStyle.setHighlightColor(Color.RED); // Red for deletions
            StyleSettings changedStyle = new StyleSettings();
            changedStyle.setHighlightColor(Color.BLUE); // Blue for modifications

            CompareOptions compareOptions = new CompareOptions.Builder()
                    .setInsertedItemStyle(insertedStyle)
                    .setDeletedItemStyle(deletedStyle)
                    .setChangedItemStyle(changedStyle)
                    .build();

            final Path resultPath = comparer.compare(resultStream, compareOptions);
        }
    }
}

進階選項可調整字體粗細、大小、背景透明度、邊框樣式與刪除線行為。

如何在比較報告中設定 Java 紙張大小

Comparer 是負責文件比較的主要類別。以來源活頁簿建立 Comparer 實例,設定 CompareOptions 物件,並使用 setPaperSize 指定欲使用的 PaperSize 列舉值。此單一設定即決定產生 PDF 的頁面尺寸,確保列印時不需手動縮放。

import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.options.CompareOptions;
import com.groupdocs.comparison.options.enums.PaperSize;

public class SetOutputPaperSizeExample {
    public static void main(String[] args) throws Exception {
        String outputFileName = "YOUR_OUTPUT_DIRECTORY/SetOutputPaperSize_result.docx";

        try (OutputStream resultStream = new FileOutputStream(outputFileName);
             Comparer comparer = new Comparer("YOUR_DOCUMENT_DIRECTORY/source_word.docx")) {

            comparer.add("YOUR_DOCUMENT_DIRECTORY/target1_word.docx");

            // Set the paper size to A6
            CompareOptions compareOptions = new CompareOptions.Builder()
                    .setPaperSize(PaperSize.A6)
                    .build();

            final Path resultPath = comparer.compare(resultStream, compareOptions);
        }
    }
}

您亦可結合自訂邊距與方向旗標,產出符合組織文件提交規範的版面,確保每次皆呈現專業外觀。

常見問題與故障排除

大型文件的記憶體管理

問題: 比較超過 50 MB 的檔案時拋出 OutOfMemoryError。
解決方案: 增加 JVM heap (-Xmx8g) 並啟用串流模式。

# Increase heap size for large document processing
java -Xmx4g -XX:MaxMetaspaceSize=512m YourComparisonApp

處理損毀或受密碼保護的檔案

當 API 遇到未提供密碼的加密文件時,會拋出 PasswordRequiredException。

問題: 鎖定文件的比較失敗。
預防措施: 在建構 Comparer 時提供密碼,並捕捉 PasswordRequiredException。

// Check document accessibility before comparison
try {
    Comparer comparer = new Comparer(sourceFile, "password123");
    // Document loaded successfully, proceed with comparison
} catch (PasswordRequiredException ex) {
    // Handle password‑protected documents
    log.error("Document requires password: " + sourceFile);
} catch (CorruptedFileException ex) {
    // Handle corrupted files gracefully
    log.error("File corruption detected: " + sourceFile);
}

批次處理的效能最佳化

挑戰: 高效處理 100+ 組文件對。
解決方案: 使用固定大小的執行緒池,將每個比較作業提交為獨立任務。

ExecutorService executor = Executors.newFixedThreadPool(4);
List<Future<ComparisonResult>> futures = new ArrayList<>();

for (DocumentPair pair : documentPairs) {
    futures.add(executor.submit(() -> compareDocuments(pair)));
}

// Wait for all comparisons to complete
for (Future<ComparisonResult> future : futures) {
    ComparisonResult result = future.get();
    // Process results
}
executor.shutdown();

特定格式問題

  • 掃描版 PDF: 比較前先執行 OCR 前處理。
  • Word 文件: 停用現有的「追蹤修訂」功能,以免產生誤報。
  • 內嵌物件: 先抽取並分別比較,以確保準確性。

最佳實踐與效能技巧

1. 文件前處理

在比較前剝除不必要的中繼資料並統一字型,可提升速度與準確度。

// Example preprocessing workflow
public void preprocessDocument(String filePath) {
    // Remove comments and tracked changes
    // Standardize formatting
    // Extract text‑only version for pure content comparison
}

2. 最佳化設定檔案

為每種文件類型(法律、行銷、技術)建立可重複使用的 CompareOptions 預設,於整個流程中共用。

public class ComparisonProfiles {
    public static CompareOptions getLegalDocumentProfile() {
        return new CompareOptions.Builder()
                .setSensitivityOfComparison(95)
                .setHeaderFootersComparison(false)
                .setShowRevisions(true)
                .build();
    }
    
    public static CompareOptions getMarketingContentProfile() {
        return new CompareOptions.Builder()
                .setSensitivityOfComparison(45)
                .setIgnoreFormatting(true)
                .setFocusOnContent(true)
                .build();
    }
}

3. 強健的錯誤處理與日誌記錄

ComparisonException 代表比較過程中發生失敗,並提供詳細診斷資訊。將比較呼叫包在 try‑catch 區塊,記錄 ComparisonException 細節,必要時回退至安全預設。

public ComparisonResult safeCompareDocuments(String source, String target) {
    try {
        return performComparison(source, target);
    } catch (Exception ex) {
        logger.error("Comparison failed for {} vs {}: {}", source, target, ex.getMessage());
        return ComparisonResult.failure(ex.getMessage());
    }
}

4. 快取與智慧重用

  • 為相同檔案對快取 diff 結果。
  • 儲存文件指紋(雜湊值)以跳過未變更的檔案。
  • 使用非同步佇列處理非關鍵比較,保持 UI 響應。

真實情境整合案例

情境 1:自動合約審查流程

@Service
public class ContractReviewService {
    
    public void processContractRevision(String originalContract, String revisedContract) {
        CompareOptions legalOptions = ComparisonProfiles.getLegalDocumentProfile();
        
        try (Comparer comparer = new Comparer(originalContract)) {
            comparer.add(revisedContract);
            Path result = comparer.compare(generateOutputPath(), legalOptions);
            
            // Send comparison report to legal team
            emailService.sendComparisonReport(result, legalTeamEmails);
            
            // Log changes for audit trail
            auditService.logDocumentChanges(extractChanges(result));
        }
    }
}

情境 2:內容管理系統整合

@RestController
public class DocumentComparisonController {
    
    @PostMapping("/api/documents/compare")
    public ResponseEntity<ComparisonReport> compareDocuments(
            @RequestParam("source") MultipartFile source,
            @RequestParam("target") MultipartFile target,
            @RequestParam(value = "sensitivity", defaultValue = "75") int sensitivity) {
        
        CompareOptions options = new CompareOptions.Builder()
                .setSensitivityOfComparison(sensitivity)
                .build();
                
        ComparisonReport report = documentComparisonService.compare(source, target, options);
        return ResponseEntity.ok(report);
    }
}

常見問答

Q: 在 GroupDocs for Java 中能忽略比較時的頁首與頁尾嗎?
A: 可以,在 CompareOptions 上呼叫 setHeaderFootersComparison(false)。此設定會將動態的頁首/頁尾噪音從 diff 中移除。

Q: 如何在 Java 中使用 GroupDocs 設定輸出紙張大小?
A: 在 CompareOptions 中使用 setPaperSize(PaperSize.A6)(或其他列舉值),即可產生符合指定尺寸的可列印 PDF。

Q: 能否針對不同文件類型微調比較靈敏度?
A: 當然可以。對法律合約呼叫 setSensitivityOfComparison(85),對行銷草稿則使用 setSensitivityOfComparison(45),即可控制粒度。

Q: 能自訂插入、刪除與變更文字的樣式嗎?
A: 能。為每種變更類型建立 StyleSettings 實例,設定顏色、字型或邊框後,再傳入 CompareOptions。

Q: 開始使用 GroupDocs Comparison for Java 需要哪些前置條件?
A: 您需要 JDK 8+(建議 JDK 11+),Maven 3.6+ 或 Gradle 6.0+,至少 4 GB 記憶體,以及有效的 GroupDocs 授權(提供免費試用)。

Q: 如何在 GroupDocs.Comparison 中處理受密碼保護的文件?
A: 在建立 Comparer 時將密碼作為第二個參數傳入,例如 new Comparer(sourceFile, "myPassword")。同時捕捉 PasswordRequiredException 以優雅處理錯誤。

Q: GroupDocs.Comparison for Java 支援哪些檔案格式?
A: 超過 50 種格式,包括 DOCX、PDF、XLSX、PPTX、TXT、HTML、XML,以及常見影像類型(PNG、JPEG)。API 會自動偵測格式,若需批次效能提升亦可明確指定。

結論

透過 GroupDocs.Comparison for Java,您可以自動化比較 Excel 活頁簿以及其他支援格式的繁瑣工作,達到精準、快速且一致的結果。將本指南中的程式碼片段與最佳實務套用於 CI/CD 流程、文件管理系統或自訂稽核工具,即可獲得可衡量的生產力提升。


最後更新: 2026-11-01
測試版本: GroupDocs.Comparison 25.2 for Java
作者: GroupDocs

// Use streaming for memory efficiency
try (Comparer comparer = new Comparer(sourceStream)) {
    // Process in chunks for very large documents
    CompareOptions options = new CompareOptions.Builder()
            .setMemoryOptimization(true) // Enable memory optimization
            .build();
}

相關教學