ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 초보자도 만들 수 있는 자바로 엑셀 스타일 적용하기 (엑셀 테두리 넣기&엑셀 배경색 넣기)
    Study/Spring 2024. 2. 23. 12:03
    반응형

     

    저번 블로그에 게시판에서 엑셀을 다운로드 하는 기능에 대해서 글을 썼음(궁금하신분은 아래 링크 참조!)

     

    https://cbn1218.tistory.com/42

     

    초보자도 만들 수 있는 엑셀 다운로드 기능 만들기

    Cell headerCell0 = headerRow.createCell(0); headerCell0.setCellValue("상담상태"); Cell headerCell1 = headerRow.createCell(1); headerCell1.setCellValue("이름"); Cell headerCell2 = headerRow.createCell(2); headerCell2.setCellValue("시간"); Cell heade

    cbn1218.tistory.com

     

    이번에는 저번에 알려드리기로 했던 엑셀에 스타일을 적용하는 부분에 대해서 써볼려함.

    엑셀기능은 만들었다고 치는데, 정말 엑셀처럼 셀을 병합을 한다던지,

    셀 배경색을 채워 넣는다던지, 엑셀 테두리 선을 넣는다던지 스타일을 적용시키는 부분이 있는데,

    이걸 알고 싶은 분이 있을거 같아 글을 썼움.

    바쁜 개발자를 위해 일단은 결과 부터 보도록 하겠움

     

    1.결과

    *적용 전

     

    *적용 후

    2.설명

    저번 엑셀 기능을 만들때 아파치 poi 라이브러리를 가져와 만들었던 것처럼 스타일 적용 또한 기존에 있던 아파치 poi 라이브러리를 이용하면 만들수 있음

     

     

    (1)Controller 부분

    먼저 궁금하니 전체 코드 부터 보여 줌.

        @PostMapping("/excel.do")
        public void excel(HttpServletResponse response)throws Exception{
    		System.out.println("excel.do들어옴");
    		
    		Workbook workbook = new SXSSFWorkbook();
    		Sheet sheet = workbook.createSheet();
    		
    		
    		
            //폰트 설정
    		Font titleFont = workbook.createFont();
    		titleFont.setFontName("맑은 고딕"); // 폰트 이름
    		titleFont.setFontHeightInPoints((short) 12); // 폰트 크기
    		titleFont.setBold(true);//폰트 두께
    		
    		//타이틀 스타일 설정
    		CellStyle titleCellStyle = workbook.createCellStyle();
    		titleCellStyle.setAlignment(HorizontalAlignment.CENTER); //텍스트 정렬
    		titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); //셀 배경색 설정
    		titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 셀의 채우기 패턴
    		titleCellStyle.setFont(titleFont); //위에 설정한 폰트 스타일 적용
    		
    		
    		//셀 컨텐츠 설정
    		CellStyle contentCellStyle = workbook.createCellStyle();
    		contentCellStyle.setAlignment(HorizontalAlignment.CENTER); //텍스트 정렬
    		contentCellStyle.setBorderBottom(BorderStyle.THIN); //아래선 설정
    		contentCellStyle.setBorderLeft(BorderStyle.THIN); //왼쪽선 설정
    		contentCellStyle.setBorderRight(BorderStyle.THIN); //오른쪽선 설정
    		contentCellStyle.setBorderTop(BorderStyle.THIN); //위에선 설정
    		
    		List<userVO> excelList =service.getList2();
    		
    		Row headerRow = sheet.createRow(1);
    		Cell headerCell0 = headerRow.createCell(0);
    		headerCell0.setCellStyle(titleCellStyle);
    		headerCell0.setCellValue("상담상태");
    		
    		Cell headerCell1 = headerRow.createCell(1);
    		headerCell1.setCellStyle(titleCellStyle);
    		headerCell1.setCellValue("이름");
    
    		Cell headerCell2 = headerRow.createCell(2);
    		headerCell2.setCellStyle(titleCellStyle);
    		headerCell2.setCellValue("시간");
    
    		Cell headerCell3 = headerRow.createCell(3);
    		headerCell3.setCellStyle(titleCellStyle);
    		headerCell3.setCellValue("상품내용");
    		
    		Cell headerCell4 = headerRow.createCell(4);
    		headerCell4.setCellStyle(titleCellStyle);
    		headerCell4.setCellValue("비고");
    		
    		int rowIndex = 2;
    		for(userVO list: excelList){
    			Row bodyRow = sheet.createRow(rowIndex++);
    			
    			Cell bodyCell0 = bodyRow.createCell(0);
    			bodyCell0.setCellStyle(contentCellStyle);
    		    bodyCell0.setCellValue(list.getSTATUS());
    		    
    		    Cell bodyCell1 = bodyRow.createCell(1);
    		    bodyCell1.setCellStyle(contentCellStyle);
    		    bodyCell1.setCellValue(list.getNAME());
    		    
    		    Cell bodyCell2 = bodyRow.createCell(2);
    		    bodyCell2.setCellStyle(contentCellStyle);
    		    bodyCell2.setCellValue(list.getTIME());
    		    
    		    Cell bodyCell3 = bodyRow.createCell(3);
    		    bodyCell3.setCellStyle(contentCellStyle);
    		    bodyCell3.setCellValue(list.getCONTENT());
    		    
    		    Cell bodyCell4 = bodyRow.createCell(4);
    		    bodyCell4.setCellStyle(contentCellStyle);
    		    bodyCell4.setCellValue("내용 없음");
    		    
    		}
    		
    		response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=test.xlsx");
    		workbook.write(response.getOutputStream());
    		workbook.close();
    		
        }
        
    }

     

    코드는 길지만 스타일 넣는 부분은 생각보다 단순하다.

    폰트를 설정하고 싶다면 먼저 폰트를 설정하는게 좋음.

    //폰트 설정
    Font titleFont = workbook.createFont();
    titleFont.setFontName("맑은 고딕"); // 폰트 이름
    titleFont.setFontHeightInPoints((short) 12); // 폰트 크기
    titleFont.setBold(true);//폰트 두께

     

    주석처리로 눈치 채셨겠지만 아래 부분이 폰트 설정 하는 부분임

    여기서 설정하고싶은 폰트스타일, 폰트 크기, 폰트 두께 를 설정 하면됨.

    //타이틀 스타일 설정
    CellStyle titleCellStyle = workbook.createCellStyle();
    titleCellStyle.setAlignment(HorizontalAlignment.CENTER); //텍스트 정렬
    titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); //셀 배경색 설정
    titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 셀의 채우기 패턴
    titleCellStyle.setFont(titleFont); //위에 설정한 폰트 스타일 적용

     

    그 다음은 타이틀 스타일을 설정한 부분인데,

     

    CellStyle titleCellStyle = workbook.createCellStyle(); 

     

    createCellStyle() 은 workbook 객체에서 호출된 메소드로, 새로운 CellStyle 객체를 생성하고 반환한다는 의미로titleCellStyle 변수에 할당 함.

     

    titleCellStyle 변수에 텍스트 정렬, 셀 배경색 설정, 셀의 채우기 패턴...등 원하는 스타일을 적용 시키면됨.

    참고로 titleCellStyle.setFillPattern() 은 셀 배경색을 설정한다면 꼭 어떻게 채울건지 채우는 패턴도 적어줘야 셀에 배경색채우기가 적용이됨.

     

    titleCellStyle.setFont(titleFont) 위에 설정한 폰트를 스타일에 적용하고 싶을때 사용하는 메써드로 위에 폰트설정을 괄호에 넣어줘야함.

     

    Row headerRow = sheet.createRow(1);
    Cell headerCell0 = headerRow.createCell(0);
    headerCell0.setCellStyle(titleCellStyle);
    headerCell0.setCellValue("상담상태");
    
    ... 생략

     

    타이틀 스타일 적용은 해당하는 셀에 setCellStyle() 매서드를 사용하여 괄호안에 위에 열심히 설정한 부분인 titleCellStyle  넣어 적용시키면 된다.

    //셀 컨텐츠 설정
    CellStyle contentCellStyle = workbook.createCellStyle();
    contentCellStyle.setAlignment(HorizontalAlignment.CENTER); //텍스트 정렬
    contentCellStyle.setBorderBottom(BorderStyle.THIN); //아래선 설정
    contentCellStyle.setBorderLeft(BorderStyle.THIN); //왼쪽선 설정
    contentCellStyle.setBorderRight(BorderStyle.THIN); //오른쪽선 설정
    contentCellStyle.setBorderTop(BorderStyle.THIN); //위에선 설정

     

    셀 title 부분과 셀 content 부분이 각각 다른 스타일을 적용할거기 때문에 스타일객체를 새로 생성해 줘야함.

    이렇게 셀마다 각각 다른 스타일을 적용시키고 싶으면  그때마다 객체 생성

     

    특별히 여기에는 셀에 선을 설정하고싶으면 setBorderBottom()를 사용하여 바닥,왼쪽,오른쪽,위 각각 설정해 줘야되고

    선의 스타일도 각각 설정해 줄수 있음.

     

    int rowIndex = 2;
    for(userVO list: excelList){
        Row bodyRow = sheet.createRow(rowIndex++);
    
        Cell bodyCell0 = bodyRow.createCell(0);
        bodyCell0.setCellStyle(contentCellStyle);
        bodyCell0.setCellValue(list.getSTATUS());
    
        ... 생략
    
    }

     

    셀 content 부분 적용은 각각의 해당하는 셀에 setCellStyle() 매서드를 사용하여 괄호안에 위에 컨텐츠 스타일을 설정한 부분인 contentCellStyle 넣어 적용시키면 된다.

    반응형

    댓글

Designed by Tistory.