프로젝트

[SpringBoot Excel] 엑셀 다운로드 공통 서비스 가이드

nineDeveloper 2020. 6. 20.
728x90

엑셀 다운로드 공통 서비스 가이드

필수 셋팅

엑셀 다운로드시 추가 설정 사항을 적용하여 엑셀 다운로드를 할 수 있다

옵션 설정

옵션설정을 하지 않으면 모두 default 값으로 설정 된다
header, fileName 은 설정을 해주는 것이 좋다

설정가능한 옵션

  • title: 엑셀 제목 (default: 제목없음)
  • header: 엑셀 헤더 (default: 조회된 컬럼명으로 헤더를 자동 생성함)
  • fileName: 엑셀 파일명 (default: export.xlsx)
  • columnWidth: 엑셀 컬럼 기본간격 설정값 엑셀 간격 폭을 넓힐때 설정 (default: 3000)
  • style: 기본적인 테두리 설정과 font 설정이 추가된다 다운로드시 속도가 저하된다 (default: false)
  • autoSize: 자동으로 컬럼을 리사이징 한다 (default: false)
package com.iparking.component.excel.domain;

import lombok.*;

/**
 * 엑셀 다운로드 확장 도메인
 * Created by KMS on 04/09/2019.
 */
@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
@ToString
public class ReqExcelDownload {
    /* 엑셀 제목 */
    private String title;
    /* 엑셀 Header */
    private String[] header = new String[]{};
    /* 엑셀 fileName */
    private String fileName;
    /* 엑셀 컬럼 사이즈(지정하지 않으면 기본 사이즈(3000)가 지정된다) */
    private Integer columnWidth;

    /* 스타일 여부 기본 false */
    private boolean style = false;
    /* 오토 컬럼 리사이징 사용 여부 기본 false */
    private boolean autoSize = false;

    @Builder
    public ReqExcelDownload(String title, String[] header, String fileName, Integer columnWidth, boolean style, boolean autoSize) {
        this.title = title;
        this.header = header;
        this.fileName = fileName;
        this.columnWidth = columnWidth;
        this.style = style;
        this.autoSize = autoSize;
    }
}

사용법

엑셀 다운로드 서비스 사용시 엑셀 다운로드를 사용할 서비스에서 ExcelService 를 의존성을 주입 받고
download 메서드만 호출해서 List<Object> 또는 List<Map> 원하는 형태의 매개변수를 전달하여 사용

  • 엑셀 다운로드 서비스의 리턴 타입은 ModelAndView로 설정
  • headerfileName을 설정하고 excelService.download 를 호출

null 데이터 처리

조회된 데이터가 null 인 경우 빈 excel 파일을 export.xlsx로 리턴해주므로 별도의 null 처리를 할 필요가 없다

@Service
@RequiredArgsConstructor
public class ContractService {

    private final ContractRepository dao ;

    private final ExcelService excelService;

    public ModelAndView getAllianceParkExcel(ReqAlliancePark reqAlliancePark, Paging paging) {
        // 검색 조건으로 데이터 전체 검색
        List<AllianceParkDto> contractList = dao.contractList(reqAlliancePark, paging);

        return excelService.download(contractList,
                ReqExcelDownload.builder()
                .header(new String[]{"식별키", "프로젝트코드", "주차장계약명", "주차장수", "지역", "표준계약여부", "운영사", "영업담당자", "정산담당자", "계약일", "오픈일", "출고상태", "수정자", "수정일"})
                .fileName("제휴주차장리스트_"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))
                .build()
        );
    }
}

ExcelService

공통 엑셀 다운로드 서비스는 향상된 SXSSF 방식으로 엑셀 다운로드 서비스를 제공한다
별도의 flush 설정은 하지 않고 기본값을 사용한다

안정성: 30만건의 데이터까지 테스트 완료

SXSSF : XSSF의 Streaming Version으로 메모리를 적게 사용하여 대용량 엑셀 다운로드에 주로 사용되는 방식

SXSSF 방식 -> 생성자 방식에서의 기본 flush 크기는 100 이며, -1 지정시 무제한이다. 쓰기전용이며 읽기는 불가능하다

공통 엑셀 다운로드 서비스는 ObjectMap 형태를 모두 지원한다
엑셀 다운로드 서비스 사용시 엑셀 다운로드를 사용할 서비스에서 ExcelService 를 의존성을 주입 받고 download 메서드만 호출해서
List<Object> 또는 List<Map> 원하는 형태의 매개변수를 전달하여 사용하면 된다

소스코드

package com.iparking.component.excel.service;


import com.iparking.component.excel.domain.ReqExcelDownload;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.ModelAndView;

import java.util.List;

import static com.iparking.component.excel.constant.ExcelConstant.EXCEL_XLSX_STREAMING_VIEW;

/**
 * Created by KMS on 09/09/2019.
 * 엑셀 서비스
 */
@Slf4j
@Service
public class ExcelService {

    final ExcelConverter excelConverter;

    public ExcelService(ExcelConverter excelConverter) {
        this.excelConverter = excelConverter;
    }

    /**
     * 엑셀 다운로드 서비스
     * Map 이나 객체 형태로 받아서 엑셀 파일로 만들어 리턴함
     * 엑셀 다운로드 서비스를 이용하기 위해서 요청 파라메터는
     * @param list
     * @param <T>
     * @return
     */
    public <T> ModelAndView download(List<T> list) {

        return new ModelAndView(EXCEL_XLSX_STREAMING_VIEW, excelConverter.convertList(list));

    }

    /**
     * 엑셀 다운로드 서비스
     * Map 이나 객체 형태로 받아서 엑셀 파일로 만들어 리턴함
     * 엑셀 다운로드 서비스를 이용하기 위해서 요청 파라메터는
     * ReqExcelDownload 엑셀 객체 파라메터로 전달해야함
     * @param list
     * @param <T> 엑셀 변환 데이터
     * @param <E extends ReqExcelDownload> 엑셀 파라메터
     * @return
     */
    public <T, E extends ReqExcelDownload> ModelAndView download(List<T> list, E req) {

        return new ModelAndView(EXCEL_XLSX_STREAMING_VIEW, excelConverter.convertList(list, req));

    }
}
728x90

댓글

💲 추천 글