기본 콘텐츠로 건너뛰기

Java 실무: Apache POI로 Excel 데이터 수정 및 업무 자동화 구현하기

JAVA / AUTOMATION

Java 실무: Apache POI로 Excel 데이터 수정 및 업무 자동화 구현하기

Java 환경에서 Apache POI 라이브러리를 활용해 기존 Excel 파일을 읽고, 특정 셀 데이터를 안전하게 수정한 뒤 저장하는 전체 프로세스와 핵심 객체 구조를 상세히 알아봅니다.

1. Apache POI 라이브러리 의존성 설정

Java 애플리케이션에서 Excel 파일을 프로그래밍 방식으로 제어하기 위해서는 Apache POI 라이브러리가 필요합니다. Maven 기반 프로젝트에서는 pom.xml 파일에 아래 의존성을 추가하여 환경을 구성합니다.

이 설정은 구버전 포맷인 .xls(HSSF)와 신버전 포맷인 .xlsx(XSSF)를 모두 지원하기 위한 구성입니다.

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

2. Excel 읽기 및 수정 전체 코드 예제

로컬 스토리지에 위치한 기존 Excel 파일(22222.xls)을 로드하여 특정 좌표의 셀 데이터를 수정하고, 이를 새로운 파일로 저장하는 전체 코드입니다.

이 예제는 HSSF(Horrible Spreadsheet Format) 방식을 사용하여 레거시 Excel 파일(.xls)을 처리합니다.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

public class ExcelWrite {

    public static void main(String[] args) throws Exception {
        // 1. 파일 시스템에서 기존 Excel 파일 로드
        FileInputStream fis = new FileInputStream("C://test/22222.xls");
        POIFSFileSystem fs = new POIFSFileSystem(fis);
        HSSFWorkbook wb = new HSSFWorkbook(fs);

        // 2. 첫 번째 시트(Index 0) 접근
        Sheet sheet = wb.getSheetAt(0);
        System.out.println("Target Sheet: " + sheet.getSheetName());

        // 3. 데이터 수정: 4번째 행(idx 3), 6번째 열(idx 5)
        Row row = sheet.getRow(3);
        Cell cell = row.getCell(5);
        if (cell != null) {
            cell.setCellValue("홍길동"); // 값 변경
        }

        // 4. 데이터 수정: 4번째 행, 11번째 열
        cell = row.getCell(10);
        if (cell != null) {
            cell.setCellValue("555555");
        }

        // 5. 데이터 수정: 6번째 행, 6번째 열
        row = sheet.getRow(5);
        cell = row.getCell(5);
        if (cell != null) {
            cell.setCellValue("www.google.com");
        }

        // 6. 변경된 내용을 신규 파일로 저장 (리소스 해제 필수)
        FileOutputStream fileout = new FileOutputStream("C://test/22222Save.xls");
        wb.write(fileout);
        fileout.close();
        fis.close();

        System.out.println("Excel 파일 수정 및 저장 완료!");
    }
}

3. 핵심 객체 구조 및 메서드 분석

Apache POI를 통해 Excel을 제어할 때 이해해야 할 주요 컴포넌트와 계층 구조입니다. 아래 구조를 이해하면 코드를 작성하는 순서(Workbook → Sheet → Row → Cell)를 명확히 알 수 있습니다.

  • FileInputStream / POIFSFileSystem: 물리적인 파일을 Java 스트림으로 읽어와 POI가 해석 가능한 파일 시스템 구조로 변환합니다.
  • HSSFWorkbook: Excel 파일 전체를 관장하는 워크북 객체입니다. (.xlsx 파일은 XSSFWorkbook을 사용)
  • Sheet, Row, Cell: 엑셀의 데이터 계층입니다. 반드시 Row(행) 객체를 먼저 획득한 뒤, 해당 Row 안에서 Cell(열)을 선택해야 합니다.
  • FileOutputStream: 메모리 상에서 변경된 워크북 데이터를 실제 파일로 출력(Write)하여 저장을 완료합니다.

4. 실무 활용 포인트 및 요약

Java와 Apache POI 조합은 단순 데이터 입력을 넘어 정기 리포트 자동 생성, 대량 데이터 일괄 업데이트, 레거시 데이터 마이그레이션 등 다양한 업무 자동화에 활용됩니다.

💡 Tip: 실무 코드 작성 시에는 NullPointerException 방지를 위해 getRow()getCell() 호출 결과에 대한 null 체크를 반드시 수행해야 하며, 셀의 데이터 타입(String, Numeric, Formula 등)에 맞는 적절한 메서드를 사용하는 것이 안정성을 높이는 핵심입니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...