Excel 시트 생성 및 Excel 관련 기능을 빠르게 구현하는 Excel module입니다.
JitPack에서 excel-simple-download 사용하기
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
XML
복사
step1 add
<dependency>
<groupId>com.github.jeongjinuk</groupId>
<artifactId>excel-simple-download</artifactId>
<version>Tag</version>
</dependency>
XML
복사
step2 add
기본 필수 구현
ExcelFile<T>를 상속 받아 renderExcel(List<T> list)을 구현할 수 있습니다. 또한 생성자를 통해 원하는 WorkBook구현을 선택할 수 있습니다. 만약 List<T> data 에 대한 검증이 필요하다면 validate(List<T> data) 를 재정의하면 됩니다.
renderExcel(List<T> list)재정의에서는 다음의 3가지를 사용할 수 있습니다.
renderHeader(Sheet sheet, int rowIndex) : 필드이름 삽입 시점 및 필드이름 위치 결정
renderBody(Sheet sheet, int rowIndex, T data) : 데이터 셀 삽입 시점 및 데이터 셀 삽입 위치 결정
renderFormula(Sheet sheet, int criteriaRowIndex, List<T> data) : 수식이 적용된 셀 삽입 시점 및 위치 결정
public class MyExcelFile<T> extends ExcelFile<T> {
protected MyExcelFile(List<T> data, Class<?> clazz) {
super(data, clazz, new SXSSFWorkbook());
}
@Override
protected void validate(List<T> data) {
// do nothing
}
@Override
protected void renderExcel(List<T> list) {
Workbook workbook = this.getWorkbook();
Sheet sheet = workbook.createSheet();
renderHeader(sheet, 0); // 필드 명 삽입 시점과 위치 결정
for (int i = 1; i < list.size(); i++) {
renderBody(sheet, i, list.get(i)); // 데이터 셀 삽입 시점과 위치 결정
}
}
}
Java
복사
간단하게 사용하기
필수 구현이 완료되었다면 @ExcelColumn을 사용하여 WorkBook을 렌더링 할 수 있습니다.
아래 예시를 참고 하세요.
@Builder
public class ExcelDto {
@ExcelColumn(headerName = "연번코드")
private String indexCode;
@ExcelColumn(headerName = "나이")
private int age;
@ExcelStyle(format = "yyyy-mm-dd")
@ExcelColumn(headerName = "생일")
private LocalDate birthDay;
}
Java
복사
public class Application {
public static void main(String[] args) {
String indexCodeFormat = "%s-%s";
LocalDate now = LocalDate.now();
List<ExcelDto> targetDto = IntStream.rangeClosed(0, 10)
.mapToObj(operand -> new ExcelDto.ExcelDtoBuilder()
.indexCode(String.format(indexCodeFormat, operand, operand))
.age(operand)
.birthDay(now.minusDays(operand))
.build()
).collect(Collectors.toList());
MyExcelFile<ExcelDto> myExcelFile = new MyExcelFile<ExcelDto>(targetDto,ExcelDto.class);
Workbook workbook = myExcelFile.getWorkbook();
}
}
Java
복사
위와 같이 @ExcelColumn을 사용하여 간단히 Excel의 필드이름을 지정할 수 있습니다.
커스텀 옵션 제공
@ExcelFormula
만약 아래와 같이 수식을 삽입해야한다면 @ExcelFormula 를 사용하면 됩니다. @ExcelFormula(foramulaClass = class)에 지정된 클래스를 찾아 실행 시킵니다. formulaClass 옵션을 사용하려면 Formula interface를 상속받아 사용하세요.
@Builder
@ExcelFormula(formulaClass = AverageFormula.class)
public class ExcelDto {
@ExcelColumn(headerName = "연번코드")
private String indexCode;
@ExcelColumn(headerName = "나이")
private int age;
@ExcelStyle(format = "yyyy-mm-dd")
@ExcelColumn(headerName = "생일")
private LocalDate birthDay;
}
Java
복사
필수 구현 및 renderFormula(Sheet sheet, int criteriaRowIndex, List<T> data) 실행
public class AverageFormula implements Formula {
@Override
public void validate(SheetHelper sheet, int criteriaRowIndex, List<?> data) {}
@Override
public void render(SheetHelper sheet, int criteriaRowIndex, List<?> data) {
String formula = "AVERAGE(%s:%s)";
String start = sheet.getCellAddressByFieldName(criteriaRowIndex, "age");
String end = sheet.getCellAddressByFieldName(data.size()-1, "age");
Cell targetCell = sheet.getCellByFieldName(data.size(), "age");
sheet.setFormulaCell(targetCell,String.format(formula, start, end));
}
}
Java
복사
public class MyExcelFile<T> extends ExcelFile<T> {
protected MyExcelFile(List<T> data, Class<?> clazz) {
super(data, clazz, new SXSSFWorkbook());
}
@Override
protected void validate(List<T> data) {
// do nothing
}
@Override
protected void renderExcel(List<T> list) {
Workbook workbook = this.getWorkbook();
Sheet sheet = workbook.createSheet();
renderHeader(sheet, 0);
for (int i = 1; i < list.size(); i++) {
renderBody(sheet, i, list.get(i));
}
renderFormula(sheet, 1, list); // 수식 사용을 위하여 시점과 위치 지정
}
}
Java
복사
@ExcelStyle
만약 아래와 같이 스타일 설정이 필요하다면 @ExcelStyle을 사용하면 됩니다. @ExcelStyle에는 총 3가지 옵션이 존재하며 어노테이션의 위치에 따라 Sheet에 대한 옵션과 Column에 대한 옵션으로 나누어 집니다.
@Builder
@ExcelFormula(formulaClass = AverageFormula.class)
@ExcelStyle(headerStyleClass = DefaultHeaderStyle.class, bodyStyleClass = DefaultBodyStyle.class)
public class ExcelDto {
@ExcelColumn(headerName = "연번코드")
private String indexCode;
@ExcelStyle(headerStyleClass = BackgroundBlue.class, bodyStyleClass = DefaultHeaderStyle.class)
@ExcelColumn(headerName = "나이")
private int age;
@ExcelStyle(format = "yyyy-mm-dd")
@ExcelColumn(headerName = "생일")
private LocalDate birthDay;
}
Java
복사
// 클래스 사용
@ExcelStyle(
headerStyleClass = , // sheet에 삽입된 모든 필드이름에 적용되는 스타일
bodyStyleClass = , // sheet에 삽입된 모든 데이터 셀에 적용되는 스타일
format = ) //sheet에 삽입된 모든 데이터 셀에 적용되는 데이터 포멧
public class ExcelDto{
@ExcelStyle(headerStyleClass = , // 현재 column에 삽입된 필드이름에만 적용되는 스타일
bodyStyleClass = , // 현재 column에 삽입된 데이터 셀에만 적용되는 스타일
format = ) // 현재 column에 삽입된 데이터 셀에만 적용되는 데이터 포멧
int val;
}
Java
복사
필수 구현 및 기본 설정 사용 방법
커스텀 style을 사용하려면 Style interface를 재정의하면 됩니다.
사용방법
public class CustomStyle implements Style {
@Override
public boolean enableDefaultStyle() { // class에 사용된 Style 정보를 사용할지 여부 기본 설정 false
return Style.super.enableDefaultStyle(); // true or false
}
@Override
public void configure(CellStyle cellStyle) {
// cellStyle 지정
}
}
Java
복사
실제 Style재정의
public class DefaultHeaderStyle implements Style {
@Override
public void configure(CellStyle cellStyle) {
cellStyle.setBorderLeft(BorderStyle.DOUBLE);
cellStyle.setBorderRight(BorderStyle.DOUBLE);
cellStyle.setBorderTop(BorderStyle.DOUBLE);
cellStyle.setBorderBottom(BorderStyle.DOUBLE);
}
}
Java
복사
public class DefaultBodyStyle implements Style
@Override
public void configure(CellStyle cellStyle) {
cellStyle.setBorderLeft(BorderStyle.MEDIUM);
cellStyle.setBorderRight(BorderStyle.MEDIUM);
cellStyle.setBorderTop(BorderStyle.MEDIUM);
cellStyle.setBorderBottom(BorderStyle.MEDIUM);
}
}
Java
복사
public class BackgroundBlue implements Style {
@Override
public boolean enableDefaultStyle() { // 만약 기본 설정에서 추가 하고 싶다면 true로 전환
return true;
}
@Override
public void configure(CellStyle cellStyle) {
cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
}
Java
복사