본문 바로가기
JAVA/Spring

Spring MVC - DB데이터를가져와 엑셀로 저장법

by 설총이 2018. 9. 21.


mybatis랑 연동해서 사용할 것이기때문에 web.xml부터 설정한다




[web.xml]


1
2
3
4
5
6
7
8
9
10
11
12
13
<servlet>
    <servlet-name>dispatcherNonHtml</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/mybatis.xml,/WEB-INF/dispatcherNonHtml-servlet.xml</param-value>
    </init-param>
</servlet>
 
<servlet-mapping>
    <servlet-name>dispatcherNonHtml</servlet-name>
    <url-pattern>/download/*</url-pattern>
</servlet-mapping>
cs



<param-value> 태그로 하나의 요청이 들어왔을때 dispatcher가 읽어들일 xml을 직접 명시해준다.

이번 예제같은 경우는 mybatis.xml과 dispatcherNonHtml-servlet.xml 두개를 쓰기위해 init-param태그를 썻다.


또 하나, 지금까지 url-pattern으로 요청이 들어왔을때 자동으로 servlet-name과 이름이 같은

서블릿이름-servlet.xml 을 읽어들인다고 했는데 

init-param 태그로 여러개의 xml을 설정할때에는 서블릿이름과 같은 xml도 반드시 명시해주어야한다




[dispatcherNonHtml.xml]



1
2
3
4
5
6
7
<context:annotation-config />
<context:component-scan
    base-package="login.controller,spring.view,excel.controller,excel.view,spring.jdbc,ajax.controller" />
    
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.BeanNameViewResolver" />
    
cs




내가 사용할 Controller와 Bean객체로 사용할 패키지를 전부 스캔한다.


그 후  


1
<a href = "download/addData">mybatis연동 엑셀다운로드</a><br>
cs



링크로 요청을하면 요청에 맞는 servlet이 작동한다



'/addData' 에 맞는 RequestMapping을 찾아간다.



[PageRanksController.java]



1
2
3
4
5
6
@RequestMapping("/addData")
public ModelAndView addFileData() {
    List<FileDataDTO> dataList = service.listFileData();
    return new ModelAndView("addData""dataList", dataList);
}
cs




List에 mybatis랑 연동한 데이터를 들고와서 저장한다

그것을 ModelAndView 객체에 'viewName'과 'modelname' , 데이터 로 return한다


ModelAndView로 리턴했으니 viewName을 viewResolver가 받아서 수행한다.



1
2
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.BeanNameViewResolver" />
cs



viewResolver가 BeanName이므로, view페이지에 뿌릴 내용들을 수행할 beanname을 찾아간다.


난 addData로 viewName을 보냈으니 addData라는 이름을 가진 bean객체를 찾아간다.



[PageFileView.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package excel.view;
 
@Component("addData")
public class PageFileView extends AbstractXlsView {
 
    @SuppressWarnings("unchecked")
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        response.setHeader("Content-Disposition""attachment; filename=\"fileData.xls\";");
 
        Sheet sheet = createFirstSheet(workbook);
        //시트를 만들어주는 메서드
        createColumnLabel(sheet);
        //시트의 이름과 사이즈를 지정해주는 메서드
 
        List<FileDataDTO> fileDataList = (List<FileDataDTO>) model.get("dataList");
        //모델데이터를 사용하기위해 .get modelName으로 보낸걸로 get한다.
        
        int rowNum = 1;
        
        for (FileDataDTO fileDataDTO : fileDataList) {
            createPageRankRow(sheet, fileDataDTO, rowNum++);
        //엑셀의 '셀'에 내용을 담아 만들어주는 메서드.
        /* 
         List에 있는 내용을 꺼내서 DTO에 담고  
         1. createColumnLabel() 로 실행해 첫번째 줄 행의 데이터를담고
         
         2. createPageRankRow() 를 실행할때에는 list의 길이만큼 돌리는데
         첫번째 row에서 다음 row로 이동해야하기때문에
         int rowNum = 1; 로 선언한 후에 메서드를 실행한다
            
        */
        }
    }
 
    private Sheet createFirstSheet(Workbook workbook) {
        Sheet sheet = workbook.createSheet();
        workbook.setSheetName(0"FileData");
        sheet.setColumnWidth(1256 * 20);
        return sheet;
    }
 
    private void createColumnLabel(Sheet sheet) throws IllegalAccessException, IllegalArgumentException,
            InvocationTargetException, NoSuchMethodException, SecurityException, InstantiationException {
        Row firstRow = sheet.createRow(0);
        //맨 첫번째 행과 열을 가진 셀
        //1번째 행 + A번째 열
        Cell cell = null;
        Class<FileDataDTO> empClass = FileDataDTO.class;
        Field[] fields = empClass.getDeclaredFields();
        System.out.println("fields : " + fields);
        
        
        for(int i =0; i < fields.length; i++) {
            Field f = fields[i];
            f.setAccessible(true);
            cell = firstRow.createCell(i);
            cell.setCellValue(f.getName());
            System.out.println("f.getName() : " + f.getName());
        }
/*        for (Field f : fields) {
            f.setAccessible(true);
            cell = firstRow.createCell(i++);
            cell.setCellValue(f.getName());
            System.out.println("f.getName() : " + f.getName());
        }*/
    }
 
    private void createPageRankRow(Sheet sheet, FileDataDTO fileDataDTO, int rowNum) {
        Row row = sheet.createRow(rowNum);
        
        
        Cell cell = row.createCell(0);
        cell.setCellValue(fileDataDTO.getOrig_name());
        
        cell = row.createCell(1);
        cell.setCellValue(fileDataDTO.getRegdate());
        
        cell = row.createCell(2);
        cell.setCellValue(fileDataDTO.getSno());
        
        cell = row.createCell(3);
        cell.setCellValue(fileDataDTO.getSys_name());
        
        cell = row.createCell(4);
        cell.setCellValue(fileDataDTO.getF_size());
        
    }
 
}
cs