Apache POI

Date:     Updated:

카테고리:

태그:

프로그램을 만들다 보면 데이터를 엑셀로 다운받아서 보고 싶은 경우가 생기는데, 이때 Apache POI를 사용하면 쉽게 엑셀로 데이터를 다운로드 받을 수 있다.

Apache POI (Poor Obfuscation Implementation)란

Apache POI는 아파치 소프트웨어 재단에서 만든 라이브러리로서
마이크로소프트 오피스 파일 포맷을 순수 자바 언어로서 읽고 쓰는 기능을 제공한다.

JDK 호환성

참고: https://poi.apache.org/devel/ .

  • POI 4.0 and later require JDK version 1.8 or later.
  • POI 3.11 and later 3.x versions require JDK version 1.6 or later.
  • POI 3.5 to 3.10 required the JDK version 1.5 or later. Versions prior to 3.5 required JDK 1.4+.

    java 11 버전을 쓰는 나는 POI 4.0 이상의 버전을 사용할 것이다.

Apache POI 라이브러리 적용

maven Repository(https://mvnrepository.com/artifact/org.apache.poi/poi)에 방문해서 poi를 검색해서 나온 결과를 보면 아래와 같다.
image

최신 버전 중 다운로드가 많은 5.0.x를 들어가서 Maven 혹은 Gradle에 넣을 소스를 복사하여 붙혀 넣는다.

image

나는 Gradle로 쓰니 이렇게 추가해주겠다.

// build.gradle
// https://mvnrepository.com/artifact/org.apache.poi/poi
implementation group: 'org.apache.poi', name: 'poi', version: '5.0.0'

POI를 활용하여 xls 파일 만들기

1. Excel을 만들 Controller 생성

먼저 Exceldownload를 호출할 Controller를 만들고 url을 생성한다.
그리고 엑셀에 들어갈 데이터를 임시로 만들자.

2. Excel과 Sheet, Header 생성

다음으로 엑셀파일을 만들기 위해 WorkBook을 생성하고 Sheet의 이름을 셋팅한다.
저는 학생부 명단을 만들기로 했으니 학생부 명단이라고 Sheet 이름을 설정

다음으로 엑셀의 한 줄을 넣게 위해 Row라는 자료형을 선언하고 만들어둔 sheet에 하나의 row를 추가한다.
이때 createRow 안에는 row의 순서를 의미하는 int 자료형이 들어갑니다. 0번부터 시작이므로 0을 넣어준다.
다음으로 생성한 Row에 Cell을 만들어서 값을 입력한다.

3. 데이터 입력

미리 생성해둔 데이터를 한 Row씩 생성하면서 아래와 같이 입력한다.

4. Excel 형식 및 이름 정하고 다운

이제 마지막으로 응답 컨텐츠와 헤더를 정해 준다. 그러고나서는 response의 OutputStream에 workbook을 write 해준다.
response에 바로 응답을 하면 에러가 생겼을 경우 대응하기가 어렵기 때문에 좋은 코드의 방식은 아니지만 일단 이해를 위해 최대한 간단한 코드로 작성 했다.

헤더에는 한글이 들어갈 수 없기 때문에 header를 통해 파일명을 지정해주는 방식으로는 한글 파일명을 사용할 수 없습니다.

@Controller
public class excelTest {
    @GetMapping("/downloadExcel")
    public void downloadExcel(HttpServletResponse response) throws IOException {
        // 엑셀에 들어갈 데이터 생성
        product[] list = {
                new product(2022111501L, "노트북", 2000000),
                new product(2022111502L, "마우스", 130000),
                new product(2022111503L, "키보드", 230000),
                new product(2022111504L, "모니터", 820000)

        };

        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("상품 리스트");
        int rowNo = 0;

        Row headerRow = sheet.createRow(rowNo++);
        headerRow.createCell(0).setCellValue("번호");
        headerRow.createCell(1).setCellValue("제품명");
        headerRow.createCell(2).setCellValue("금액");

        for (product s : list) {
            Row row = sheet.createRow(rowNo++);
            row.createCell(0).setCellValue(s.getProductId());
            row.createCell(1).setCellValue(s.getName());
            row.createCell(2).setCellValue(s.getAmount());
        }

        response.setContentType("ms-vnd/excel");
        response.setHeader("Content-Disposition", "attachment;filename=productList.xls");

        workbook.write(response.getOutputStream());
        workbook.close();

    }
}

class product {
    Long productId;
    String name;
    int amount;

    public product(Long productId, String name, int amount) {
        this.productId = productId;
        this.name = name;
        this.amount = amount;
    }

    @Override
    public String toString() {
        return "product [productId=" + productId + ", name=" + name + ", amount=" + amount + "]";
    }

    public Long getProductId() {
        return productId;
    }

    public void setProductId(Long productId) {
        this.productId = productId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAmount() {
        return amount;
    }

    public void setAmount(int amount) {
        this.amount = amount;
    }
}

5. 엑셀 다운로드 받고 확인

화면단에서 url을 호출하면 아래의 이미지처럼 엑셀이 다운로드가 된다.
image

다운 받아진 엑셀을 열어보면 아래와 같이 생성되었음을 알수있다.

image

Java 카테고리 내 다른 글 보러가기

댓글남기기