[Apache POI] Spring Boot 엑셀 다운로드

2023. 1. 7. 20:46·Spring
728x90

설문조사 시스템에서 설문조사의 총 결과 데이터를 엑셀로 한눈에 볼 수 있도록 하는 기능을 추가했다.

첫 행은 설문조사의 문항, 두번째 행부터 설문조사의 답변을 조회할 수 있다.


1. pom.xml dependency 추가

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

2. application.yml 추가

spring:
  mvc:
    contentnegotiation:
    favor-parameter: true
    favor-path-extension: true
    media-types:
    xls: application/vnd.ms-excel

 

3. ExcelService 생성 및 엑셀 다운로드 함수 추가

0) 조회할 설문의 데이터(SurveyDTO), 질문과 답변 데이터를 묶은 Map(header, row)

void createExcelDownloadResponse(HttpServletResponse response, SurveyDTO surveyDTO, Map<String, Object> map)

1) Workbook 생성

Workbook workbook = new XSSFWorkbook();

2) sheet 추가

Sheet sheet = workbook.createSheet("설문조사결과");

3) 파일명 변수 선언

final String fileName = "설문결과_" + surveyDTO.getTitle();

3) 첫 줄, 헤더로 사용할 데이터

List<String> header = (List<String>) map.get("header");

Row row = sheet.createRow(0); //첫번째 행 생성
for (int i = 0; i < header.size(); i++) {
    Cell cell = row.createCell(i); // 열 생성
    cell.setCellValue(header.get(i)); // 생성된 열에 header 데이터 입력
}

4) 행 데이터 입력

List<AnswerQuestionDTO> answerList = (List<AnswerQuestionDTO>) map.get("row");
row = sheet.createRow(1);  //헤더 이후로 데이터가 출력되어야하니 +1
int rownum = 1;
for (int j = 0; j < answerList.size(); j++) {

	// 답변 데이터
    AnswerQuestionDTO answerQuestionDTO = answerList.get(j);
    
    Cell cell = null;
    cell = row.createCell(j); // 열생성
    cell.setCellValue(answerQuestionDTO.getAnsContent()); // 답변 데이터 입력
    
    if(j == header.size()-1){ // 모든 질문에 대한 답변 데이터가 입력되면
        row = sheet.createRow(rownum+1);  //헤더 이후로 데이터가 출력되어야하니 +1
   }
}

5) 엑셀 형식으로 출력, Workbook close

response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");

workbook.write(response.getOutputStream());
workbook.close();
더보기
package com.cloud.survey.service;

import com.cloud.survey.dto.answer.AnswerQuestionDTO;
import com.cloud.survey.dto.survey.SurveyDTO;
import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletResponse;
import javax.transaction.Transactional;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;


@Service
@Transactional
@RequiredArgsConstructor
public class ExcelService {

    // 엑셀 다운로드 구현
    void createExcelDownloadResponse(HttpServletResponse response, SurveyDTO surveyDTO, Map<String, Object> map) {

        try {
            Workbook workbook = new XSSFWorkbook();
            Sheet sheet = workbook.createSheet("설문조사결과");

            CellStyle numberCellStyle = workbook.createCellStyle();
            numberCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0"));

            //파일명
            final String fileName = "설문결과_" + surveyDTO.getTitle();

            //헤더
            List<String> header = (List<String>) map.get("header");
            Row row = sheet.createRow(0);
            for (int i = 0; i < header.size(); i++) {
                Cell cell = row.createCell(i);
                cell.setCellValue(header.get(i));
            }



            List<AnswerQuestionDTO> answerList = (List<AnswerQuestionDTO>) map.get("row");
            row = sheet.createRow(1);  //헤더 이후로 데이터가 출력되어야하니 +1
            int rownum = 1;

            for (int j = 0; j < answerList.size(); j++) {
                AnswerQuestionDTO answerQuestionDTO = answerList.get(j);
                Cell cell = null;
                cell = row.createCell(j);
                cell.setCellValue(answerQuestionDTO.getAnsContent());
                if(j == header.size()-1){
                    row = sheet.createRow(rownum+1);  //헤더 이후로 데이터가 출력되어야하니 +1
                }

            }

            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");

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

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

4. SurveyService에서 엑셀 다운로드 함수 호출

public void excelDownload (HttpServletResponse response, List<String> headerList, List<AnswerQuestionDTO> answerList, Integer surId){

    SurveyDTO surveyDTO = entityToDTO(surveyRepository.findBySurId(surId));

    Map<String,Object> map = new HashMap<>();
    map.put("header", headerList);
    map.put("row", answerList);

    excelService.createExcelDownloadResponse(response, surveyDTO, map);

}

5) SurveyController에서 api 생성

//엑셀 다운로드
@GetMapping(value = "/download/excel", produces = "application/vnd.ms-excel")
public void excelDownload(HttpServletResponse res, @RequestParam (value = "sur_id") Integer surId) throws UnsupportedEncodingException, ParseException {

    List<String> headerList = questionService.getSurveyQuestionContentList(surId);
    List<AnswerQuestionDTO> answerList = answerService.getAllAnswerList(surId);

   surveyService.excelDownload(res, headerList, answerList, surId);
}

 

 

 

728x90
'Spring' 카테고리의 다른 글
  • 객체지향의 설계, SOLID 원칙
  • [Redis] Spring Boot 연동, 객체 캐싱, MSA에서 사용 시 주의점 Serialize
  • [Keycloak] MSA에서 키클록 Spring Security 연동 (2) 토큰 발급, 토큰값 확인
  • [Keycloak] OAuth2 MSA에서 키클록 SSO Spring Security 연동 (1) dependency 추가, gateway/auth 서비스 설정
Karla Ko
Karla Ko
𝘾𝙤𝙣𝙩𝙞𝙣𝙪𝙤𝙪𝙨𝙡𝙮 𝙄𝙢𝙥𝙧𝙤𝙫𝙞𝙣𝙜, 𝘾𝙤𝙣𝙨𝙩𝙖𝙣𝙩𝙡𝙮 𝘿𝙚𝙫𝙚𝙡𝙤𝙥𝙞𝙣𝙜 𝙔𝙚𝙨!
    250x250
  • Karla Ko
    karlaLog
    Karla Ko
  • 전체
    오늘
    어제
    • Total (467)
      • Spring (19)
      • JPA (4)
      • Cloud & Architecture (15)
        • Kubernetes (5)
        • Docker (3)
        • MSA (2)
        • GCP (1)
        • AWS (4)
      • Devops (1)
      • Message Queue (4)
        • Kafka (2)
        • RabbitMQ (2)
      • Git (4)
      • DB (4)
      • Java (9)
      • Python (4)
      • CS (11)
        • OS (8)
        • Network (2)
        • Algorithm (1)
      • Coding Test (392)
        • programmers (156)
        • Graph (43)
        • DP (37)
        • Search (31)
        • Tree (13)
        • Data Structure (26)
        • Combination (12)
        • Implement (18)
        • Geedy (23)
        • Sort (7)
        • Math (21)
        • geometry (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    LIS
    트리
    알고리즘
    월간코드챌린지
    최소신장트리
    백준
    그래프
    구현
    그리디
    정렬
    동적계획법
    DFS
    다익스트라
    플로이드워셜
    재귀
    최대공약수
    덱
    조합
    이분탐색
    스택
    구간합
    DP
    자료구조
    최단거리
    파이썬
    BFS
    힙
    프로그래머스
    Algorithm
    큐
  • hELLO· Designed By정상우.v4.10.3
Karla Ko
[Apache POI] Spring Boot 엑셀 다운로드
상단으로

티스토리툴바