[Spring / 스프링] 엑셀 파일 다운로드 구현 | AbstractXlsView

엑셀 파일 다운로드를 구현하기 위해서는 직접 커스텀 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());
    }
}
반응형

댓글

Designed by JB FACTORY