스프링부트 jxls 엑셀 탬플릿 이용하여 만들기

2022. 10. 6. 17:32스프링

dependency 추가

implementation 'org.jxls:jxls:2.12.0'
implementation 'org.jxls:jxls-poi:2.12.0'
implementation 'org.apache.poi:poi:5.2.2'
implementation 'org.apache.poi:poi-ooxml:5.2.2'

jxls 1.x 버전을 사용하지 않고 2.x로 구현했다. 

poi 라이브러리도 사용하기 때문에 poi도 추가해줘야 한다.

 

@GetMapping("/excel.json")
public void excel(JavaBean bean, HttpSession session, HttpServletResponse res) throws IOException, InvalidFormatException {
   InputStream template = resourceLoader.getResource("classpath:탬플릿.xlsx").getInputStream();
   OutputStream target = res.getOutputStream();
   Workbook workbook = WorkbookFactory.create(template);
   workbook.setSheetName(0, "탬플릿1");
   PoiTransformer transformer = PoiTransformer.createTransformer(workbook);
   transformer.setOutputStream(target);

   List<JavaBean> list = service.excel(bean);
   
   Context context = new Context();
   context.putVar("enList", list);

   res.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", URLEncoder.encode("다운로드.xlsx", "UTF-8")));
   JxlsHelper.getInstance().processTemplate(context, transformer);
}

일단 프로젝트 내부 경로에 사용할 탬플릿 파일을 넣어두고 그 데이터 경로로 들어가 데이터를 읽는다

또 읽은 데이터를 가공해서 데이터를 내보낸다.

탬플릿에 사용할 객체들 또한 가지고 온다.

Workbook 같은 경우엔 엑셀 내부를 커스터마이징 하기 위해 객체를 생성했다.  workbook에 많은 메소드는 검색을 통해

찾아보면 된다. 그리고 나서 Context 객체를 생성 후에 탬플릿에 사용할 객체를 키, 벨류 쌍으로 넣어준다.

여기서 키는 템플릿에 사용할 ${} 표현식과 일치해야 한다. 

 

window.location.href=`/excel.json?{컨트롤러에 보내줄 파라미터}`

화면단에서는 이렇게 간단히 호출만 하면 다운로드가 완료된다.

 

템플릿 표현식 같은 경우에는

이런식으로 사용하면 된다. 전체 저 변수가 적용될 에어리어로 마지막 셀인 F4를 지정해주고

each에 items에는 putVar에 넣어던 키값과 매칭이 되어야 한다.

현재는 매우 단순하지만 복잡한 탬플릿에서는 poi로 직접 자바단에서 구현하는 것 보다 jxls로 간단히 구현하는 게 훨씬 간단하다. 

물론 대용량 데이터 같은 경우에는 추천하지 않는다. 대용량 같은 경우 poi SXSSF로 구현하는 걸 추천한다.