Java POI Cell merge

밥하는중·2022년 7월 15일

Java

목록 보기
1/1

엑셀젬병이라 셀 병합이 동일한 데이터끼리 Rowspanning인줄 알았는데

데이터 상관없이 셀을 병합시키는거 였다.

그래서 병합할 cell을 하나하나 지정해줘야만 했다.

날짜타입제목내용총조회수
7/15(병합대상)qna제목1내용15(병합대상)
7/15faq제목1내용12
7/16(병합대상)qna제목1내용111(병합대상)
7/16faq제목1내용143
7/17(병합대상)qna제목1내용15(병합대상)
7/18faq제목1내용121
토탈(병합대상)3개의 qna
토탈3개의 faq
토탈총 6개의게시글

이런 테이블이 있다고 하면

첫번째 컬럼의 날짜를 2개씩 병합하고
마지막 컬럼의 조회수를 2개씩 병합해서 조회수를 sum
마지막 로우와 위로2개의 행을 토탈로 묶는거였다.

통계 쿼리에서 데이터를 뽑아온 후 자바로 파싱을 한 후에 진행하였다.

for (int i = 0; i < firstTotalStr; i++) {
	if (i % 2 == 0) {
		mergeList.add(new CellRangeAddress(i , i +1, 0, 0)); // 날짜 2개씩 병합
		mergeList.add(new CellRangeAddress(i , i +1, 5, 5)); // 조회수 2개씩 병합
	}
}

mergeList.add(new CellRangeAddress(firstTotalStr, lastTotalStr, 0, 0)); // 마지막 total row 3개 병합


CellRangeAddress[] convertList = (CellRangeAddress[]) mergeList.toArray(new CellRangeAddress[mergeList.size()]);

컬럼수는 고정이지만 행은 n개였기 때문에 footer 영역의 total 영역의 firstIndex와 lastIndex를 구해서 추가했다.

그리고 ExcelUtil.java 에서

if(mergeList.length > 0){
	for(int mergeIndex=0; mergeIndex<mergeList.length; mergeIndex++){
		sheet.addMergedRegion(mergeList[mergeIndex]);
		CellRangeAddress range = mergeList[mergeIndex];
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  		sheet.getRow(range.getFirstRow()).getCell(range.getFirstColumn()).setCellStyle(cellStyle);
	}
}

병합을 하면 Text의 정렬이 Bottom으로 되서
병합시작 행의 병합시작 cell VerticalAlignment.CENTER을 추가했다.

작성을 하고 보니 제일 밑에 footer에 남은 컬럼들(제목, 내용, 조회수)도 좌우 병합을 해줘야겠다..

profile
공통기능으로 요령피우자

0개의 댓글