반응형

1. 필요한 라이브러리

Apache POI 라이브러리를 사용해야 해. 아래 의존성을 추가해 줘.

Maven 프로젝트라면 pom.xml에 추가:

<dependencies>
    <!-- Apache POI -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version> <!-- 최신 버전 확인 필요 -->
    </dependency>
</dependencies>

Gradle 프로젝트라면 build.gradle에 추가:

dependencies {
    implementation 'org.apache.poi:poi-ooxml:5.2.3'
}

2. Java 코드 구현

  1. 파일 A.xlsx, B.xlsx을 엶
  2. B.xlsx의 "GOOD" 시트를 읽어옴
  3. A.xlsx의 "GOOD" 시트를 지우고 B.xlsx의 "GOOD" 시트를 복사
  4. A.xlsx를 저장
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.*;

public class ExcelSheetReplace {
    public static void main(String[] args) {
        String fileA = "A.xlsx";  // 대상 파일
        String fileB = "B.xlsx";  // 소스 파일
        String sheetName = "GOOD";  // 덮어쓸 시트 이름

        try (FileInputStream fisA = new FileInputStream(fileA);
             FileInputStream fisB = new FileInputStream(fileB);
             XSSFWorkbook workbookA = new XSSFWorkbook(fisA);
             XSSFWorkbook workbookB = new XSSFWorkbook(fisB)) {

            // B.xlsx에서 "GOOD" 시트를 가져옴
            XSSFSheet sheetB = workbookB.getSheet(sheetName);
            if (sheetB == null) {
                System.out.println("B.xlsx에 '" + sheetName + "' 시트가 없습니다.");
                return;
            }

            // A.xlsx에서 "GOOD" 시트 삭제 (기존 시트가 존재하면 제거)
            int sheetIndexA = workbookA.getSheetIndex(sheetName);
            if (sheetIndexA != -1) {
                workbookA.removeSheetAt(sheetIndexA);
            }

            // A.xlsx에 새로운 "GOOD" 시트 생성
            XSSFSheet sheetA = workbookA.createSheet(sheetName);

            // B.xlsx의 "GOOD" 시트 내용을 A.xlsx의 "GOOD" 시트로 복사
            copySheet(sheetB, sheetA, workbookA);

            // 변경된 A.xlsx 저장
            try (FileOutputStream fosA = new FileOutputStream(fileA)) {
                workbookA.write(fosA);
            }

            System.out.println("B.xlsx의 'GOOD' 시트가 A.xlsx의 'GOOD' 시트로 성공적으로 덮어씌워졌습니다.");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 시트 복사 함수
    private static void copySheet(XSSFSheet sourceSheet, XSSFSheet targetSheet, XSSFWorkbook targetWorkbook) {
        for (int rowIndex = 0; rowIndex <= sourceSheet.getLastRowNum(); rowIndex++) {
            Row sourceRow = sourceSheet.getRow(rowIndex);
            Row targetRow = targetSheet.createRow(rowIndex);

            if (sourceRow != null) {
                for (int colIndex = 0; colIndex < sourceRow.getLastCellNum(); colIndex++) {
                    Cell sourceCell = sourceRow.getCell(colIndex);
                    Cell targetCell = targetRow.createCell(colIndex);

                    if (sourceCell != null) {
                        copyCell(sourceCell, targetCell, targetWorkbook);
                    }
                }
            }
        }
    }

    // 셀 복사 함수
    private static void copyCell(Cell sourceCell, Cell targetCell, XSSFWorkbook workbook) {
        targetCell.setCellType(sourceCell.getCellType());

        switch (sourceCell.getCellType()) {
            case STRING:
                targetCell.setCellValue(sourceCell.getStringCellValue());
                break;
            case NUMERIC:
                targetCell.setCellValue(sourceCell.getNumericCellValue());
                break;
            case BOOLEAN:
                targetCell.setCellValue(sourceCell.getBooleanCellValue());
                break;
            case FORMULA:
                targetCell.setCellFormula(sourceCell.getCellFormula());
                break;
            case BLANK:
                targetCell.setBlank();
                break;
            default:
                break;
        }

        // 스타일 복사
        CellStyle newCellStyle = workbook.createCellStyle();
        newCellStyle.cloneStyleFrom(sourceCell.getCellStyle());
        targetCell.setCellStyle(newCellStyle);
    }
}

3. 코드 설명

  1. 파일 읽기: FileInputStream으로 A.xlsx, B.xlsx을 연다.
  2. 시트 삭제: A.xlsx에 "GOOD" 시트가 있다면 삭제한다.
  3. 새 시트 생성: A.xlsx"GOOD" 시트를 새로 만든다.
  4. 시트 복사: copySheet() 함수를 사용해 B.xlsx"GOOD" 내용을 A.xlsx로 복사한다.
  5. 파일 저장: FileOutputStream을 사용해 변경된 A.xlsx을 저장한다.

4. 실행 결과

A.xlsx의 "GOOD" 시트가 B.xlsx의 "GOOD" 시트 내용으로 덮어씌워진다.

📌 주의사항

  • A.xlsx와 B.xlsx가 존재해야 한다.
  • 두 파일이 열려 있으면 저장이 실패할 수 있으므로, Excel에서 닫아둬야 한다.

이제 실행하면 원하는 동작이 수행될 거야! 🚀

반응형

+ Recent posts