반응형
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 코드 구현
- 파일 A.xlsx, B.xlsx을 엶
- B.xlsx의
"GOOD"
시트를 읽어옴 - A.xlsx의
"GOOD"
시트를 지우고 B.xlsx의"GOOD"
시트를 복사 - 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. 코드 설명
- 파일 읽기:
FileInputStream
으로A.xlsx
,B.xlsx
을 연다. - 시트 삭제: A.xlsx에
"GOOD"
시트가 있다면 삭제한다. - 새 시트 생성:
A.xlsx
에"GOOD"
시트를 새로 만든다. - 시트 복사:
copySheet()
함수를 사용해B.xlsx
의"GOOD"
내용을A.xlsx
로 복사한다. - 파일 저장:
FileOutputStream
을 사용해 변경된A.xlsx
을 저장한다.
4. 실행 결과
A.xlsx의 "GOOD"
시트가 B.xlsx의 "GOOD"
시트 내용으로 덮어씌워진다.
📌 주의사항
- A.xlsx와 B.xlsx가 존재해야 한다.
- 두 파일이 열려 있으면 저장이 실패할 수 있으므로, Excel에서 닫아둬야 한다.
이제 실행하면 원하는 동작이 수행될 거야! 🚀
반응형
'개발 > JAVA' 카테고리의 다른 글
Map의 다양한 출력 방법 (0) | 2025.02.12 |
---|---|
Java에서 사용되는 연산자의 종류와 사용법 완벽 가이드 (0) | 2025.01.26 |
Java에서 형변환(Casting)의 모든 것: 기본형부터 참조형까지 (1) | 2025.01.26 |
Java의 `extends`와 `implements` 이해하기: 상속과 인터페이스 완벽 가이드 (1) | 2025.01.25 |
Java 로그 설정과 사용법 완벽 가이드: 안정적인 로깅 시스템 구축하기 (0) | 2025.01.25 |