2014년 3월 11일 화요일

Spring AbstractExcelView를 이용한 엑셀파일 생성 및 다운로드(Spring + Jakarta POI)

  • 130903

#AbstractExcelView를 이용한 엑셀파일 생성 및 다운로드

엑셀파일 뷰를 생성하는방법으로 여러가지 방법이 있지만, 여기서는 컨트롤러의 메서드에서 String 타입의 뷰 이름을 리턴하고, BeanNameViewResolver를 사용하여 뷰를 생성하는 방법으로 구현하였다. 

#스프링 설정파일 dispatcher-servlet.xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
                    p:prefix="/WEB-INF/view/"
                    p:suffix=".jsp"
                    p:order="2"/>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="1"/>
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
             <property name="order" value="0"/>
             <property name="defaultErrorView" value="error"/>
             <property name="exceptionMappings">
                    <props>
                           <prop key="RuntimeException">error</prop>
                    </props>
             </property>
</bean>
<bean name="excelView" class="board.model.ExcelView"/>
세개의 ViewResolver를 설정하였고, 위에서부터 일반 JSP파일의 요청을 받아들이는 InternalResourceViewResolver, 두번째는 뷰 이름과 동일한 빈객체를 뷰 객체로 사용하는 BeanNameViewResolver로 여기서 구현하는 엑셀파일 다운로드요청을 받게 된다, 세번째는 애러페이지를 담당하는 ViewResolver 이다.  마지막에 설정되어있는 excelView는 엑셀파일을 생성하는 클래스이며 excelView라는 이름의 뷰 요청이 들어올때 사용된다.

#다운로드 요청
/excel_transform_controller?target=article
/excel_transform_controller?target=comment
/excel_transform_controller?target=file
각각 컨트롤러로 요청되는 주소이며, target 파라미터의 값에따라, 게시글 목록, 댓글 목록, 파일 목록을 엑셀파일로 생성하게된다.

#Controller.java
//엑셀파일 변환  다운로드
@RequestMapping("/excel_transform_controller")
public String excelTransform(@RequestParam String target, Map<String,Object> ModelMap) throws Exception{
List<Object> excelList= null;
      excelList = service.getAllObjects(target);
            
   ModelMap.put("excelList", excelList);
      ModelMap.put("target", target);
      return "excelView";
}
들어온 요청의 파라미터값 target에 따라 게시글목록, 댓글목록, 파일목록을 불러오게 되며, 불러온 List객체를 excelList 프로퍼티에 저장후 ModelMap 객체에 추가한다.
여기서 ModelMap객체에 추가된 항목들은 Response 응답에 추가되어 뷰에 추가되어 전달된다. 모든 엑셀파일 생성이 이루어지면 excelView 라는 뷰 이름을 리턴하고 스프링 설정파일에서는 BeanNameViewResolver가 excelView 빈 객체를 실행하게 된다.

#ServiceImpl.java
@Override
public List<Object> getAllObjects(String target){
       if(target.equals("article")) return dao.getAllArticles();
       if(target.equals("comment")) return dao.getAllComments();
       if(target.equals("file")) return dao.getAllFiles();
       return null;
}
컨트롤러에서 ModelMap에 추가한 target의 값에 따라 서비스단에서 필요한 목록을 가져와 리턴한다.

#excelView.java
package board.model;

import java.net.URLEncoder;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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;

