반응형
1. 라이브러리를 추가한다.
2. VO를 생성해준다.
- 엑셀 파일: ExcelVO
public class ExcelVO {
private String fileName; //엑셀 파일명
private Stirng sheetName; //시트명
private int freezePaneCol; //고정col
private int freezePaneRow; //고정row
private DataVO dataVO; //데이터의 VO
final List<CellVO> cellVOList=new ArrayList(); //셀을 담은 List;
}
- 엑셀을 이루는 Cell: CellVO
public class CellVO {
private String field; //VO의 필드값을 넣어줌
private String header; //엑셀의 첫 번째 row에서 보여줄 항목명
private ValidVO valid; //cell 마다 필수값, 문자열길이 등 유효성 검사를 위함.
}
- Cell에 담긴 데이터: DataVO
public class DataVO {
private String ordNo;
private String productNm;
private DateTimeStamp ordDt;
}
3. ExcelVO와 CellVO 생성한다.
public final class ExcelConfig {
public static final ExcelVO excelVO;
excelVO = new ExcelVO("파일명", "시트명", 0, 1, DataVO.class);
excelVO.cellVOList.addAll(Arrays.asList(
new CellVO("ordNo", "주문번호", new ValidVO().notEmpty());
new CellVO("productNm", "상품명", new ValidVO().notEmpty());
new CellVO("ordDt", "주문일자", new ValidVO().notEmpty());
));
}
4. 아래 코드 추가한다.
'Zip bomb' 용어의 공격 기법으로 .xlsx 파일은 XML 파일이 포함된 압축 파일이기 때문에 POI에서 'Zip Bomb' 관련 취약점이 발생할 가능성이 있다. (많은 행 혹은 많은 열을 가지는 경우) workbook 생성하기 전에 safeguard를 풀기 위해 아래와 같이 설정해줌..
ZipSecureFile.setMinInflateRatio(0);
5. workbook 생성한다.
엑셀 파일 종류
- HSSF: Excel 2007 이전(.xls)
- XSSF: Excel 2007 이후(.xlsx)
- SXSSF : XSSF의 Streaming 버전으로 메모리를 적게 사용(대용량 파일에 사용)
엑셀 contentType
- xlsx 파일 : application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
- xls 파일 : application/vnd.ms-excel
//이때, 파라미터로 ExcelVO 함께 넘겨줌..
Workbook workbook = new SXSSFWorkbook()
Sheet sheet = workbook.createSheet(excelVO.getSheetName());
sheet.createFreezePane(excelVO.getFreezePaneCol(), excelVO.getFreezePaneRow()); //sheet의 고정행, 고정열 세팅
//cellStyle 생성하여 지정하기
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setVerticalAlignment((short)0); //세로정렬 상단:0, 중단:1, 하단:2
cellStyle.setAlignment((short)1); //가로정렬 왼쪽:1, 중간:2, 오른쪽:3
cellStyle.setWrapText(true); //자동 줄바꿈 허용:true, 불가:false
Font font = workbook.createFont();
font.setFontHeightInPoints((short)9);
cellStyle.setFont(font);
//row와 cell 생성하기 위해 rowNo와 cellNo = 0으로 세팅.
rowNo = 0;
Row row = sheet.createRow(rowNo++};
cellNo = 0;
Cell cell = row.createCell(cellNo++);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellStyle(cellStyle);
cell.setCellValue("셀에들어값value");
//HttpServletResponse 엑셀 설정
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition:", "attachment; filename=" + new String(orgFileName.getBytes(), "UTF-8"));
엑셀 다운로드 예제 코드
ZipSecureFile.setMinInflateRatio(0);
try (OutputStream os=response.getOutputStream()){
//workbook 생성
Workbook workbook = new SXSSFWorkbook();
Sheet sheet = workbook.createSheet(excelVO.getSheetName());
sheet.createFreezePane(excelVO.getFreezePaneCol(), excelVO.getFreezePaneRow());
//data 가져오기
List<DataVO> voList = db에서 데이터 조회..
//헤더
int rowNo = 0;
Row row = sheet.createRow(rowNo++);
int cellNo = 0;
Cell cell = null;
CellStyle headerCellStyle = workbook.createCellStyle();
//배경색상 setFillBackgroundColor- X, setFillForegroundColor - O
headerCellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
headerCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
String[] headers = {"header1", ""header2", ""header3"};
for (int i=0; i<excelVO.getCellVOList().size(); i++) {
CellVO cellVO = excelVO.getCellVOList().get(i);
cell = row.createCell(cellNo++);
cell.setCellStyle(headerCellStyle);
cell.setCellValue(cellVO.getHeader()); //setCellValue(): setCellType()확인하여 값 세팅..
}
//데이터
for (Vo vo : voList) {
row = sheet.createRow(rowNo++);
cellNo = 0;
cell = row.createCell(cellNo++);
cell.setCellValue(vo.getXXXXXX());
cell = row.createCell(cellNo++);
cell.setCellValue(vo.getXXXXXX());
cell = row.createCell(cellNo++);
cell.setCellValue(vo.getXXXXXX());
}
String orgFileName = "엑셀 파일명";
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition:", "attachment; filename=" + new String(orgFileName.getBytes(), "UTF-8"));
workbook.write(os);
os.flush();
os.close(); } catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
반응형
'Java' 카테고리의 다른 글
Stack에 대하여 (2) | 2022.10.05 |
---|---|
Queue 에 대하여 (2) | 2022.10.05 |
System.getProperty() 란? (0) | 2022.03.30 |
[Java] Java8 Stream 사용법 (0) | 2022.03.29 |
ApachePOI에 대하여 (0) | 2022.02.16 |