Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

kyh코딩 공부 블로그

POI 이용한 EXCEL다운로드 본문

코딩연습

POI 이용한 EXCEL다운로드

킴용현 2023. 3. 9. 09:42

poi는 엑셀만 가능하다 이걸 사용하는 이유는 엑셀을 좀 더 쉽게 컨트롤 할 수 있다.

스타일, 함수, 병합 등 자유롭게 가능하고 쓰고 읽기가 편하다.

하지만 조금 노가다가 필요하다.

나는 시트 여러개를 만들고 그 안에 값을 동일하게 주었기 때문에 반복을 사용해서 넣었지만

시트 하나만 사용할 것 같으면 시트를 하나만 생성해서 거기에 데이터를 넣어주면 된다.

//HSSFWorkbook을 생성하고
Workbook wb = new HSSFWorkbook();
//내가 넣을 데이터도 받아온다.
List<VacationVO> resultList = vacationService.listVacationExcelDown(vacationVO);
//cell에 스타일을 지정하는 부분 자신 사용할 이름으로 하나 생성해준다
CellStyle titlestyle = wb.createCellStyle();
//이거는 폰트를 지정하는 부분
Font titlefont = wb.createFont();
//이런 형식으로 스타일을 넣어준다. 폰트는 지정하고 만든 스타일에 넣어줘야한다.
//만약 다른 부분에는 다른 스타일을 적용하고 싶으면 밑에 이름과 스타일만 변경해서 하나 더 생성하면 된다.
titlefont.setFontHeightInPoints((short) 14);
titlestyle.setAlignment(CellStyle.ALIGN_CENTER);
titlestyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
titlestyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
titlestyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
titlestyle.setWrapText(true);
titlestyle.setFont(titlefont);

//시트를 여러개 만드는 부분 시트 개수는 자신이 만들고 싶은만큼 넣어주면 된다.
int sheetCnt = 5;
		//셀을 하나 만들어준다.
        Cell cell = null;
        //시트를 생성하는 부분 여러개 만들거니깐 배열로 만든다.
        Sheet[] sheet = new HSSFSheet[sheetCnt];
        for (int i= 0; i<sheetCnt; i++) {
            //시트 이름을 지정하는 부분이다 
            String sheetName = "sheet" + (i + 1);
            //시트가 생성되는 부분
            sheet[i] = wb.createSheet(sheetName);
            
            //셀을 병합하는 부분이다 숫자 순서대로 세로 0번째부터 세로 1번째까지 가로 0번째부터 가로 1번째까지 
            sheet[i].addMergedRegion(new CellRangeAddress(0, 1, 0, 1));
            
            //헤더를 만드는 부분 row를 하나 생성해서 몇 번째 로우인지를 지정
            Row row = sheet[i].createRow(0);
            //그후 셀을 생성해서 값과 스타일을 넣어준다 그러면 헤더 끝
            row.createCell(0).setCellValue("번호");
            row.getCell(0).setCellStyle(titlestyle);
            row.createCell(2).setCellValue("시설");
            row.getCell(2).setCellStyle(titlestyle);
            row.createCell(4).setCellValue("이름");
            row.getCell(4).setCellStyle(titlestyle);
            row.createCell(6).setCellValue("신청일");
            row.getCell(6).setCellStyle(titlestyle);
            row.createCell(8).setCellValue("휴가구분");
            row.getCell(8).setCellStyle(titlestyle);
            row.createCell(10).setCellValue("연락처");
            row.getCell(10).setCellStyle(titlestyle);
            row.createCell(12).setCellValue("사용기간");
            row.getCell(12).setCellStyle(titlestyle);
            row.createCell(14).setCellValue("총일수");
            row.getCell(14).setCellStyle(titlestyle);
            row.createCell(16).setCellValue("사용일수");
            row.getCell(16).setCellStyle(titlestyle);
            row.createCell(18).setCellValue("남은일수");
            row.getCell(18).setCellStyle(titlestyle);
            row.createCell(20).setCellValue("내용");
            row.getCell(20).setCellStyle(titlestyle);
            
            //이제 셀에 값을 넣어주는 부분
            for (int h = 0; h < resultList.size(); h++) {
            	//row를 만들고 몇번째부터 값을 넣을건지를 지정 나는 헤더를 1번째까지 병합했기 때문에 2부터 시작
                row = sheet[i].createRow(h + 2);
                cell = row.createCell(0);
                cell.setCellValue(resultList.get(h).getVaca_aply_id());
                cell.setCellStyle(cententStyle);
                cell = row.createCell(2);
                cell.setCellValue(resultList.get(h).getVaca_aply_id());
                cell.setCellStyle(cententStyle);
                cell = row.createCell(4);
                cell.setCellValue(resultList.get(h).getMember_name());
                cell.setCellStyle(cententStyle);
            }
           }
//excel타입으로 넣어주고   
response.setContentType("ms-vnd/excel");
//response헤더에 다운로드 형식으로 맞춰주고 파일 이름을 지정한다. 그럼 끝!
response.setHeader("Content-Disposition","attachment;filename=vacationSheetTest.xls");
wb.write(response.getOutputStream());