이전 글에서 클라이언트가 요청을 보내면 서버가 해당 요청을 처리할 수 있게 만들었습니다. 이번에는 사용자가 다운로드 할 Excel을 만들어보겠습니다.
이전 글에서 설명한것 같이 Excel에 데이터를 쓰는 속도는 SXSSF
가 압도적으로 빠릅니다. 또한 XSSF
는 쓰는 중간 Memory flush
가 불가능하므로 개인 프로젝트에서도 사용이 불가능할 수 있습니다.(테스트 기준 2000 Cell 작성만 해도 웹서버가 다운됩니다.)
따라서 Excel파일에 데이터를 작성할때는 SXSSF
를 사용합니다.
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");
}
}
- SXSSFWorkbook : Excel 파일과 같은 객체입니다.
생성시rowAccessWindowSize
로 데이터 처리량을 결정합니다.
- SXSSFSheet : Excel의 Sheet입니다.
- SXSSFRow : Excel의 Sheet의 Row입니다.
시작 Index는 0입니다.
- SXSSFCell : Excel의 Sheet의 Row의 Cell입니다.
시작 Index는 0입니다.
값이나 Cell의 속성값이 들어가는 객체입니다.
위 내용을 활용하여 DB에서 데이터를 가져왔다고 가정하고 엑셀을 만들어보겠습니다.
@Controller
public class ExcelController {
@RequestMapping("download")
public void create(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// DB에서 가져온 데이터.
String[][] dataArray = {{"Kim", "20", "Seoul"}
, {"Lee", "30", "Busan"}
, {"Park", "25", "Jeju"}};
// 1. Excel Workbook(파일)을 생성한다.
SXSSFWorkbook workbook = new SXSSFWorkbook(10);
// 2. 생성된 Excel Workbook에 Sheet를 만든다.
SXSSFSheet sheet = workbook.createSheet();
for(int i = 0; i < dataArray.length; i++) {
// 3. 생성된 Sheet에 Row를 만든다.
SXSSFRow row = sheet.createRow(i);
for(int j = 0; j < dataArray[i].length; j++) {
// 4. 생성된 Row에 cell을 만든다.
SXSSFCell cell = row.createCell(j);
// 5. 생성된 Cell에 값을 입력한다.
cell.setCellValue(dataArray[i][j]);
}
}
}
}
Excel을 작성하다보면 글자크기, 글자색상, 글자속성, Cell넓이, Cell높이 등을 설정해야 할 때가 있습니다.
// Cell Style 객체를 생성한다.
CellStyle sampleStyle = workbook.createCellStyle();
// cell의 상하좌우 테두리선을 설정한다.
sampleStyle.setBorderTop(BorderStyle.THIN);
sampleStyle.setBorderBottom(BorderStyle.THIN);
sampleStyle.setBorderLeft(BorderStyle.THIN);
sampleStyle.setBorderRight(BorderStyle.THIN);
// cell의 글자정렬을 가운데로 설정한다.
sampleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 세로 가운데
sampleStyle.setAlignment(HorizontalAlignment.CENTER); // 가로 가운데
// 배경색을 설정한다.
sampleStyle.setFillForegroundColor(new XSSFColor(new byte[]{(byte) 192, (byte) 192, (byte) 192}));
sampleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 폰트를 설정한다.
Font sampleFont = workbook.createFont();
sampleFont.setBold(true);
sampleFont.setFontName("나눔고딕");
sampleFont.setColor(IndexedColors.BLUE.getIndex());
sampleFont.setFontHeight((short) 180);
sampleStyle.setFont(sampleFont);
// Cell에 Style을 적용한다.
SXSSFCell cell = row.createCell(0);
cell.setCellStyle(sampleStyle);
@Controller
public class ExcelController {
@RequestMapping("download")
public void create(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String[][] dataArray = {{"Kim", "20", "Seoul"}
, {"Lee", "30", "Busan"}
, {"Park", "25", "Jeju"}};
// 1. Excel Workbook(파일)을 생성한다.
SXSSFWorkbook workbook = new SXSSFWorkbook(10);
// Cell Style 객체를 생성한다.
CellStyle sampleStyle = workbook.createCellStyle();
// cell의 상하좌우 테두리선을 설정한다.
sampleStyle.setBorderTop(BorderStyle.THIN);
sampleStyle.setBorderBottom(BorderStyle.THIN);
sampleStyle.setBorderLeft(BorderStyle.THIN);
sampleStyle.setBorderRight(BorderStyle.THIN);
// cell의 글자정렬을 가운데로 설정한다.
sampleStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 세로 가운데
sampleStyle.setAlignment(HorizontalAlignment.CENTER); // 가로 가운데
// 배경색을 설정한다.
sampleStyle.setFillForegroundColor(new XSSFColor(new byte[]{(byte) 192, (byte) 192, (byte) 192}));
sampleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 폰트를 설정한다.
Font sampleFont = workbook.createFont();
sampleFont.setBold(true);
sampleFont.setFontName("나눔고딕");
sampleFont.setColor(IndexedColors.BLUE.getIndex());
sampleFont.setFontHeight((short) 180);
sampleStyle.setFont(sampleFont);
// 2. 생성된 Excel Workbook에 Sheet를 만든다.
SXSSFSheet sheet = workbook.createSheet();
for(int i = 0; i < dataArray.length; i++) {
// 3. 생성된 Sheet에 Row를 만든다.
SXSSFRow row = sheet.createRow(i);
for(int j = 0; j < dataArray[i].length; j++) {
// 4. 생성된 Row에 cell을 만든다.
SXSSFCell cell = row.createCell(j);
// 5. 생성된 Cell에 값을 입력한다.
cell.setCellValue(dataArray[i][j]);
// 6. Cell에 Style을 적용한다.
cell.setCellStyle(sampleStyle);
}
}
}
}