spring excel csv download 하기 / super-csv jar 사용하기 / AbstractView
2017. 6. 30. 16:31ㆍframework/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<String, String>> sampleList = new ArrayList<Map<String, String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put("article_seq", "1");
map1.put("title", "제목1");
map1.put("contents", "내용1");
Map<String, String> map2 = new HashMap<String, String>();
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만건을 다운받더라도 속도가 매우 빠름
'framework > spring' 카테고리의 다른 글
SPRING @Async를 활용한 multi thread 구현 - 5 - 구현 (12) | 2017.07.11 |
---|---|
SPRING @Async를 활용한 multi thread 구현 - 4 - ExceptionHandler 생성 (0) | 2017.07.11 |
SPRING @Async를 활용한 multi thread 구현 - 3 - @Async 사용 및 Task 추가 (0) | 2017.07.11 |
SPRING @Async를 활용한 multi thread 구현 - 2 - AsyncConfigurer 생성 (0) | 2017.07.11 |
SPRING @Async를 활용한 multi thread 구현 - 1 - 개요 (0) | 2017.07.11 |
Security 로그인 후 이전페이지 가기 | spring (4) | 2016.01.05 |
특정 JAVA , JSP 에서 Bean 객체 가져오기 | spring (0) | 2016.01.05 |
메일 보내기 / mail sample | spring (0) | 2016.01.05 |
vo list / form list / @ModelAttribute list / list로 받기 | spring (0) | 2016.01.05 |
@ResponseBody / ajax / 아작스 / messageConverters | spring (0) | 2016.01.05 |