엑셀젬병이라 셀 병합이 동일한 데이터끼리 Rowspanning인줄 알았는데
데이터 상관없이 셀을 병합시키는거 였다.
그래서 병합할 cell을 하나하나 지정해줘야만 했다.
| 날짜 | 타입 | 제목 | 내용 | 총조회수 |
|---|---|---|---|---|
| 7/15(병합대상) | qna | 제목1 | 내용1 | 5(병합대상) |
| 7/15 | faq | 제목1 | 내용1 | 2 |
| 7/16(병합대상) | qna | 제목1 | 내용1 | 11(병합대상) |
| 7/16 | faq | 제목1 | 내용1 | 43 |
| 7/17(병합대상) | qna | 제목1 | 내용1 | 5(병합대상) |
| 7/18 | faq | 제목1 | 내용1 | 21 |
| 토탈(병합대상) | 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에 남은 컬럼들(제목, 내용, 조회수)도 좌우 병합을 해줘야겠다..