IT/JAVA

JAVA 엑셀 파일 다운로드

하루콩콩 2023. 10. 11. 10:55
반응형

excelControllerexcelService 클래스를 사용하여 엑셀 파일을 생성하고 다운로드 한다.

 

1. Controller

클라이언트 요청을 처리하고 엑셀 파일 다운로드를 처리한다.

    // 엑셀 파일 다운로드
    @RequestMapping("/DownloadExcel")
    public ResponseEntity<ByteArrayResource> DownloadExcel (@RequestBody HashMap<String, Object> map) throws Exception {
        List<HashMap<String, Object>> HeaderList = mapper.convertValue(map.get("Header"),
                new TypeReference<List<HashMap<String, Object>>>() {
                });
        List<HashMap<String, Object>> DataList = mapper.convertValue(map.get("Data"),
                new TypeReference<List<HashMap<String, Object>>>() {
                });

        // 엑셀파일을 생성한다.
        ByteArrayOutputStream byteStream = excelService.ExcelOut(HeaderList, DataList);
        ByteArrayResource resource = new ByteArrayResource(byteStream.toByteArray());
        String FileName = ConvStr("ExcelOutput.xlsx"); // 파일명 한글깨짐 방지 처리

        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + FileName)
                .contentType(new MediaType("application", "vnd.ms-excel")) //
                .contentLength(byteStream.size()) //
                .body(resource);
    }

    // 파일명 한글깨짐 방지 
    private String ConvStr(String str) {

        // 파일명 한글깨짐 방지
        try {

            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                if (c > '~') {
                    sb.append(URLEncoder.encode("" + c, "UTF-8"));
                } else {
                    sb.append(c);
                }
            }
            String encodedFilename = sb.toString();

            return encodedFilename;
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }

        return "";

    }
 

 

2. Service 

service는 엑셀 파일을 생성하는 작업을 수행한다.

    // 엑셀파일 정보를 반환.
    public ByteArrayOutputStream ExcelOut(List<HashMap<String, Object>> HeaderList,
            List<HashMap<String, Object>> DataList) throws Exception {

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        SXSSFWorkbook workbook = new SXSSFWorkbook(); // 워크북 생성

        Sheet sheet = workbook.createSheet("Sheet1"); // 시트 생성

        SheetInput(sheet, HeaderList, DataList);

        workbook.write(out);
        out.close();
        workbook.close();

        return out;
    }

    // 엑셀 생성
    private void SheetInput(Sheet sheet, List<HashMap<String, Object>> HeaderList,
            List<HashMap<String, Object>> datas) {

        int rowNum = 0;

        Row Header_row = sheet.createRow(rowNum++); // 해더 생성
        int Header_cellNum = 0;
        for (Map<String, Object> HeadItem : HeaderList) {

            Cell cell = Header_row.createCell(Header_cellNum++);
            cell.setCellValue(HeadItem.get("text").toString());
        }
        // 해더 생성 끝

        // 데이터를 한개씩 조회해서 한개의 행으로 만든다.
        for (Map<String, Object> data : datas) {
            // row 생성
            Row row = sheet.createRow(rowNum++);

            int cellNum = 0;
            for (Map<String, Object> HeadItem : HeaderList) {

                Cell cell = row.createCell(cellNum++);

                String HeaderKey = HeadItem.get("value").toString();
                String HeaderType = "";
                if (HeadItem.containsKey("type")) {
                    HeaderType = HeadItem.get("type").toString();

                }

                if (data.containsKey(HeaderKey)) {

                    if (CommonUtil.isNullOrEmpty(HeaderType)) {

                        if (data.get(HeaderKey) instanceof String) {

                            cell.setCellValue((String) data.get(HeaderKey));

                        } else if (data.get(HeaderKey) instanceof Integer) {

                            cell.setCellValue((Integer) data.get(HeaderKey));
 
                        } else if (data.get(HeaderKey) instanceof Double) {
 
                            cell.setCellValue((Double) data.get(HeaderKey));
 
                        } else {
 
                            cell.setCellValue(data.get(HeaderKey).toString());
                        }
                    } else {
                        if (HeaderType.equals("Double")) {
 
                            String temp = data.get(HeaderKey).toString();
                            cell.setCellValue(Double.valueOf(temp));

                        } else {
                            cell.setCellValue(data.get(HeaderKey).toString());
                        }
                    }

                } else {
                    cell.setCellValue("");
                }

            }
        }

위의 코드를 사용하여 엑셀 파일 다운로드 기능을 구현할 수 있다. 클라이언트가 /excel/download 엔드포인트로 POST 요청을 보내면 엑셀 파일이 생성되어 다운로드된다. 코드를 사용할 때 필요에 따라 예외 처리 및 보안 검토를 추가해야 한다.

반응형