본문 바로가기
SPRING

[SPRING] 엑셀 양식에 데이터 삽입 후 다운로드 (Apache POI)

by madinthe90 2023. 1. 30.
반응형


정해진 엑셀 양식에 데이터를 넣어 다운받게 해달라는 요청이 생겨
엑셀에 데이터를 넣어 다운받을 수 있는 방법을 작성해보고자 한다!

 

1. 엑셀 양식

샘플로 데이터를 삽입하기 위해 만든 엑셀 양식

 


2. webapp 에 엑셀 양식 추가

테스트를 위해 wabapp/file/test_poi.xlsx 로 추가!

 


3. 데이터 삽입 코드

데이터 삽입할때 getRow와 getCell 위치를 정확히 확인해야한다.
getRow는 엑셀 왼쪽의 숫자, 행 (1,2,3,4..)으로 0번 부터 시작한다.
: 1 2 3 4 .. 는 0 1 2 3 ..
getCell은 엑셀 위의 알파벳, 열(A,B,C,D..)로 똑같이 0번 부터 시작한다.
: A B C D .. 는 0 1 2 3 .. 순서


4. 컨트롤러

import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class PoiController {

	@RequestMapping("/excelPoi.do")
	public void excelPoi(HttpServletRequest request, HttpServletResponse response) throws Exception {
	    try {
			
	        request.setCharacterEncoding("UTF-8");
	        
	        String formPath = request.getServletContext().getRealPath("file/test_poi.xlsx"); // 양식 위치
	        InputStream fis = new FileInputStream(formPath);
	        XSSFWorkbook xssfWorkBook = new XSSFWorkbook(fis);
	        XSSFSheet xssfSheet = xssfWorkBook.getSheetAt(0);
	        
	        xssfSheet.getRow(5).getCell(1).setCellValue("1");	// 행(6), 열(B)
	        xssfSheet.getRow(5).getCell(2).setCellValue("기상");// 행(6), 열(C)

	        xssfSheet.getRow(6).getCell(1).setCellValue("2");
	        xssfSheet.getRow(6).getCell(2).setCellValue("출근");
	        
	        xssfSheet.getRow(7).getCell(1).setCellValue("3");
	        xssfSheet.getRow(7).getCell(2).setCellValue("퇴근");

	        xssfSheet.getRow(8).getCell(1).setCellValue("4");
	        xssfSheet.getRow(8).getCell(2).setCellValue("취침");
	        
	        // 다운로드
	        String fileName = "엑셀데이터삽입.xlsx";
	        fileName = URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+", "%20");	//한글파일 명 설정
	        
	        response.setContentType("application/vsd.ms-excel");
	        response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\"");

	        xssfWorkBook.write(response.getOutputStream());
	        
	    } catch (Exception e) {
	        e.printStackTrace();
	    }
	}
}

 

 

5. 결과

 

테스트할때 getRow, getCell, setCellValue를 직접 입력했지만,

DB의 값을 SELECT해 뿌려주는 방식으로 사용하면 된다.

 

실무에서 사용했을때는 DB에서 SELECT 할때 getRow와 getCell 값을 설정한 후

컨트롤러에서는 반복문을 사용해 데이터를 삽입했다.

반응형

댓글