public class ExcelView extends AbstractExcelView{
       @Override
       protected void buildExcelDocument(Map<String,Object> ModelMap,HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception{
             String excelName = ModelMap.get("target").toString();
             HSSFSheet worksheet = null;
             HSSFRow row = null;
             if(excelName.equals("article")){
                    excelName=URLEncoder.encode("게시글","UTF-8");
                    worksheet = workbook.createSheet(excelName+ " WorkSheet");
                    @SuppressWarnings("unchecked")
                    List<BoardArticle> list = (List<BoardArticle>)ModelMap.get("excelList");
                    row = worksheet.createRow(0);
                    row.createCell(0).setCellValue("글번호");
                    row.createCell(1).setCellValue("제목");
                    row.createCell(2).setCellValue("날짜");
                    row. createCell(3).setCellValue("글쓴이");
                    row.createCell(4).setCellValue("비밀번호");
                    row.createCell(5).setCellValue("내용");
                    for(int i=1;i<list.size()+1;i++){
                           row = worksheet.createRow(i);
                           row.createCell(0).setCellValue(list.get(i-1).getArticleNo());
                           row.createCell(1).setCellValue(list.get(i-1).getArticleTitle());
                           row.createCell(2).setCellValue(list.get(i-1).getArticleDate());
                           row.createCell(3).setCellValue(list.get(i-1).getArticleWriter());
                           row.createCell(4).setCellValue(list.get(i-1).getArticlePw());
                           row.createCell(5).setCellValue(list.get(i-1).getArticleContent());
                    }
             }
             if(excelName.equals("comment")){
                    @SuppressWarnings("unchecked")
                    List<BoardComment> list = (List<BoardComment>)ModelMap.get("excelList");
                    excelName=URLEncoder.encode("댓글","UTF-8");
                    worksheet = workbook.createSheet(excelName+ " WorkSheet");
                    row = worksheet.createRow(0);
                    row.createCell(0).setCellValue("댓글번호");
                    row.createCell(1).setCellValue("게시글번호");
                    row.createCell(2).setCellValue("날짜");
                    row.createCell(3).setCellValue("글쓴이");
                    row.createCell(4).setCellValue("비밀번호");
                    row.createCell(5).setCellValue("내용");
                    for(int i=1;i<list.size()+1;i++){
                           row = worksheet.createRow(i);
                           row.createCell(0).setCellValue(list.get(i-1).getCommentNo());
                           row.createCell(1).setCellValue(list.get(i-1).getArticleNo());
                           row.createCell(2).setCellValue(list.get(i-1).getCommentDate());
                           row.createCell(3).setCellValue(list.get(i-1).getCommentWriter());
                           row.createCell(4).setCellValue(list.get(i-1).getCommentPw());
                           row.createCell(5).setCellValue(list.get(i-1).getCommentContent());
                    }
             }
             if(excelName.equals("file")){
                    @SuppressWarnings("unchecked")
                    List<BoardFile> list = (List<BoardFile>)ModelMap.get("excelList");
                    excelName=URLEncoder.encode("파일","UTF-8");
                    worksheet = workbook.createSheet(excelName+ " WorkSheet");
                    row = worksheet.createRow(0);
                    row.createCell(0).setCellValue("파일번호");
                    row.createCell(1).setCellValue("게시글번호");
                    row.createCell(2).setCellValue("파일경로");
                    row.createCell(3).setCellValue("파일이름");
                    row.createCell(4).setCellValue("파일크기");
                    for(int i=1;i<list.size()+1;i++){
                           row = worksheet.createRow(i);
                           row.createCell(0).setCellValue(list.get(i-1).getFileNo());
                           row.createCell(1).setCellValue(list.get(i-1).getArticleNo());
                           row.createCell(2).setCellValue(list.get(i-1).getFilePath());
                           row.createCell(3).setCellValue(list.get(i-1).getFileName());
                           row.createCell(4).setCellValue(list.get(i-1).getFileSize());
                    }
             }
             response.setContentType("Application/Msexcel");
             response.setHeader("Content-Disposition", "ATTachment; Filename="+excelName+"-excel");
       }
}
매우 단순한 엑셀파일을 생성하는 코드이다. 단지 컬럼명과 데이터만 엑셀파일로 생성하였다. 여기서는 다운로드를 구현하였기때문에 response 객체에 몇가지 설정을 추가하였다.

#생성된 엑셀파일(게시글)


댓글 없음:

댓글 쓰기