如何在 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(視覺比較)
進階功能包括受密碼保護文件的處理、多語言偵測、依文件類型自訂靈敏度、批次處理,以及雲端與本地部署選項。
前置條件與設定
系統需求
- Java Development Kit (JDK): 8 或以上(建議 JDK 11+)
- 建置工具: Maven 3.6+ 或 Gradle 6.0+
- 記憶體: 大檔案最低 4 GB RAM
- 儲存空間: 至少 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>
授權設定
開發與測試用
- 免費試用: 從 GroupDocs Downloads 下載 – 產出會加上浮水印。
- 臨時授權: 透過 GroupDocs Support 取得 30 天完整存取權。
正式環境
- 正式授權: 前往 GroupDocs Purchase 購買,享有無限制的商業使用權。
在應用程式啟動時初始化授權:
// 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();
}