Java

[Java] POI 라이브러리 엑셀 다운로드

nan2 2022. 5. 18. 12:09
반응형

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