[JAVA] SpringBoot POI 라이브러리 엑셀 다운로드 간단하게 구현하기
Apache POI 라이브러리를 사용하여 JAVA 에서 엑셀 다운로드하는 예제를 구현해보겠습니다.
Apache (아파치) POI는 아파치 소프트웨어에서 만든 라이브러리로 마이크로소프트 오피스 파일 포맷을 순수 자바 언어로 읽고 쓰는 기능을 제공합니다.
워드, 엑셀, 파워포인트 파일을 지원하고 오피스 포맷의 지원을 늘려가고 있습니다.
Apache POI는 다음과 같은 하위 컴포넌트로 구성되어 있습니다.
POIFS(Poor Obfuscation Implementation File System) : 마이크로소프트 오피스의 OLE 2 Compound document 파일 포맷을 읽고 쓰는 컴포넌트. 모든 오피스 파일 포맷은 OLE2 방식이므로 하위 모든 컴포넌트의 기반이 된다.
HSSF(Horrible SpreadSheet Format) : 마이크로소프트 엑셀 파일포맷을 읽고 쓰는 컴포넌트로서 엑셀 97버전부터 현재까지 지원한다.
XSSF(XML SpreadSheet Format) : 마이크로소프트 엑셀 2007부터 지원하는 오피스 오픈 XML 파일 포맷인 *.xlsx 파일을 읽고 쓰는 컴포넌트이다.
HPSF(Horrible Property Set Format) : 오피스 파일의 문서요약 정보를 읽는데 사용되는 컴포넌트이다.
HWPF(Horrible Word Processor Format) : 마이크로소프트 워드 97(*.doc) 파일을 읽고 쓰는데 사용되는 컴포넌트이다. 아직까지는 개발 초기단계이다.
HSLF(Horrible Slid Layout Format) : 마이크로소프트 파워포인트 파일을 읽고 쓰는데 사용되는 컴포넌트이다.
HDGF(Horrible DiaGram Format) : 마이크로소프트 비지오 파일을 읽는데 사용하는 컴포넌트이다.
HPBF(Horrible PuBlisher Format) : 마이크로소프트 퍼블리셔 파일을 다루는데 사용되는 컴포넌트이다.
HSMF(Horrible Stupid Mail Format) : 마이크로소프트 아웃룩에서 사용되는 *.msg 파일을 다루는데 사용되는 컴포넌트이다.
DDF(Dreadful Drawing Format) : 마이크로소프트 오피스에서 사용되는 이미지 파일을 읽어오는데 사용하는 컴포넌트이다.
HSSF 컴포넌트가 가장 안정적이고 많은 기능을 지원하며 다른 컴포넌트들은 사용은 가능하나 아직까지는 개발 단계이다.
사용 방법도 간단하게 구현이 가능하여 프로젝트 진행 시 엑셀 파일을 업로드 하거나 다운로드 할 때 유용하게 사용하시길 바랍니다.
저는 SpringBoot 2.4.3 버전, Gradle 6.0 버전, Java 8 버전을 사용하였습니다.
그럼 사용 방법과 예제를 구현하겠습니다.
아래 소스를 참고하세요!
1. Gradle.build 의존성 추가
compile group: 'org.apache.poi', name: 'poi', version: '4.1.2' // HSSFWorkbook 사용가능
compile group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2' // XSSFWorkbook 사용가능
2. POI 라이브러리를 사용하기 위한 java import 추가
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
3. 엑셀 다운로드 로직 구현
/**
/* 엑셀 다운로드
* @param request
* @param response
* @return
* @throws IOException
*/
@RequestMapping(value="/downloadExcel")
public void downloadExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
Row row = null;
Cell cell = null;
int rowNum = 0;
// Header 필드
row = sheet.createRow(rowNum++);
cell = row.createCell(0);
cell.setCellValue("필드1");
cell = row.createCell(1);
cell.setCellValue("필드2");
cell = row.createCell(2);
cell.setCellValue("필드3");
// Body 본문내용
for (int i=0; i<3; i++) {
row = sheet.createRow(rowNum++);
cell = row.createCell(0);
cell.setCellValue("필드데이터1_" + i);
cell = row.createCell(1);
cell.setCellValue("필드데이터2_" + i);
cell = row.createCell(2);
cell.setCellValue("필드데이터3_" + i);
}
// 컨텐츠 타입과 파일명 지정
response.setContentType("ms-vnd/excel");
// response.setHeader("Content-Disposition", "attachment;filename=example.xls");
response.setHeader("Content-Disposition", "attachment;filename=example.xlsx");
// Excel File Output
wb.write(response.getOutputStream());
wb.close();
}