POI?
아파치에서 만든 java로 엑셀을 핸들링할 수 있게 해주는 라이브러리 입니다.
의존성 (gradle)
implementation group: 'org.apache.poi', name: 'poi', version: '4.1.2'
implementation group: 'org.apache.poi', name: 'poi-ooxml', version: '4.1.2' // .xlsx 를 사용하려면 해당 의존성을 추가해야합니다.
사용법
기본 적인 사용법은 간단합니다.
용어
- workbook
- 하나의 엑셀파일을 의미합니다.
- 가장 큰 단위로 생각 하면 됩니다.
- sheet
- sheet는 말그대로 엑셀 시트를 생성해 주는 것 입니다.
- Sheet sheet = workbook.createSheet("시트명");
- row
- 행
- cell
- 열 (컬럼)
위 네가지 용어만 알면 쉽게 사용 할 수 있습니다.
먼저 workbook 을 생성하는데 워크북에는 xls 를 만들어주는 클래스(HSSFWorkbook), xlsx를 만들어주는 클래스(XSSFWorkbook) 대용량 엑셀을 만들때 사용하는 클래스 정도가 있는것 같습니다.
그리고 그 workbook 안에 목차 (sheet)를 생성해주고
그 sheet안에 엑셀을 상상하며 행과 열을 만들어가며 엑셀을 만들어 주면 되는 것 입니다.
sheet
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("시트명");
// 컬럼 너비 설정
sheet.setColumnWidth(0, 5000);
sheet.setColumnWidth(1, 3000);
첫번째 인자는 컬럼 인덱스 위치를 넣어주고 두번째 인자에 너비를 넣어줍니다.
ROW & Cell
row 를 만들고 cell을 생성해준다
이 순서만 이해하고 진행하면 쉽게 만들 수 있습니다.
row = sheet.createRow(0);
Row row = null;
Cell hCell = null;
hCell = row.createCell(i); // 위 0번째 로우에 i번째 셀을 생성하겠다
hCell.setCellValue(headerKey[i]);
hCell.setCellStyle(headerStyle); // 스타일 객체넣어서 셀에 스타일 입히기
Style
저는 다른 분이 만든거 참고정도만 하고 더 다양하게 할 수 있습니다.
핵심은 Style객체를 만들어서 cell객체 하나하나마다 style객체를 넣어주는것이 핵심입니다.
public CellStyle CellStyleSetting(Workbook workbook, String kind) {
//테이블 스타일
CellStyle cellStyle = workbook.createCellStyle();
//가는 경계선
cellStyle.setBorderTop(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
if (kind.equals("header")) {
//배경색 회색
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
}
//데이터는 가운데 정렬
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //중앙 정렬
//폰트 설정
Font fontOfGothic = workbook.createFont();
fontOfGothic.setFontName("맑은 고딕");
cellStyle.setFont(fontOfGothic);
return cellStyle;
}
Response api
// 위에서 만든 Workbook 객체를 받아온다
try {
String fileName = URLEncoder.encode("테스트", StandardCharsets.UTF_8).replaceAll("\\+", "%20");
File tmpFile = File.createTempFile("TMP~", ".xlsx");
try (OutputStream fos = new FileOutputStream(tmpFile)) {
workbook.write(fos);
}
InputStream res = new FileInputStream(tmpFile) {
@Override
public void close() throws IOException {
super.close();
if (tmpFile.delete()) {
log.info("삭제완료")
}
}
};
return ResponseEntity.ok()
.contentLength(tmpFile.length())
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", String.format("attachment;filename=\"%s.xlsx\";", fileName))
.body(new InputStreamResource(res));
'Springboot' 카테고리의 다른 글
쿼리 매소드 fetch 조인 적용 (0) | 2023.08.17 |
---|---|
[JPA] @GeneratedValue의 Auto_increment 미적용 될때 (0) | 2023.08.17 |
Spring boot Static 필드에 @Value 사용 (0) | 2023.08.16 |
springboot + fluentd + mongoDB 연동 (0) | 2023.08.16 |
spring boot logback으로 error 로그만 파일로 남기기 (0) | 2023.08.16 |