본문 바로가기

IT/JAVA

[JAVA] POI Excel 다운로드 기능 만들기

apache poi 라이브러리를 이용해서 자바, 또는 웹상에서 Excel 파일 다운로드 기능을 만들어 보겠습니다.

1. poi란?

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

출처 : https://ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_POI

 

2. poi 사용 예제

1) poi library 추가 (maven)

        <!-- xls 전용 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.0.0</version>
        </dependency>

        <!-- xlsx 전용 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
        </dependency>
용도에 맞게 pom.xml에 해당 라이브러리를 추가해주세요.

 

2) ExcelUtil (File, HttpServletResponse)

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class ExcelUtil {

    private int rowNum = 0;
    
    //File로 만들 경우
    public void createExcelToFile(List<Map<String, Object>> datas, String filepath) throws FileNotFoundException, IOException {
        //workbook = new HSSFWorkbook(); // 엑셀 97 ~ 2003
        //workbook = new XSSFWorkbook(); // 엑셀 2007 버전 이상

        Workbook workbook = new SXSSFWorkbook(); // 성능 개선 버전
        Sheet sheet = workbook.createSheet("데이터");

        rowNum = 0;

        createExcel(sheet, datas);

        FileOutputStream fos = new FileOutputStream(new File(filepath));
        workbook.write(fos);
        workbook.close();

    }
    
    //HttpServletResponse 경우
    public void createExcelToResponse(List<Map<String, Object>> datas, String filename, HttpServletResponse response) throws IOException {
        Workbook workbook = new SXSSFWorkbook(); // 성능 개선 버전
        Sheet sheet = workbook.createSheet("데이터");

        rowNum = 0;

        createExcel(sheet, datas);
        
        // 컨텐츠 타입과 파일명 지정
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", String.format("attachment;filename=%s.xlsx", filename));
        
        workbook.write(response.getOutputStream());
        workbook.close();
    }

    //엑셀 생성
    private void createExcel(Sheet sheet, List<Map<String, Object>> datas) {
    
        //데이터를 한개씩 조회해서 한개의 행으로 만든다.
        for (Map<String, Object> data : datas) {
            //row 생성
            Row row = sheet.createRow(rowNum++);
            int cellNum = 0;
            
            //map에 있는 데이터를 한개씩 조회해서 열을 생성한다.
            for (String key : data.keySet()) {
                //cell 생성
                Cell cell = row.createCell(cellNum++);
               	
                //cell에 데이터 삽입
                cell.setCellValue(data.get(key).toString());
            }
        }
    }

}

 

3) File 생성인 경우

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        List<Map<String, Object>> datas = new ArrayList<>();

        Map<String, Object> data1 = new HashMap<>();
        data1.put("id", 1);
        data1.put("name", "kim");

        Map<String, Object> data2 = new HashMap<>();
        data2.put("id", 2);
        data2.put("name", "park");
        
        datas.add(data1);
        datas.add(data2);

        ExcelUtil excelUtil = new ExcelUtil3();

        String filepath = "D:/data.xlsx";
        excelUtil.createExcelToFile(datas, filepath);
    }

}

 

4) HttpServletResponse에 write 할 경우

    @GetMapping(value = "/excelDownload")
    public void excelDownload(
            HttpServletResponse response
    ) {
        List<Map<String, Object>> datas = new ArrayList<>();

        Map<String, Object> data1 = new HashMap<>();
        data1.put("id", 1);
        data1.put("name", "kim");

        Map<String, Object> data2 = new HashMap<>();
        data2.put("id", 2);
        data2.put("name", "park");

        datas.add(data1);
        datas.add(data2);

        ExcelUtil excelUtil = new ExcelUtil();

        excelUtil.createExcelToResponse(
                datas,
                String.format("%s-%s", "data", LocalDate.now().toString()),
                response
        );
    }