본문 바로가기
programming language/Java

Java_ 엑셀 파일 시트별로 병합하기

by Lcoding 2024. 11. 18.
반응형
안녕하세요,
오늘은 Java에서 여러개의 엑셀파일을 시트별로 구분하여 하나로 합치는 작업을 진행해보겠습니다.

 

Java에서 3개의 Excel 파일을 하나의 Excel 파일로 합치고, 각각의 파일을 1, 2, 3번 시트로 추가하려면,

Apache POI 라이브러리를 사용하는 것이 일반적입니다. 다음은 구현 방법에 대한 설명과 샘플 코드입니다.

1. 필요한 라이브러리

  • Apache POI 라이브러리
    • poi
    • poi-ooxml

Maven 프로젝트에서는 아래 의존성을 pom.xml에 추가합니다.

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

 

2. 구현 단계

  1. 각 Excel 파일의 데이터를 읽어옵니다.
  2. 새 Excel 파일을 생성하고 각 파일의 데이터를 새로운 시트에 추가합니다.
  3. 최종적으로 합친 파일을 저장합니다.
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class MergeExcelFiles {
    public static void main(String[] args) {
        // 엑셀 파일 경로로 가져오는 경우
        String[] inputFiles = {
                "file1.xlsx",
                "file2.xlsx",
                "file3.xlsx"
        };
        // 엑셀 파일 경로로 가져오는 경우 - END
        
        // 빈 파일 생성하는 경우
        File file1 = new File();
        File file2 = new File();
        File file3 = new File();
        
        File[] inputFiles2 = {file1,file2,file3};
        // 빈 파일 생성하는 경우 - END
        
        //ExcelUtil.toExcelFile()을 구현하였고, 쿼리로 list를 바로 받아오는 경우
        //메서드 설명 - ExcelUtil.toExcelFile(List<?> dataList, Class<?> voClass, String group, String[] headers, String fileName)
        List<dataVo1> list1 = mapper.selectDataListQuery1();
        String fileName1="시트1.xlsx";
        File file1 = ExcelUtil.toExcelFile(list1,dataVo.class,"",null,fileName1)
        
        List<dataVo2> list2 = mapper.selectDataListQuery2();
        String fileName2="시트2.xlsx";
        File file2 = ExcelUtil.toExcelFile(list2,dataVo2.class,"",null,fileName2)
        
        List<dataVo3> list3 = mapper.selectDataListQuery3();
        String fileName3="시트3.xlsx";
        File file3 = ExcelUtil.toExcelFile(list3,dataVo3.class,"",null,fileName3)
        
        File[] inputFiles3 = {file1,file2,file3};
        //ExcelUtil.toExcelFile()을 구현하였고, 쿼리로 list를 바로 받아오는 경우 - END
        

        // 결과 파일 경로
        String outputFile = "merged.xlsx";
        String[] sheetNames = {"1번시트","2번시트","3번시트"};
        File lastFile = new File(outputFile);

        try (XSSFWorkbook mergedWorkbook = new XSSFWorkbook()) {
            for (int i = 0; i < inputFiles.length; i++) {
                try (FileInputStream fis = new FileInputStream(inputFiles[i]);
                     XSSFWorkbook workbook = new XSSFWorkbook(fis)) {

                    // 첫 번째 시트 가져오기
                    XSSFSheet sheet = workbook.getSheetAt(0);

                    // 새 시트를 추가
                    XSSFSheet newSheet = mergedWorkbook.createSheet(sheetNames[i]);

                    // 데이터 복사
                    copySheet(sheet, newSheet);
                }
            }

            // 합친 파일 저장
            try (FileOutputStream fos = new FileOutputStream(outputFile)) {
                mergedWorkbook.write(fos);
            }

            System.out.println("Excel 파일이 성공적으로 병합되었습니다: " + outputFile);

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

    // 시트 데이터를 복사하는 메서드
    private static void copySheet(Sheet source, Sheet target) {
        for (int i = 0; i <= source.getLastRowNum(); i++) {
            Row sourceRow = source.getRow(i);
            Row targetRow = target.createRow(i);

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

                    if (sourceCell != null) {
                        // 셀 값 복사
                        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;
                            default:
                                targetCell.setCellValue(sourceCell.toString());
                                break;
                        }
                    }
                }
            }
        }
    }
}

 

4. 코드 설명

  • copySheet 메서드: 한 시트의 데이터를 다른 시트로 복사합니다.
  • mergedWorkbook.createSheet: 새로운 시트를 생성하고 이름을 지정합니다.
  • try-with-resources: 파일 스트림과 워크북을 자동으로 닫도록 처리합니다.

5. 실행 결과

merged.xlsx 파일에 각각의 Excel 파일이 1번시트,2번시트,3번시트로 추가됩니다.

6. 주의 사항

  • 파일 경로는 적절히 수정해야 합니다.
  • 시트 이름이 중복되지 않도록 설정해야 합니다.
  • 데이터가 많은 경우 성능을 고려하여 최적화가 필요할 수 있습니다.

 

 

 

반응형

# 로딩 화면 동작 코드(Code) 설정하기
loading