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");
}
}
#생성된 엑셀파일(게시글)
댓글 없음:
댓글 쓰기