spring excel csv download 하기 / super-csv jar 사용하기 / AbstractView

2017. 6. 30. 16:31framework/spring

spring excel csv download 하기 / super-csv jar 사용하기 / AbstractView

 

 

 

 

오늘은 spring 환경에서 AbstractView 를 활용해서 excel csv 다운로드를 구현해 본다.

 

당연히 org.springframework.web.servlet.view.BeanNameViewResolver 설정이 되어 있어야 한다.

 

csv 파일 형식은 속도에 있어서 아주 강한모습을 보인다.

 

 

개발환경은 다음과 같다.

 

spring 환경 ( 3.0 ~ 4.1 까지 상관없음)

 

super-csv 라이브러리가 필요함

다운로드 : super-csv-2.4.0.jar

 

 





 

csv 를 생성하는데 있어서 VO, Map 두가지 모두 지원한다.

 

 

controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    @RequestMapping("/sample/sampleExcelCsvDownload.do")
    public ModelAndView sampleExcelCsvDownload(HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        ModelAndView mav = new ModelAndView();
 
        List<Map<StringString>> sampleList = new ArrayList<Map<StringString>>();
        Map<StringString> map1 = new HashMap<StringString>();
        map1.put("article_seq""1");
        map1.put("title""제목1");
        map1.put("contents""내용1");
        Map<StringString> map2 = new HashMap<StringString>();
        map2.put("article_seq""2");
        map2.put("title""제목2");
        map2.put("contents""내용2");
        sampleList.add(map1);
        sampleList.add(map2);
        
        mav.addObject("columnIds""article_seq,title,contents");
        mav.addObject("columnNames""게시판순번,제목,내용");
        mav.addObject("excelDataList", sampleList);
        
        mav.setViewName("excelCsvWriteView");
        return mav;
    }
cs

6# ~ 16# : 다운받을 데이터 생성

18# : 엑셀 데이터를 꺼낼 key

19# : 엑셀 상단 헤더명

20# : 엑셀 데이터

 

dispatcher-servlet.xml
1
2
    <!-- Excel CSV Write View -->
    <bean id="excelCsvWriteView" class="framework.view.ExcelCsvWriteView" />
cs

2# : bean 등록

 

excelCsvWriteView.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package framework.view;
 
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.springframework.web.servlet.view.AbstractView;
import org.supercsv.io.CsvMapWriter;
import org.supercsv.io.ICsvMapWriter;
import org.supercsv.prefs.CsvPreference;
 
import dps.framework.util.CommonUtil;
 
public class ExcelCsvWriteView extends AbstractView {
 
    @Override
    protected void renderMergedOutputModel(Map<String, Object> modelMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
 
        response.setContentType("text/csv; charset=MS949");
        response.setHeader("Content-Disposition""attachment; filename=\"excelCsv.csv\"");
 
        excelDataPurification(modelMap, request, response);
    }
 
    /**
     * 엑셀 데이터 리스트 정제 
     *
     * @param model
     * @param wb
     * @param req
     * @param resp
     * @throws Exception
     */
    protected void excelDataPurification(Map<String, Object> modelMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
        // Map 을 사용한다면 CsvMapWriter 사용
        ICsvMapWriter csvMapWriter = new CsvMapWriter(response.getWriter(), CsvPreference.STANDARD_PREFERENCE);
 
        // VO 를 사용한다면 CsvBeanWriter 사용
        //        ICsvBeanWriter csvBeanWriter = new CsvBeanWriter(response.getWriter(), CsvPreference.STANDARD_PREFERENCE);
 
        String columnIds = (String) modelMap.get("columnIds");
        String columnNames = (String) modelMap.get("columnNames");
 
        String[] colids = columnIds.split(",");
        String[] colnms = columnNames.split(",");
 
        // 엑셀 데이터
        List<Map<String, Object>> excelDataList = (List<Map<String, Object>>) modelMap.get("excelDataList");
 
        csvMapWriter.writeHeader(colnms);
 
        if (CommonUtil.notEmpty(excelDataList)) {
            for (int i = 0; i < excelDataList.size(); i++) {
                Map<String, Object> rowData = (Map<String, Object>) excelDataList.get(i);
                csvMapWriter.write(rowData, colids);
            }
        }
        csvMapWriter.close();
    }
 
}
 
cs

16# : AbstractView 상속

19# : renderMergedOutputModel 함수 override

21# : contextType 셋팅

22# : header 셋팅

38# : CsvMapWriter 생성

41# : VO를 사용한다면 해당 라인의 주석을 해제하여 CsvBeanWriter 를 사용

52# : 해더 셋팅

57# : csv writer을 이용해서 데이터 쓰기

 





 

결과

 

 

스타일이 없어서 보기에 좋지 않을 수도 있지만 10만건을 다운받더라도 속도가 매우 빠름