개발자's Life

[JAVA] POI 라이브러리 이용하여 셀 서식 지정하기 본문

Back-end/Java

[JAVA] POI 라이브러리 이용하여 셀 서식 지정하기

Rowen Jobs 2023. 5. 30. 23:56
728x90
반응형

안녕하세요, 회사 개선사항으로 숫자 형태의 서식으로 바로 다운로드 가능하게 요청이 들어와서 처리 하였습니다.

 

엑셀에서 셀 입력 시 숫자 서식으로 지정하게 되면 자동으로 1000 단위에 콤마를 찍어줍니다. 

 

제가 구현한 다운로드 기능은 따로 숫자 서식을 지정해주지 않은 부분이 있어 추가 요청사항으로 들어왔습니다. 

 

아래 코드로 간단하게 구현 하겠습니다. 


	@Override
	public void excelDown(HttpServletRequest req, HttpServletResponse res, BudgetDtlModel budgetDtl) {
		
        // 엑셀 생성
		XSSFWorkbook wb = new XSSFWorkbook();
        // 엑셀 sheet 생성
		XSSFSheet sheet = wb.createSheet("sheet 명");


		Row row = null;
		Cell cell = null;

		// 셀 스타일 지정 -> 여기서 셀 서식 지정이 가능합니다.
        // XSSFCellStyle 타입 생성
        XSSFCellStyle cellStyle = wb.createCellStyle();
        // 셀 포멧 타입 지정
        XSSFDataFormat format = wb.createDataFormat();
        // 셀 정렬(우측정렬)
		cellStyle.setAlignment(CellStyle.ALIGN_RIGHT);
        // 셀 중앙정렬
		cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
        // 셀 왼쪽 테두리 
		cellStyle.setBorderLeft((short)1);
        // 셀 아래 테두리
		cellStyle.setBorderBottom((short)1);
        // 셀 위 테두리
		cellStyle.setBorderTop((short)1);
        // 셀 오른쪽 테두리
		cellStyle.setBorderRight((short)1);
        // 셀 배경 아래와 같이 사용해야 적용이 가능
		cellStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);
		cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        // 셀 서식 지정
		cellStyle.setDataFormat(format.getFormat("#,##0"));
        
        // 각자 셀 길이 지정
		sheet.setColumnWidth(0, 3500);
		sheet.setColumnWidth(1, 3500);
		sheet.setColumnWidth(2, 10000);
		sheet.setColumnWidth(3, 12000);
		sheet.setColumnWidth(4, 5000);
		sheet.setColumnWidth(5, 6000);
		sheet.setColumnWidth(6, 6000);
		sheet.setColumnWidth(7, 15000);
		sheet.setColumnWidth(8, 3500);
		sheet.setColumnWidth(9, 3500);
		sheet.setColumnWidth(10, 3500);
		sheet.setColumnWidth(11, 4500);

		// 헤더 명 선언 (일부러 숫자로 했습니다.)
		String header[] =
            {
                "0",
                "112",
                "1112",
                "2221",
                "3332",
                "3333",
                "33345",
                "2312",
                "53423",
                "23423",
                "34123",
                "25324"
            };

        // 행 생성
		row = sheet.createRow(0);
        // 행 높이 지정
		row.setHeight((short) 600);
        // 위 선언한 행 반복문 하여 Cell Header 셋팅
		for(int i=0; i< header.length; i++) {
			cell = row.createCell(i);
			cell = row.getCell(i);
			cell.setCellValue(header[i]);
			cell.setCellStyle(cellStyle); // 위 선언한 Cell Style 적용
		}
        
        // 파일 이름 지정
        String filenameTemp = "엑셀파일.xlsx";
		String filename = null;
        
        // 한글 엑셀 파일이름일 경우 깨짐 방지하기 위해 아래와 같이 인코딩 작업을 진행
		try {
			filename = new String(filenameTemp.getBytes(StandardCharsets.UTF_8),"8859_1");
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e);
		}
		
        // 아래는 다운로드 하는 코드이고 wb 를 닫음으로 코드가 마무리 됩니다. 
		try {
			res.setContentType("ms-vnd/excel");
			res.setHeader("Content-Disposition", "attachment;filename="+filename);

			wb.write(res.getOutputStream());
			wb.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

위 주석 참고하시면서 코드 작성하시면 어려움 없이 진행 가능합니다.

 

틀린부분이나 보완할 부분 있다면 댓글로 알려주세요!

 

감사합니다

 

Rowen

728x90
Comments