PersesTitan(페르) 기술블로그

[Vane] Java 엑셀, csv 변환 라이브러리 xrm (ver 1.1.0) 본문

VaneProject/maven

[Vane] Java 엑셀, csv 변환 라이브러리 xrm (ver 1.1.0)

PersesTitan(페르) 2024. 4. 5. 20:00

Xlsx(Xls) Relational Mapping (xrm)은 엑셀, CSV 파일을 Java클래스 타입으로 변환해 주는 라이브러리입니다.

https://github.com/VaneProject/xrm

 

GitHub - VaneProject/xrm: Xlsx Relational Mapping (Xlsx to Object)

Xlsx Relational Mapping (Xlsx to Object). Contribute to VaneProject/xrm development by creating an account on GitHub.

github.com

 

maven

<dependency>
    <groupId>io.github.vaneproject</groupId>
    <artifactId>xrm</artifactId>
    <version>1.1.0</version>
</dependency>

gradle

implementation 'io.github.vaneproject:xrm:1.1.0'

gradle.kts

implementation("io.github.vaneproject:xrm:1.1.0")

어노테이션

@XrmSheet

엑셀의 시트 상태를 정의하는 어노테이션으로 클래스의 최상위에 사용합니다.

  • value (String) : 시트 이름을 지정하는 값으로 기본값으로 클래스명이 지정됩니다.
  • header (int) : 머리말의 행을 지정하는 값으로 기본값으로는 첫번째 행인 1이 지정됩니다.
  • data (int) : 데이터의 행을 지정하는 값으로 기본값으로 두번째 행인 2가 지정됩니다.

 

@Xrm

각 열의 상태를 지정하는 어노테이션으로 각 필드 (변수)에 지정하여 사용합니다.

  • value (String) : 해당 값과 머리말에 일치할 경우 값이 저장되며 기본값으로 변수명이 지정됩니다.

사용예시

@XrmSheet(value = "sheet1", header = 2, data = 3)
public class XrmTest {
    @Xrm("count")
    private int number;
    @Xrm
    private String name;
    @Xrm
    private String gender;
}

 

 

@CsvSheet

csv타입의 파일을 상태를 정의할때 사용하는 어노테이션으로 클래스의 최상단에 사용됩니다.

  • seq (String) : csv파일의 구분자를 지정하는 값으로 기본값으로 콤마(,)가 지정됩니다.

@Csv

각 열의 상태를 지정하는 어노테이션으로 각 필드(변수)에 지정하여 사용합니다.

  • value (String) : 해당 값과 머리말이 일치할 경우 값이 부여되며 기본값으로 변수명이 지정됩니다.
  • format (Class) : 지원하지 않는 타입을 사용할 경우 XrmFormat을 상속한 클래스를 등록하여 포맷을 지정할 수 있습니다.

사용예시

@CsvSheet
public class CsvTest {
    @Csv("count")
    private int number;
    @Csv
    private String name;
    @Csv
    private String gender;
    @Csv(format = LocalDateTimeFormat.class)
    private LocalDateTime date;

    public void print() {
        System.out.printf("count: %d, name: %s, gender: %s, date: %s%n", number, name, gender, date);
    }
}

 

XrmFormat 사용법

XrmFormat<변환할 클래스> 형태로 지정됩니다.

셀에 존재하는 String타입의 값의 파라미터를 이용하여 변환할 타입을 return하여 만들 수 있습니다.

 

LocalDateTime으로 변환하는 코드는 다음과 같습니다.

import java.time.LocalDateTime;

public class LocalDateTimeFormat extends XrmFormat<LocalDateTime> {
    @Override
    public LocalDateTime format(String s) {
        return LocalDateTime.parse(s);
    }
}

 

파일 읽기 예제

XlsxRead

@XrmSheet(value = "sheet1", header = 2)
public class XlsxExample1 {
    @Xrm
    private int number;
    @Xrm
    private String name;
    @Xrm
    private String gender;

    public void print() {
        System.out.printf("number: %d, name: %s, gender: %s%n", number, name, gender);
    }
}
XlsxRead<XlsxExample1> read = new XlsxRead<>(XlsxExample1.class, /* 파일 경로 */);

System.out.println("Print all");
List<XlsxExample1> all = read.getAll();
for (XlsxExample1 example : all)
    example.print();

System.out.println("Print one");
XlsxExample1 example1 = read.get(0);
example1.print();

 

출력

Print all
number: 1, name: name1, gender: male
number: 2, name: name2, gender: female
number: 3, name: name3, gender: male
Print one
number: 1, name: name1, gender: male

 

CsvRead

@CsvSheet
public class CsvExample3 {
    @Csv("count")
    private int number;
    @Csv
    private String name;
    @Csv
    private String gender;
    @Csv(format = LocalDateTimeFormat.class)
    private LocalDateTime date;

    public void print() {
        System.out.printf("count: %d, name: %s, gender: %s, date: %s%n", number, name, gender, date);
    }
}
CsvRead<CsvExample3> read = new CsvRead<>(CsvExample3.class, /* 경로 */);
System.out.println("Print all");
List<CsvExample3> all = read.getAll();
for (CsvExample3 example : all)
    example.print();

System.out.println("Print one");
CsvExample3 example1 = read.get(0);
example1.print();

 

출력

Print all
count: 1, name: name1, gender: male, date: 2024-01-01T12:00
count: 2, name: name2, gender: female, date: 2024-01-02T11:00
count: 3, name: name3, gender: male, date: 2024-01-03T10:00
Print one
count: 1, name: name1, gender: male, date: 2024-01-01T12:00