Spring Boot 기준으로 build.gradle에 poi를 추가해줍니다.

implementation 'org.apache.poi:poi:5.2.3'
implementation 'org.apache.poi:poi-ooxml:5.2.3'

 

 

그 후, Excel 관련 컨트롤러를 생성

생성 된 컨트롤러에서 가져올 데이터를 paraMap으로 조회 후 rstMap에 담고

리스트 형식으로 컬럼을 넣을 경우 map에 순서 및 컬럼명을 입력해준다.

@GetMapping(value = "/excel/getTestExcel  ")
    public ModelAndView getStudentExcel (HttpServletRequest req, HttpServletResponse resp) throws Exception {

        Map<String, Object> paraMap = getParam(req);
        Map<String, Object> rstMap = new HashMap<>();

        String fileName = URLEncoder.encode("학생_명부"", "UTF-8") + ".xlsx";
        resp.setHeader("Content-disposition", "attachment; filename=" + fileName);

        testService.getTestInfo(paraMap, rstMap);
       
        // 순서 및 컬럼이름
        Map<String, Object> map = new LinkedHashMap<>();
        map.put("student_id", "학번");
        map.put("student_year", "학년");
        map.put("student_name", "이름");
        map.put("student_sex", "성별");
        map.put("student_specialty", "전공");
       
        rstMap.put("column", map);
        rstMap.put("sheetTitle", "학생 명부");

        return new ModelAndView(new StudentExcelView(), "rstMap", rstMap);
    }

 

위 내용을 입력 하고 하단 부분의 StudentExcelView를 호출

public class StudentExcelView extends AbstractExcelPOIView {

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @Override
    protected Workbook createWorkbook() {
        return new XSSFWorkbook();
    }

    @Override
    protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String, Object> rstMap = (Map<String, Object>) model.get("rstMap");
        Sheet sheet;
       
        if (rstMap.get("sheetTitle") != null) {
            sheet = workbook.createSheet(rstMap.get("sheetTitle").toString());
        } else {
            sheet = workbook.createSheet("");
        }

        Row row = null;
        Cell cell = null;
        int r = 0;
        int c = 0;

        // create header cells
        row = sheet.createRow(r++);

        // column title
        Map<String, Object> column = (Map<String, Object>) rstMap.get("column");
        for (String key : column.keySet()) {
            cell = row.createCell(c++);
            cell.setCellStyle(styleOfBoardFillFontRedBold14);
            cell.setCellValue(column.get(key).toString());
        }
        sheet.setColumnWidth(0, 1000);

        // row data
        List<Map<String, Object>> list = (List<Map<String, Object>>) rstMap.get("list");
        for (int i = 0; i < list.size(); i++) {
            row = sheet.createRow(r++);
            c = 0;

            Map<String, Object> map = list.get(i);
            for (String key : column.keySet()) {
                cell = row.createCell(c++);
                cell.setCellStyle(styleOfBoardFontBlack11);
                if (!CommonUtil.isEmpty(map.get(key))) {
                    cell.setCellValue(map.get(key).toString());
                } else {
                    cell.setCellValue("");
                }
            }
            sheet.autoSizeColumn(i, true);
        }

        row = sheet.createRow(r++);
    }
}

 

위와 같은 방식으로 작업하면 아래 표 처럼 엑셀이 완성된다

위 소스로 다운로드 되는 엑셀 화면

 

※ 추가적인 내용으로 엑셀 양식을 만들다보면 병합해야하는 경우가 생긴다.

그럴때는 아래 와 같은 소스를 sheet에 추가해주면 된다.

// 가로 병합
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); // 열시작, 열종료, 행시작, 행종료
// 세로 병합
sheet.addMergedRegion(new CellRangeAddress(1, 4, 1, 1)); // 열시작, 열종료, 행시작, 행종료

 

셀 사이즈를 조절하는 방식은 아래의 방식으로 하면 된다

// i는 몇번째 셀인지, 5000은 사이즈
sheet.setColumnWidth(i, 5000);