Spring AbstractExcelView를 이용한 엑셀파일 생성 및 다운로드(Spring + Jakarta POI)
Posted at 2013/09/03 14:54 | Posted in Framework/Spring 연습- 130903
#AbstractExcelView를 이용한 엑셀파일 생성 및 다운로드
엑셀파일 뷰를 생성하는방법으로 여러가지 방법이 있지만, 여기서는 컨트롤러의 메서드에서 String 타입의 뷰 이름을 리턴하고, BeanNameViewResolver를 사용하여 뷰를 생성하는 방법으로 구현하였다.
#스프링 설정파일 dispatcher-servlet.xml
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
<bean name="excelView" class="board.model.ExcelView"/>
세개의 ViewResolver를 설정하였고, 위에서부터 일반 JSP파일의 요청을 받아들이는 InternalResourceViewResolver, 두번째는 뷰 이름과 동일한 빈객체를 뷰 객체로 사용하는 BeanNameViewResolver로 여기서 구현하는 엑셀파일 다운로드요청을 받게 된다, 세번째는 애러페이지를 담당하는 ViewResolver 이다.  마지막에 설정되어있는 excelView는 엑셀파일을 생성하는 클래스이며 excelView라는 이름의 뷰 요청이 들어올때 사용된다.
                    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"/>
#다운로드 요청
/excel_transform_controller?target=article
/excel_transform_controller?target=comment
/excel_transform_controller?target=file
각각 컨트롤러로 요청되는 주소이며, target 파라미터의 값에따라, 게시글 목록, 댓글 목록, 파일 목록을 엑셀파일로 생성하게된다./excel_transform_controller?target=comment
/excel_transform_controller?target=file
#Controller.java
//엑셀파일 변환 및 다운로드
            
들어온 요청의 파라미터값 target에 따라 게시글목록, 댓글목록, 파일목록을 불러오게 되며, 불러온 List객체를 excelList 프로퍼티에 저장후 ModelMap 객체에 추가한다.
@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";
}여기서 ModelMap객체에 추가된 항목들은 Response 응답에 추가되어 뷰에 추가되어 전달된다. 모든 엑셀파일 생성이 이루어지면 excelView 라는 뷰 이름을 리턴하고 스프링 설정파일에서는 BeanNameViewResolver가 excelView 빈 객체를 실행하게 된다.
#ServiceImpl.java
@Override
컨트롤러에서 ModelMap에 추가한 target의 값에 따라 서비스단에서 필요한 목록을 가져와 리턴한다.
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;
}#excelView.java
package board.model;
매우 단순한 엑셀파일을 생성하는 코드이다. 단지 컬럼명과 데이터만 엑셀파일로 생성하였다. 여기서는 다운로드를 구현하였기때문에 response 객체에 몇가지 설정을 추가하였다.
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");
       }
}
#생성된 엑셀파일(게시글)

 
댓글 없음:
댓글 쓰기