Study/Spring

초보자도 만들수 있는 자바로 엑셀 셀 병합 하기(셀 합치기)

nana1002 2024. 2. 27. 00:43
반응형

저번 시리즈에 이어 이번에는 셀을 병합하는 방법에 대해서 알아볼려고 함.

혹시 저번 시리즈인 '엑셀 기능 만들기' 와 '엑셀 스타일 적용하기' 기능에 대해 알고 싶다면 아래 링크 참고 바람!

 

https://cbn1218.tistory.com/51

 

초보자도 만들 수 있는 엑셀 스타일 적용하기 (엑셀 테두리 넣기&엑셀 배경색 넣기)

저번 블로그에 게시판에서 엑셀을 다운로드 하는 기능에 대해서 글을 썼음(궁금하신분은 아래 링크 참조!) https://cbn1218.tistory.com/42 초보자도 만들 수 있는 엑셀 다운로드 기능 만들기 Cell headerCell

cbn1218.tistory.com

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.설명

우선은 '엑셀 스타일 적용하기' 컨텐츠를 바탕으로 셀 병합 기능을 추가 했으니,

혹시 지금 글 부터 봐서 헷갈린다 하시는 분들은 바로 위에 첨부한 링크 참고 하심 편하실듯 함.

 

그럼 본격적으로 설명 ㄱㄱ

 

 

(1)Controller 부분

우선 전체 코드를 보자면 아래와 같음.

전체코드를 보고 이해 하실분은 아래 코드를 보심되고 추가 설명이 필요하다 하심 아래보심 될듯함.

추가설명을 적어놓았음.

    @GetMapping("/signIn.do")
    public String signInPage() {
    	System.out.println("signIn.do 페이지 들어옴");
    	return "signIn";	
    }
    
    @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 mergedTitle = workbook.createCellStyle();
		mergedTitle.setAlignment(HorizontalAlignment.CENTER); //텍스트 정렬
		mergedTitle.setFont(titleFont); //위에 설정한 폰트 스타일 적용
		
		//타이틀 스타일 설정
		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.setVerticalAlignment(VerticalAlignment.CENTER); //텍스트 수직 정렬
		contentCellStyle.setBorderBottom(BorderStyle.THIN); //아래선 설정
		contentCellStyle.setBorderLeft(BorderStyle.THIN); //왼쪽선 설정
		contentCellStyle.setBorderRight(BorderStyle.THIN); //오른쪽선 설정
		contentCellStyle.setBorderTop(BorderStyle.THIN); //위에선 설정
		
		List<userVO> excelList =service.getList2();
		
		
		Row titleRow = sheet.createRow(0);
		Cell titleCell = titleRow.createCell(0);
		titleCell.setCellStyle(mergedTitle);
		titleCell.setCellValue("엑셀 리스트");
		CellRangeAddress mergedTitleCell = new CellRangeAddress(0,0,0,4);
		sheet.addMergedRegion(mergedTitleCell);
		
		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("내용 없음");
		    if(rowIndex == excelList.size()+2) {
				CellRangeAddress mergedCell = new CellRangeAddress(2,5,4,4);
				sheet.addMergedRegion(mergedCell);
		    }
		        
		    
		}
		
		response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=test.xlsx");
		workbook.write(response.getOutputStream());
		workbook.close();
		
    }
    
}

 

셀 가로 병합과 세로 병합 모두 아래 코드 형식을 상황에 맞게 수정해서 쓰면 되는데,

가로병합과 세로병합이 사용하는 방법이 아주 약간 다르나 

먼저 쉬운 가로 병합먼저 설명하자면 

CellRangeAddress mergedTitleCell = new CellRangeAddress(0,0,0,4);
sheet.addMergedRegion(mergedTitleCell);

 

new CellRangeAddress ( 행 merged 시작 index , 행 merged 끝 index ,열 merged 시작 index , 열 merged 끝 index  )

새로운 객체를 만드는데,  예를 들어  new CellRangeAddress(0,0,0,4) 는 병합하는 행은  0  부터 0 까지 시작과 끝이 같아 병합되는 행이 없고,병합하는 열은 0부터  4까지의  범위로 셀의 갯수로는 5개의 셀이 가로로 병합이 됨.

sheet.addMergedRegion() 메서드안에 merged한 변수명인 'mergedTitleCell' 넣어 셀병합을 적용 함.

CellRangeAddress mergedCell = new CellRangeAddress(2,5,4,4);
sheet.addMergedRegion(mergedCell);

 

반대로 세로로 병합을 할때 병합하는 행은 2에서 5까지 행을 병합을 하고 열은 4에서 4까지

즉, 시작과 끝이 같음. 

실질적으로 병합되는 열은 없기 때문에 2에서 5까지 행만 셀 병합이 진행 됨.

 

그래서 아래와 같은 결과가 나옴. 

반응형