POI로 생성한 Excel을 클라이언트로 다운로드시키겠습니다.
@Controller
public class ExcelController {
@RequestMapping("download")
public void create(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// 1. Excel Workbook(파일)을 생성한다.
SXSSFWorkbook workbook = new SXSSFWorkbook(10);
// 2. 생성된 Excel Workbook에 Sheet를 만든다.
SXSSFSheet sheet = workbook.createSheet();
// 3. 생성된 Sheet에 Row를 만든다.
SXSSFRow row = sheet.createRow(0);
// 4. 생성된 Row에 cell을 만든다.
SXSSFCell cell = row.createCell(0);
// 5. 생성된 Cell에 값을 입력한다.
cell.setCellValue("value");
// 6. 다운로드를 시킵니다.
download(workbook, response);
}
}
SXSSFWorkbook
을 다운로드할 수 있도록 download
를 호출합니다.
SXSSFWorkbook
과 HttpServletResponse
를 전달해줍니다.
public void download(SXSSFWorkbook workbook, HttpServletResponse response) throws IOException {
// 1. OutputStream 생성
OutputStream outputStream = null;
try {
// 2. mime-type을 설정한다.
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// 3. 파일명을 설정한다.
response.setHeader("Content-Disposition", "Attachment; Filename=sample.xlsx");
// 4. response의 OutputStream에 생성한 workbook을 write한다.
outputStream = new BufferedOutputStream(response.getOutputStream());
workbook.write(outputStream);
outputStream.flush();
} catch (Exception e) {
// Exception 처리하세요.
} finally {
// 5. 사용한 Stream을 닫는다.
if(outputStream != null) outputStream.close();
}
}
OutputStream
을 생성합니다.SXSSFWorkbook
을 담을Stream
입니다.
mime-type
을 설정합니다. Excel 확장자에 따른mime-type
은 다음과 같습니다.
xlsx
: application/vnd.openxmlformats-officedocument.spreadsheetml.sheetxls
: application/vnd.ms-excelxlsm
: application/vnd.ms-excel.sheet.macroEnabled.12xlsb
: application/vnd.ms-excel.sheet.binary.macroEnabled.12
Filename
에 다운로드할 파일명을 설정해줍니다. 유동적으로 변경이 가능합니다.
response
의OutputStream
에WorkBook
을 Write합니다.
finally
block에서 사용한Stream
을 닫아줍니다.
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@Controller
public class ExcelController {
@RequestMapping("download")
public void create(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// 1. Excel Workbook(파일)을 생성한다.
SXSSFWorkbook workbook = new SXSSFWorkbook(10);
// 2. 생성된 Excel Workbook에 Sheet를 만든다.
SXSSFSheet sheet = workbook.createSheet();
// 3. 생성된 Sheet에 Row를 만든다.
SXSSFRow row = sheet.createRow(0);
// 4. 생성된 Row에 cell을 만든다.
SXSSFCell cell = row.createCell(0);
// 5. 생성된 Cell에 값을 입력한다.
cell.setCellValue("value");
download(workbook, response);
}
public void download(SXSSFWorkbook workbook, HttpServletResponse response) throws IOException {
// 1. OutputStream 생성
OutputStream outputStream = null;
try {
// 2. mime-type을 설정한다.
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
// 3. 파일명을 설정한다.
response.setHeader("Content-Disposition", "Attachment; Filename=sample.xlsx");
// 4. response의 OutputStream에 생성한 workbook을 write한다.
outputStream = new BufferedOutputStream(response.getOutputStream());
workbook.write(outputStream);
outputStream.flush();
} catch (Exception e) {
// Exception 처리하세요.
} finally {
// 5. 사용한 Stream을 닫는다.
if(outputStream != null) outputStream.close();
}
}
}