ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 초보자도 만들 수 있는 자바로 엑셀 기능 만들기
    Study/Spring 2023. 4. 8. 00:27
    반응형

     

    Cell headerCell0 = headerRow.createCell(0);
    headerCell0.setCellValue("상담상태");
    Cell headerCell1 = headerRow.createCell(1);
    headerCell1.setCellValue("이름");
    Cell headerCell2 = headerRow.createCell(2);
    headerCell2.setCellValue("시간");
    Cell headerCell3 = headerRow.createCell(3);
    headerCell3.setCellValue("상품내용");

    게시판 기능 중 엑셀로 내용을 내려 받을 수 있게 만드는 기능 많이 봤는데...

    내가 구현 할려니 넘 어렵다 ㅠㅠ

    그래서 나 같은 초보자를 위하여  엑셀로 내용을 다운 받을 수 있는 기능 만들기 편을 포스팅 해본다!

    1.설명

    나는 처음 게시판에 있는 내용을 엑셀로 받을 수 있게 구현해 달라고 요청을 받았을때 

    어떻게 만들지?! 하고 당황을 했다!

    하지만 방법은 있다! 구글 쌤 말씀하시길  POI라이브러리를 이용하여 만들라고 방법을 친히 설명해 주신다.

    그럼 이제 코드를 보면서 설명을 해볼까?!

     

    2.구현

    (1)pom.xml  설정

    엑셀을 만들려면 POI라이브러리를 이용하여 구현이 가능하기 때문에 maven을 쓰고 있다는 가정하에 아래코드를 pom.xml 추가해준다! 

    		<!-- 엑셀다운로드기능 구현 -->
    		<dependency>
    		    <groupId>org.apache.poi</groupId>
    		    <artifactId>poi</artifactId>
    		    <version>4.1.2</version>
    		</dependency>
    		<dependency>
    		    <groupId>org.apache.poi</groupId>
    		    <artifactId>poi-ooxml</artifactId>
    		    <version>4.1.2</version>
    		</dependency>

     

    (2)jsp 부분

    위에 그림을 보면 "엑셀출력" 이라는 버튼을 만들고 form형식을 입혀 controller로 보내야 하기 때문에 아래와 같이 코드를 작성 한다, form형식은 action부분에 보내고자 하는 controller의 url을 입력하고 method는 http방식을 선택하여 넘겨준다

        <form action="excel.do" method="post">
        	<button class="excel">엑셀출력</button>
        </form>

     

    (3)Controller 부분

    controller 부분이 젤 중요!!!우선 냅다 코드부터 보고 설명 ㄱㄱ

    	@PostMapping("/excel.do")
    	public void excel(HttpServletResponse response)throws Exception{
    		
    		Workbook workbook = new SXSSFWorkbook();
    		Sheet sheet = workbook.createSheet();
            
    		List<userVO> excelList =service.getList2();
    		
    		int rowIndex = 0;
    		Row headerRow = sheet.createRow(rowIndex++);
    		
    		Cell headerCell0 = headerRow.createCell(0);
    		headerCell0.setCellValue("상담상태");
    		
    		Cell headerCell1 = headerRow.createCell(1);
    		headerCell1.setCellValue("이름");
    
    		Cell headerCell2 = headerRow.createCell(2);
    		headerCell2.setCellValue("시간");
    
    		Cell headerCell3 = headerRow.createCell(3);
    		headerCell3.setCellValue("상품내용");
    		
    		
    		for(userVO list: excelList){
    		  Row bodyRow = sheet.createRow(rowIndex++);
    			
    		  Cell bodyCell0 = bodyRow.createCell(0);
    		  bodyCell0.setCellValue(list.getSTATUS());
    		    
    		  Cell bodyCell1 = bodyRow.createCell(1);
    		  bodyCell1.setCellValue(list.getNAME());
    		    
    		  Cell bodyCell2 = bodyRow.createCell(2);
    		  bodyCell2.setCellValue(list.getTIME());
    		    
    		  Cell bodyCell3 = bodyRow.createCell(3);
    		  bodyCell3.setCellValue(list.getCONTENT());
    		}
    		
    		
    		response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=test.xlsx");
    		workbook.write(response.getOutputStream());
    		workbook.close();
    		
    	}

    코드하나하나 설명을 시작 이제 부터 중요하니 꼼꼼히 봐야 함.

    @PostMapping("/excel.do")

    먼저 jsp에서 form으로 보낼때 action과 method를 지정해 줬는데 그부분 과 일치가 되어야 한다! 

     

    Workbook workbook = new SXSSFWorkbook();
    Sheet sheet = workbook.createSheet();


    엑셀파일을 만들고 엑셀파일 안에 sheet가 있듯이 동일하게 sheet를 만든다.

     

    List<userVO> excelList =service.getList2();

    service.getList2() 라는 게시판에 데이터를 불러오는 서비스 로직으로 서비스 로직을 사용하여 데이터를 불러와 

    이번에는 불러온 데이터를 엑셀 파일에 담는데 그러기 위해 데이터를 불러오기 위한 과정

     

    int rowIndex = 0;
    Row headerRow = sheet.createRow(rowIndex++);

    그런 다음 아래 그림과 같은 행에 해당하는  row를 sheet에 먼저 생성하고, 

    rowIndex++ 에 의해 1더해져 1행의 셀에 데이터를 넣어줄 준비완료 

    Cell headerCell0 = headerRow.createCell(0);
    headerCell0.setCellValue("상담상태");
    		
    Cell headerCell1 = headerRow.createCell(1);
    headerCell1.setCellValue("이름");
    
    Cell headerCell2 = headerRow.createCell(2);
    headerCell2.setCellValue("시간");
    
    Cell headerCell3 = headerRow.createCell(3);
    headerCell3.setCellValue("상품내용");

    위에 먼저 만든 1행의 첫번째 셀을 만들어 변수에 담아주고 첫번째 셀에 setCellValue 메서드를 이용하여 데이터를 text로 담아주던지 DB의 데이터를 담아주는데, 1행은 header 부분이라 text를 입력하기로 함

    for(userVO list: excelList){
    	Row bodyRow = sheet.createRow(rowIndex++);
    			
    	Cell bodyCell0 = bodyRow.createCell(0);
        bodyCell0.setCellValue(list.getSTATUS());
    		    
        Cell bodyCell1 = bodyRow.createCell(1);
    	bodyCell1.setCellValue(list.getNAME());
    		    
    	Cell bodyCell2 = bodyRow.createCell(2);
    	bodyCell2.setCellValue(list.getTIME());
    		    
    	Cell bodyCell3 = bodyRow.createCell(3);
    	bodyCell3.setCellValue(list.getCONTENT());
    }

    위에 headerRow를 지정 했듯이 그다음 2행부터 DB에서 불러온 데이터를 차례차례 넣기위한 행을 만들기 위해서

    for문안에 sheet.createRow(rowIndex++) 메서드를 이용하여 필요한 만큼 행을 만든다

    위에 header의 셀내용을 채워주었듯 동일한 방법으로 bodyRow.createCell를 이용하여 셀을 순서대로 만들고 

    setCellValue를 이용하여 셀내용을 채워 주는데 이때 DB의 내용을 불러와 채워 줘야하므로

    향상된 for문을 이용 하여 service.getList2()메서드->  excelList변수에 담고 -> userVO 타입으로 값을 받아

    ->get메서드를 이용하여 값을 불러와 채워주면 된다

    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment;filename=test.xlsx");
    workbook.write(response.getOutputStream());
    workbook.close();

     마지막으로 HttpServletResponse를 이용하여 ContentType과 Header 설정하여 response의 데이터 출력메서드인getOutputStream을 이용하여 엑셀만드는 메서드에 단아주면 ContentType과 Header가 설정 되어 엑셀파일로 만들어지고마지막으로 close() 하므로써 자원을 운영체제한테 반환해 준다!

     

    3.결과

    엑셀이 컴터에 안깔려있어서 파일 형태로 다운로드 받아 졌는데, 아마 엑셀이 깔려져있는 컴터에는 다운로드 파일이 엑셀모양으로 보일것임

    구글스프레드시트를 이용하여 엑셀파일을 열어봤을때 해당데이터가 고스란히 잘 담겨있다!

     

    추가적으로 셀에 스타일을 넣는 방법도 있는데, 추후에 시간이 된다면 업뎃을 해보겠다!

     

    오늘 하루도 즐코 하시길!

    반응형

    댓글

Designed by Tistory.