내 블로그 목록

2018년 8월 1일 수요일

[SpringFramework] Java에서 Excel 파일 생성하기기

[해야할 목록]



 (0)pom.xml에 apache.poi 라이브러리 설치. 
(1)InternalResourceViewResolver Bean 등록(servlet-context.xml)
(2)ViewResolver Bean 등록(servlet-context.xml)
(3)사용하고자 하는 빈 객체(Model) 생성 - PageRank.java
(4)Controller 생성
(5)Custom View 생성
(6)Custom View의 Bean 등록(servlet-context.xml)



(0)pom.xml에 apache.poi 라이브러리 설치. 

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>

</dependency>





(1)InternalResourceViewResolver Bean 등록(servlet-context.xml)
(2)ViewResolver Bean 등록(servlet-context.xml)


이때 충돌이 나면 오류가 발생하기 때문에 p:order로 우선순위를 정해준다.
p:order를 사용하기 위해서는 Namespaces에서 p를 체크해야 함을 잊지말자.




1
2
3
4
5
6
7
8
9
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
   <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">
       <beans:property name="prefix" value="/WEB-INF/views/" />
       <beans:property name="suffix" value=".jsp" />
   </beans:bean>
   
   <!-- CustomView: BeannameViewResolver는 파일을 등록해놓으면 id로 찾아간다는 것. -->
   <beans:bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"
   p:order="1" />







(3)사용하고자 하는 빈 객체(Model) 생성 - PageRank.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
package com.bitcampi.mvc0802;
public class PageRank {
   private int rank;
   private String page;
   public PageRank() {
   }
   public PageRank(int rank, String page) {
       super();
       this.rank = rank;
       this.page = page;
   }
   public int getRank() {
       return rank;
   }
   public void setRank(int rank) {
       this.rank = rank;
   }
   public String getPage() {
       return page;
   }
   public void setPage(String page) {
       this.page = page;
   }
   @Override
   public String toString() {
       return "PageRank [rank=" + rank + ", page=" + page + "]";
   }
}





(4)Controller 생성 [PageRankXlsController.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
package com.bitcampi.mvc0802;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class PageRankXlsController {
   
   @RequestMapping("/pageRanks/xls")
   public ModelAndView getXlsPage() {
       List<PageRank> pageRanks = new ArrayList<PageRank>();
       
       //데이터는 여기서 넣어서 전송함
       pageRanks.add(new PageRank(1, "www.naver.com"));
       pageRanks.add(new PageRank(2, "www.daum.com"));
       pageRanks.add(new PageRank(3, "www.nate.com"));
       
       return new ModelAndView("pageRanks", "pageRanks", pageRanks);
   }
}






(5)Custom View 생성


CustomView는 AbstractExcelView/AbstractXlsView를 상속해야한다는 것을 명심하자


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
package com.bitcampi.mvc0802;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;
@SuppressWarnings("deprecation")
public class PageRanksXlsView extends AbstractExcelView {
   @Override
   protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request,
           HttpServletResponse response) throws Exception {
       //1. Sheet를 생성.
       HSSFSheet sheet = createFirstSheet(workbook);
       
       //2. 시트의 첫번째 행의 라벨 작성
       createColumnLabel(sheet);
       
       List<PageRank> pageRanks = (List<PageRank>)model.get("pageRanks");
       
       //3. 데이터들을 넣을 행과 셀 생성
       int rowNum = 1;
       /*int rowNum += 1;*/
       for(PageRank rank : pageRanks) {
           createPageRankRow(sheet, rank, rowNum++);
       }
   }
   
   // 데이터들을 넣을 행과 셀을 생성한 뒤, 데이터 넣기.
   private void createPageRankRow(HSSFSheet sheet, PageRank rank, int rowNum) {
       // rowNum 번째 줄 생성
       HSSFRow row = sheet.createRow(rowNum);
       
       // rowNum번째 줄의 첫번째 칸에 데이터 넣기
       HSSFCell cell = row.createCell(0);
       cell.setCellValue(rank.getRank());
       
       //rowNum번째 줄의 두번째 칸에 데이터 넣기
       cell = row.createCell(1);
       cell.setCellValue(rank.getPage());
       
   }
   
   // 컬럼 라벨 생성(제목 지정)
   private void createColumnLabel(HSSFSheet sheet) {
       //첫번째 줄 생성
       HSSFRow firstRow = sheet.createRow(0);
       
       //첫번째 줄의 첫번째 칸 생성 및 이름지정
       HSSFCell cell = firstRow.createCell(0);
       cell.setCellValue("순위");
       
       //첫번째 줄의 두번째 칸 생성 및 이름 지정
       cell = firstRow.createCell(1);
       cell.setCellValue("페이지 주소");
   }
   
   //Sheet를 만드는 메서드
   private HSSFSheet createFirstSheet(HSSFWorkbook workbook) {
       
       HSSFSheet sheet = workbook.createSheet();
       workbook.setSheetName(0, "포털 사이트 순위");
       sheet.setColumnWidth(1, 256*20);
       return sheet;
       
   }
   
   
   
}





(6)servlet-context.xml에서 Custom View의 Bean 등록(servlet-context.xml)

1
2
<!-- xls 파일 넘기기 -->
   <beans:bean id="pageRanks" class="com.bitcampi.mvc0802.PageRanksXlsView"/>


이때 bean의 id는 Controller에서 return 했던 ModelAndView의 첫번째 칸의 이름과 같게 해줘야 한다.





결과)



Excel 파일을 열어보면 다음 사진과 같다.

댓글 없음:

댓글 쓰기