프레임워크/스프링

[스프링] jxls 엑셀 템플릿으로 다운로드 (jxls 예시)

지이구 2021. 12. 30. 17:00

따라하기만 하면 되는 jxls 사용예제!!!

 

1. jxls 예시

 

1.1 pom 설정

pom.xml

 <!--jxls-->
 <dependency>
     <groupId>net.sf.jxls</groupId>
     <artifactId>jxls-core</artifactId>
     <version>1.0.6</version>
 </dependency>

<!--poi-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.14</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.14</version>
</dependency>

 

dependency 추가해주는데

jxls 와 poi 두개 다 넣어준다

 

 

 

1.2 엑셀 생성 코드 작성

MakeJxlsExcel.java

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;

public class MakeJxlsExcel {
	Logger logger = LoggerFactory.getLogger(this.getClass()); //로거
	
	public void download(HttpServletRequest request, HttpServletResponse response, Map<String, Object> model, String fileName, String templateFile)
            throws ParsePropertyException, InvalidFormatException, org.apache.poi.openxml4j.exceptions.InvalidFormatException {

		String tempPath = request.getSession().getServletContext().getRealPath("/WEB-INF/statis"); //temp파일이 있는 경로
		
		try {
		    InputStream is = new BufferedInputStream(new FileInputStream(tempPath + "\\" + templateFile));
		    XLSTransformer xls = new XLSTransformer();
		    Workbook workbook = xls.transformXLS(is, model);
		    
		    String outputFileName = new String(fileName.getBytes("KSC5601"), "8859_1"); //한글명 에러 방지
		    response.setHeader("Content-Disposition", "attachment; filename=\"" + outputFileName + ".xlsx\"");
		    
		    OutputStream os = response.getOutputStream();
		    
		    workbook.write(os);
		    
		    logger.info(">>>>>>>>> Make and Download Excel File Success"); //로그 찍기
			logger.info("          fileName : " + fileName + ".xlsx");
		} catch (IOException e) {
		    e.printStackTrace();
		}
	}
}

 

템플릿에 받은 map 데이터를 넣어 가공하고 내려받게 해주는 부분이다

 

이렇게 모듈화 해두면 다른 프로젝트에서 쓸 때도 간단해서 좋으니 최대한 모듈화!!

 

 

 

 

1.3 엑셀 템플릿 제작

sample.xlsx

그리고 엑셀 템플릿을 만들어 둔다

 

sample.xlsx
0.01MB

 

 

1.4 컨트롤러에서 사용하는 법

Controller.java

@RequestMapping("downloadExcel.do")
public void downloadExcel(HttpServletRequest request,
                          HttpServletResponse response
                          @RequestParam(value = "year") String year) throws Exception{

    //사용할 변수 정의
    Map<String, Object> inputMap = new HashMap<String, Object>();
    Map<String, Object> outputMap = new HashMap<String, Object>();
    inputMap.put("YEAR", year);

    List<Map<String, Object>> A_List = new ArrayList<Map<String, Object>>();
    List<Map<String, Object>> B_List = new ArrayList<Map<String, Object>>();
    String title1 = year + "년 데이터(A type)";
    String title2 = year + "년 데이터(B type)";

    //데이터 추출
    A_List = service.getAList(inputMap); //연도(year)로 A_List를 추출해옴
    B_List = service.getBList(inputMap); //연도(year)로 B_List를 추출해옴

    //엑셀 jxls 양식에 맞게 outputMap 가공
    outputMap.put("title1", title1);
    outputMap.put("title2", title2);
    outputMap.put("A_List", A_List); //엑셀 템플릿에서 forEach 돌 리스트
    outputMap.put("B_List", B_List); //엑셀 템플릿에서 forEach 돌 리스트

    //파일명 가공
    String newFileName = year +"_" + DateTimeUtil.formatTime4Rtm(new Date().getTime());

    //위의 엑셀 가공 모듈 불러와서 실행
    MakeJxlsExcel mje = new MakeJxlsExcel();
    mje.download(request, response, outputMap, newFileName, "sample.xlsx");
    //mje.download(request, response, 데이터 담긴 map, 다운로드 파일명, 템플릿 파일명);
}

컨트롤러에서는 다음과 같이 데이터를 map에 넣어 전달해주기만 하면 된다

주석에 설명과 예시를 적어놨으니 쓰기 쉬울것!!

 

 

1.5 기타

화면단에서는 버튼 누르면 이렇게 바로 컨트롤러 타도록!

$("#btn").click(function(){
	location.href="/downloadExcel.do";
}

 

 

 

이렇게만 따라하면

간단하고 쉽게 다운로드 가능하다

끝!

728x90
반응형