[Spring / 스프링] 엑셀 파일 다운로드 구현 | AbstractXlsView
- WEB
- 2021. 8. 9.
엑셀 파일 다운로드를 구현하기 위해서는 직접 커스텀 View Class를 구현해야 한다. 스프링에서 제공하는 AbstractXlsView
클래스를 사용하면 된다.
Apache POI 라이브러리를 pom.xml에 추가해서 사용해야 한다. 이 라이브러리는 MS 오피스 파일 포맷을 자바 언어로 읽고 쓰는 기능을 제공한다.
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
Controller 클래스에선 리스트 객체를 만들고 엑셀을 구성하는 값을 저장해 ModelAndView 객체로 return 한다.
PageRanksController.java
@Controller
public class PageRanksController {
@RequestMapping("요청url")
public ModelAndView handleRequestInternal() {
List<PageRank> pageRanks = new ArrayList<PageRank>();
pageRanks.add(new PageRank(1, "data"));
pageRanks.add(new PageRank(2, "data"));
pageRanks.add(new PageRank(3, "data"));
return new ModelAndView("pageRanks", "pageRanks", pageRanks);
// ("pageRanks", "pageRanks", pageRanks)
// viewName, modelName, modelObject
}
}
데이터를 저장할 PageRank 타입의 dto 클래스도 필요하다.
PageRank.java
public class PageRank {
private int rank;
private String page;
public PageRank() {
}
public PageRank(int rank, String page) {
this.rank = rank;
this.page = page;
}
public int getRank() {
return rank;
}
public String getPage() {
return page;
}
}
view 클래스에서는 엑셀 데이터의 형식을 설정한다. AbstractXlsView 클래스를 상속받는다. 엑셀 문서를 XLS 포맷으로 보기 위해 필요한 클래스다.
PageRanksView.java
public class PageRanksView 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=\"엑셀파일명.xls\";");
Sheet sheet = createFirstSheet(workbook);
createColumnLabel(sheet);
List<PageRank> pageRanks = (List<PageRank>) model.get("pageRanks");
// ModelAndView 객체에서 PageRank 꺼내옴
int rowNum = 1;
for (PageRank rank : pageRanks) {
createPageRankRow(sheet, rank, rowNum++);
}
}
private Sheet createFirstSheet(Workbook workbook) {
Sheet sheet = workbook.createSheet();
workbook.setSheetName(0, "sheet명");
sheet.setColumnWidth(1, 256 * 20);
// 2번째(첫번째 인덱스) 컬럼 크기가 20글자라는 의미
//setColumnWidth(Column Index, width size)
// 한글자 크기가 256. 256
return sheet;
}
private void createColumnLabel(Sheet sheet) {
Row firstRow = sheet.createRow(0);
Cell cell = firstRow.createCell(0);
cell.setCellValue("A열 컬럼명");
cell = firstRow.createCell(1);
cell.setCellValue("B열 컬럼명");
}
private void createPageRankRow(Sheet sheet, PageRank rank, int rowNum) {
Row row = sheet.createRow(rowNum);
Cell cell = row.createCell(0);
cell.setCellValue(rank.getRank());
cell = row.createCell(1);
cell.setCellValue(rank.getPage());
}
}
반응형
'WEB' 카테고리의 다른 글
[JavaScript] var대신 let을 쓰는 이유 | 기능 차이 (0) | 2021.08.10 |
---|---|
[WEB] HTTP란 | GET·POST 차이 | 프로토콜 구조 (0) | 2021.08.10 |
[Spring / 스프링] 파일 다운로드 구현 | AbstractView | ApplicationContextAware (0) | 2021.08.09 |
[Spring / 스프링] MVC 패턴 작동 순서 | 처리 과정 (0) | 2021.08.06 |
[Spring / 스프링] DI | @Component @Controller @Service @Repository 차이 (0) | 2021.08.04 |