Java에서 Excel 파일 비교 - GroupDocs 문서 비교 API
문서를 수동으로 비교하며 한 줄씩 변화를 찾는 데 몇 시간을 보낸 적이 있나요? 계약 수정 사항을 추적하거나 코드 문서를 검토하거나 재무 보고서를 위해 compare excel files java가 필요하든, 수동 문서 비교는 시간도 많이 걸리고 오류가 발생하기 쉽습니다. 이 가이드에서는 GroupDocs.Comparison for Java를 사용하여 Excel 워크북(및 다양한 다른 형식)을 빠르고 신뢰성 있게 비교하는 방법을 배웁니다.
빠른 답변
Comparer 클래스는 소스 문서를 로드하고 비교를 수행하는 핵심 구성 요소입니다.CompareOptions는 비교 실행 방식을 제어하는 구성 가능한 매개변수 집합을 제공합니다.StyleSettings를 사용하면 출력 보고서에서 삽입, 삭제 및 변경된 요소의 시각적 모습을 사용자 정의할 수 있습니다.
- GroupDocs가 Java에서 Excel 파일을 비교할 수 있나요? 예,
.xlsx파일을Comparer클래스로 로드하고compare를 호출하면 됩니다. - 머리글/바닥글을 무시하려면 어떻게 하나요?
CompareOptions에서setHeaderFootersComparison(false)를 설정합니다. - 대용량 PDF는 어떻게 처리하나요? JVM 힙을 늘리고 메모리 최적화를 활성화한 뒤 스트리밍 모드를 사용합니다.
- 암호로 보호된 PDF를 비교할 수 있나요?
Comparer를 생성할 때 비밀번호를 제공하면 됩니다. - 하이라이트 색상을 변경할 방법이 있나요? 삽입, 삭제 및 변경 항목에 대해
StyleSettings를 사용합니다.
compare excel files java란?
compare excel files java는 Java를 사용해 두 개의 Excel 워크북 간 셀 수준 차이를 프로그래밍 방식으로 감지하는 과정입니다. GroupDocs.Comparison API는 각 스프레드시트를 로드하고 모든 셀, 행, 수식을 평가한 뒤, 추가, 삭제 및 수정 사항을 명확한 시각적 형식으로 강조하는 차이 보고서를 생성합니다.
Java 문서 비교 API를 사용해야 하는 이유
자동화의 비즈니스 사례
수동 문서 비교는 단순히 지루할 뿐만 아니라 위험합니다. 연구에 따르면 사람이 수동 검토 시 중요한 변경 사항의 약 **20 %**를 놓친다고 합니다. API를 사용하면 이러한 위험을 없애고 측정 가능한 생산성 향상을 얻을 수 있습니다:
- 99.9 % 정확도 – 모든 문자 수준 변경이 포착됩니다.
- 속도 – 표준 서버에서 100페이지 PDF를 30 초 이내에 비교합니다.
- 일관성 – 모든 문서 유형에 대해 동일한 하이라이트와 보고서를 제공합니다.
- 확장성 – 수동 작업 없이 수천 개 파일을 배치 처리합니다.
문서 비교 API를 사용해야 할 때
다음 상황에서 가장 큰 효과를 얻을 수 있습니다:
- 법률 계약 검토 – 조항 수정 사항을 자동으로 표시합니다.
- 기술 문서 추적 – API 사양 릴리즈 간 정확히 무엇이 변경됐는지 확인합니다.
- 콘텐츠 자산 관리 – 마케팅 카피, 사용자 매뉴얼, 블로그 초안을 비교합니다.
- 규정 준수 감사 – 정책 업데이트가 정확히 기록되고 반영되었는지 확인합니다.
- 버전 관리 보조 – 코드가 아닌 아티팩트에 대해 사람이 읽을 수 있는 차이를 제공합니다.
지원 파일 형식 및 기능
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()으로 로드하면 배포가 편리합니다.
핵심 구현 가이드
Feature 1: 머리글 및 바닥글 비교 무시
setHeaderFoottersComparison 메서드는 머리글 및 바닥글 내용을 비교에서 제외하여 관련 없는 차이가 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 결과
- 오탐지 감소
- 해당 섹션을 건너뛰므로 비교 속도 향상
Feature 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를 선택하세요.
Feature 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
Feature 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);
}
}
}
StyleSettings의 고급 옵션을 사용하면 글꼴 두께, 크기, 배경 투명도, 테두리 스타일 및 취소선 동작까지 조정할 수 있습니다.
비교 보고서에서 Java 용지 크기 설정 방법
CompareOptions의 PaperSize 열거형을 직접 사용해 용지 크기를 지정합니다. PaperSize.A6을 원하는 상수(예: PaperSize.LETTER)로 교체하면 지역 인쇄 표준에 맞출 수 있습니다. 이렇게 하면 PDF 보고서가 수동 스케일링 없이 올바르게 인쇄됩니다. 또한 사용자 정의 여백 및 방향 플래그와 결합해 조직의 문서 제출 가이드라인에 맞는 레이아웃을 만들 수 있어 매번 전문적인 외관을 보장합니다.
일반적인 문제 및 해결 방법
대용량 문서 메모리 관리
문제: 50 MB 이상 파일을 비교할 때 OutOfMemoryError 발생.
해결책: JVM 힙을 늘리고(-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 문서: 잘못된 diff를 방지하려면 기존 “변경 내용 추적”을 비활성화합니다.
- 임베디드 객체: 정확성을 위해 별도로 추출하고 비교합니다.
모범 사례 및 성능 팁
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에서 출력 용지 크기를 어떻게 설정하나요?
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: 암호 보호된 문서는 어떻게 처리하나요?
A: Comparer를 생성할 때 두 번째 인자로 비밀번호를 전달합니다: new Comparer(sourceFile, "myPassword"). 오류를 부드럽게 처리하려면 PasswordRequiredException을 잡아야 합니다.
Q: GroupDocs.Comparison for Java가 지원하는 파일 형식은 무엇인가요?
A: DOCX, PDF, XLSX, PPTX, TXT, HTML, XML 등 50개 이상의 형식을 지원합니다. API가 자동으로 형식을 감지하지만 배치 성능을 높이려면 명시적으로 지정할 수도 있습니다.
결론
GroupDocs.Comparison for Java를 활용하면 Excel 워크북을 비롯한 모든 지원 형식을 정확하고 빠르며 일관되게 자동 비교할 수 있습니다. 이 가이드의 코드 스니펫과 모범 사례를 CI/CD 파이프라인, 문서 관리 시스템 또는 맞춤형 감사 도구에 적용해 측정 가능한 생산성 향상을 실현하세요.
마지막 업데이트: 2026-05-16
테스트 환경: 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();
}