기록하는 개발자

Spring Excel 병합된 셀 내용 불러오기 본문

웹 개발/Spring

Spring Excel 병합된 셀 내용 불러오기

gitseok 2022. 9. 8. 16:25
  • JAVA
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
    
    
    
    @RequestMapping(value = "/readExcelFile.do")
	public ModelAndView readExcelFile() throws Exception {

		ModelAndView mav = new ModelAndView("jsonView");

		try {
        	//xlsx,xls 사용 가능
			Workbook workbook = WorkbookFactory.create(new File("D:/excelTest/excelSample.xlsx"));

			int rowindex = 0;
			int columnindex = 0;
			// 첫번쨰 시트만 조회
			Sheet sheet = workbook.getSheetAt(0);
			
			//마지막 행
			int rows = (sheet.getLastRowNum()+1);
			//마지막 셀
			int maxCells = 0;
			for (rowindex = 0; rowindex < rows; rowindex++) { // 세로
				Row row = sheet.getRow(rowindex);
				if(row!=null) {
					int cells = (row.getLastCellNum());
					if (cells > maxCells)
						maxCells = cells;	
				}
				
			}
			mav.addObject("maxRow",rows);
			mav.addObject("maxCol",maxCells);
			
			//병합된 셀 기록
			String[][] merge = new String[rows][maxCells];
			for (int i = 0; i < sheet.getNumMergedRegions(); ++i) {
				CellRangeAddress range = sheet.getMergedRegion(i);
				
				int mergeRow = range.getFirstRow(); 	//병합 셀의 시작Row
				int mergeCol = range.getFirstColumn();	//병합 셀의 시작Col
				int rowLength = range.getLastRow() - range.getFirstRow() + 1; 		//병합 셀의 Row 길이 계산
				int colLength = range.getLastColumn() - range.getFirstColumn() + 1;	//병합 셀의 Col 길이 계산
				
				//merge[][] 에 병합된 셀의 정보 기록
				for (int r = 0; r < rowLength; r++) {
					for (int c = 0; c < colLength; c++) {
						
						if (r == 0 && c == 0) {//병합된 셀의 시작부분은 [Row, Col] 형태로 길이 제정
							merge[mergeRow][mergeCol] = rowLength + "," + colLength;
						} else { //이외의 부분은 mergeCell로 표시
							merge[mergeRow + r][mergeCol + c] = "mergeCell";
						}

					}
				}
			}
			
			//셀의 내용 저장
			String[][] text = new String[rows][maxCells];
			for (rowindex = 0; rowindex < rows; rowindex++) { // Row
			
				Row row = sheet.getRow(rowindex);
				if (row != null) {
					int cells = row.getLastCellNum();
					for (columnindex = 0; columnindex <= cells; columnindex++) { // Col

						Cell cell = row.getCell(columnindex);

						String value = "";
						// 셀이 빈값일경우를 위한 널체크
						if (cell == null) {
							continue;
						} else {
							// 타입별로 내용 조회
							switch (cell.getCellType()) {
							case Cell.CELL_TYPE_FORMULA:
								value = cell.getCellFormula();
								break;
							case Cell.CELL_TYPE_NUMERIC:
								value = cell.getNumericCellValue() + "";
								break;
							case Cell.CELL_TYPE_STRING:
								value = cell.getStringCellValue() + "";
								break;
							case Cell.CELL_TYPE_BLANK:
								value = cell.getBooleanCellValue() + "";
								break;
							case Cell.CELL_TYPE_ERROR:
								value = cell.getErrorCellValue() + "";
								break;
							}
						}
						//내용 저장
						text[rowindex][columnindex] = value;
					}

				}
			}
			mav.addObject("merge", merge); 	//병합정보
			mav.addObject("text", text);	//내용정보
		} catch (Exception e) {
			e.printStackTrace();
		}

		return mav;
	}

 


<script>
	function fn_excelSearch() {
	
		$.ajax({
			type : "POST",
			url : "<c:url value='readExcelFile.do'/>",
			dataType : "json",
			success : function(data) {
				var maxRow = data.maxRow;
				var maxCol = data.maxCol;
				var merge = data.merge;
				var text = data.text;
				
               			//테이블 생성
				var html = '<table class="jexcel" cellpadding="0" cellspacing="0" unselectable="yes">';
				
				for (let i = 0; i < maxRow; i++){
					html += '<tr data-y="" class="">';
					html += '<td data-y="0" class="jexcel_row" style="">'+(i+1)+'</td>'
					for (let j = 0; j < maxCol; j++){
						var mergeCheck = merge[i][j]
						var cell = text[i][j];
						if(text[i][j]===null||text[i][j]==="false"){
							cell ="";
						}
						
						
						console.log(mergeCheck);
						
						if(mergeCheck=="mergeCell"){
							
						}else if(!(mergeCheck===null)){
							
							var split =  mergeCheck.split(',');
							var mergeRow = split[0];
							var mergeCol = split[1];
							html += '<td style="text-align: center;" rowspan="'+mergeRow+'" colspan="'+mergeCol+'">'+cell+'</td>';
							
						}else{
							html += '<td style="text-align: center;">'+cell+'</td>';
						}
					};
					html += '</tr>';
				};
				
				html += '</table>';
				$("#excelData").prepend(html);
			},
			error : function(jqXHR) {
				console.log(jqXHR);
			}
		});
		
	}
</script>

<div id="excelData">
</div>

  • 실행 결과

테스트 엑셀 파일
실행 결과


poi-3.9v, poi-ooxml-3.9v 사용

버전에 따라 JAVA - WorkBook을 사용하지 못할 수 있습니다.(.xls, .xlsx 확장자 동시 사용)

 

개인적으로 정리한 내용을 간단하게 풀어 작성했습니다.
이해가 안가는 부분은 댓글 남겨주시면 설명해드리겠습니다.
Comments