[Apache POI] Apache POI 시작하기

smiler·2022년 12월 6일
0

Apache POI

목록 보기
1/4
post-thumbnail

이 글에는 개인적인 문제 해결과정이 같이 있습니다.

개요

  프로젝트를 진행하면서 업체 솔루션 없이 클라이언트에 Excel을 다운로드하는 기능이 필요했습니다. 요구사항은 크게 다음과 같습니다.

  1. 클라이언트는 요청한 조건에 따라 DB의 SELECT문을 통해 값을 가져와야 합니다.
    1 .1. DB는 고객사 DB입니다.

  2. 요청한 Excel의 Template에 맞춰 데이터가 들어가야 합니다.
    2 .1. Template은 정형화 되있습니다.
    2 .2. Template은 30가지 이상이며, 유지보수과정에서 증가할 수 있습니다.

  3. 다운로드 한 파일은 개인정보 및 금융정보가 포함되어 있으므로, 사용자는 다운로드시 암호입력을 필수로 하고, 해당 파일은 설정된 암호를 요구합니다.

  Java에서 Excel을 생성할 수 있는 라이브러리를 찾아본 결과, 안정성 측면에서 Apache POI를 사용하기로 했습니다.


1. Apache POI 분석

Apache POIApache Software Foundation(아파치 소프트웨어 재단)에서 운영하는 프로젝트이며 워드, 파워포인트, 엑셀과 같은 Microsoft Office 포맷을 읽고 쓰기위한 Java 라이브러리 입니다. - Wikipedia

Apache POIHSSF, XSSF 두가지 방식이 있습니다.

HSSF : MS 97~2003을 지원.
XSSF : MS 2007 이상을 지원.

다시 XSSFXSSF와 향상된 성능의 SXSSF가 있습니다.

XSSF : 읽기, 쓰기가 가능하지만, 데이터 처리시 Memory Flush가 불가능.
SXSSF : 데이터 처리시 Memory를 flush할 수 있지만, 읽기가 불가능.

  위와 같은 이슈가 있기 때문에, 요구사항을 해결하기 위해서 XSSF, SXSSF 방식을 혼용해서 사용 예정입니다.


2. Apache POI 시작하기

2.1. Dependency 추가

저는 Maven을 사용할 예정입니다.

22.12.07 기준 최신버전을 가져왔습니다.
엑셀 암호화 시 오류가 있어서 구버전을 사용하겠습니다.

https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

2.2. JSP 생성

  웹에서 클라이언트가 Excel 다운로드를 요청한다고 가정해보겠습니다. 웹 화면에 버튼하나를 만들고, 요청을 보내겠습니다.

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
</head>
<body>
    <form action="http://localhost:8080/download">
        <p>
            <input type="submit" value="download">
        </p>
    </form>
</body>
</html>

2.3. Controller 생성

  download 버튼을 누르면 Controller/download로 요청을 보내서 클라이언트에 Excel 파일을 다운로드 시키겠습니다.

  클라이언트의 요청 및 응답을 처리하기위해 HttpServletRequestHttpServletResponse를 받겠습니다.

ExcelController.java

package com.example.poitest.controller;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.IOException;

@Controller
public class ExcelController {

    @RequestMapping("download")
    public void create(HttpServletRequest request, HttpServletResponse response) 
    														throws IOException {
        
    }

}

0개의 댓글