Java에서 GroupDocs 문서 비교 API를 사용하여 Excel 파일을 비교하는 방법

많은 기업에서는 재무 보고서 변경 사항을 파악하고, 데이터 수정 감사를 수행하거나 마이그레이션 결과를 검증하기 위해 Java에서 Excel 파일을 비교해야 합니다. 두 워크북을 수동으로 열어 셀 단위로 스캔하는 것은 오류가 발생하기 쉽고 귀중한 시간을 낭비합니다. 이 튜토리얼에서는 GroupDocs.Comparison for Java를 사용하여 Excel 워크북을 프로그래밍 방식으로 비교하는 방법을 정확히 보여주며, 몇 초 만에 픽셀 단위의 정확한 차이 보고서를 제공합니다.

빠른 답변

  • GroupDocs가 Java에서 Excel 파일을 비교할 수 있나요? 예 – Comparer 클래스로 .xlsx 파일을 로드하고 compare를 호출하면 됩니다.
  • 헤더/푸터를 무시하려면? CompareOptions에서 setHeaderFootersComparison(false)를 설정합니다.
  • 대용량 PDF는 어떻게 처리하나요? JVM 힙을 늘리고, 스트리밍 모드를 활성화하며, 메모리 최적화 옵션을 사용합니다.
  • 비밀번호로 보호된 PDF를 비교할 수 있나요? Comparer를 생성할 때 비밀번호를 제공하면 됩니다.
  • 하이라이트 색상을 변경할 방법이 있나요? 삽입, 삭제, 변경된 항목에 대해 StyleSettings를 사용합니다.

Java에서 Excel 파일을 비교한다는 것은?

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");

팁: 라이선스 파일을 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 객체를 구성한 뒤, 원하는 PaperSize 열거형 값을 사용해 setPaperSize를 호출합니다. 이 단일 설정으로 생성된 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 힙을 늘리고 (-Xmx8g) 스트리밍 모드를 활성화합니다.

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

손상되거나 비밀번호로 보호된 파일 처리

PasswordRequiredException은 API가 제공된 비밀번호 없이 암호화된 문서를 만나면 발생합니다.

문제: 잠긴 문서에서 비교가 실패합니다.
예방: 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 문서: 잘못된 diff를 방지하려면 기존 “Track Changes”를 비활성화합니다.
  • 내장 객체: 정확성을 위해 별도로 추출하여 비교합니다.

모범 사례 및 성능 팁

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: GroupDocs를 사용해 Java에서 출력 용지 크기를 설정하려면 어떻게 해야 하나요?
A: CompareOptions에서 setPaperSize(PaperSize.A6)(또는 다른 열거형 값)를 사용합니다. 이렇게 하면 선택한 크기의 인쇄 준비된 PDF가 생성됩니다.

Q: 문서 유형별로 비교 민감도를 미세 조정할 수 있나요?
A: 물론입니다. 법률 계약에는 setSensitivityOfComparison(85), 마케팅 초안에는 setSensitivityOfComparison(45)를 호출해 세밀함을 제어합니다.

Q: 비교 중에 삽입, 삭제, 변경된 텍스트의 스타일을 맞춤화할 수 있나요?
A: 예. 각 변경 유형에 대해 StyleSettings 인스턴스를 생성하고 색상, 글꼴 또는 테두리를 지정한 뒤 CompareOptions에 전달합니다.

Q: Java에서 GroupDocs Comparison을 시작하기 위한 전제 조건은 무엇인가요?
A: JDK 8+ (JDK 11+ 권장), Maven 3.6+ 또는 Gradle 6.0+, 최소 4 GB RAM, 그리고 유효한 GroupDocs 라이선스(무료 체험 가능)가 필요합니다.

Q: GroupDocs.Comparison에서 비밀번호로 보호된 문서를 어떻게 처리하나요?
A: Comparer를 생성할 때 두 번째 인수로 비밀번호를 전달합니다: new Comparer(sourceFile, "myPassword"). 오류를 부드럽게 처리하려면 PasswordRequiredException을 잡습니다.

Q: GroupDocs.Comparison for Java가 지원하는 파일 형식은 무엇인가요?
A: DOCX, PDF, XLSX, PPTX, TXT, HTML, XML 및 일반 이미지 유형(PNG, JPEG) 등을 포함해 50개 이상의 형식을 지원합니다. 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();
}

관련 튜토리얼