1편에서 TBEG이 무엇인지 알아봤습니다. 이번 편에서는 직접 코드를 작성하면서 TBEG의 핵심 기능을 체험해 봅니다.
// build.gradle.kts
dependencies {
implementation("io.github.jogakdal:tbeg:1.2.3")
}
Groovy / Maven
// build.gradle
dependencies {
implementation 'io.github.jogakdal:tbeg:1.2.3'
}
<!-- pom.xml -->
<dependency>
<groupId>io.github.jogakdal</groupId>
<artifactId>tbeg</artifactId>
<version>1.2.3</version>
</dependency>
위 버전은 이 글의 작성 시점 기준입니다. 최신 버전은 Maven Central에서 확인하세요.
Excel을 열어서 아래처럼 입력합니다:

${...}가 TBEG의 변수 마커입니다. 이 자리에 코드에서 전달한 값이 채워집니다.
import io.github.jogakdal.tbeg.ExcelGenerator
import java.io.File
import java.time.LocalDate
fun main() {
val data = mapOf(
"title" to "월간 보고서",
"date" to LocalDate.now().toString(),
"author" to "황용호"
)
ExcelGenerator().use { generator ->
val template = File("template.xlsx").inputStream()
val bytes = generator.generate(template, data)
File("output.xlsx").writeBytes(bytes)
}
}

끝입니다. output.xlsx를 열어보면 ${title} 자리에 "월간 보고서"가, ${date} 자리에 오늘 날짜가 들어가 있습니다.
Java 코드핵심 패턴:
ExcelGenerator().use { ... }→ 템플릿 읽기 → 데이터 전달 → 바이트 배열 받기. 이 패턴은 이후 모든 예제에서 동일합니다.
import io.github.jogakdal.tbeg.ExcelGenerator;
import java.io.*;
import java.time.LocalDate;
import java.util.*;
public class QuickStart {
public static void main(String[] args) throws Exception {
Map<String, Object> data = new HashMap<>();
data.put("title", "월간 보고서");
data.put("date", LocalDate.now().toString());
data.put("author", "황용호");
try (ExcelGenerator generator = new ExcelGenerator();
InputStream template = new FileInputStream("template.xlsx")) {
byte[] bytes = generator.generate(template, data);
try (FileOutputStream output = new FileOutputStream("output.xlsx")) {
output.write(bytes);
}
}
}
}
실무에서 가장 많이 쓰이는 기능입니다. 직원 목록, 주문 내역, 매출 데이터 등 리스트를 행으로 펼쳐야 할 때 사용합니다.

${repeat(employees, A3:C3, emp)} - "employees 컬렉션의 각 항목을 emp라는 이름으로, A3:C3 범위를 반복해라"data class Employee(val name: String, val position: String, val salary: Int)
fun main() {
val data = mapOf(
"employees" to listOf(
Employee("황용호", "부장", 8000),
Employee("한용호", "과장", 6500),
Employee("홍용호", "대리", 4500),
Employee("김용호", "사원", 3500)
)
)
ExcelGenerator().use { generator ->
val bytes = generator.generate(File("template.xlsx").inputStream(), data)
File("output.xlsx").writeBytes(bytes)
}
}

4명의 데이터가 4행으로 펼쳐졌습니다. 수식(=SUM() 등)이 있었다면 범위가 자동으로 조정됩니다.
Map은 간단하지만, 이미지나 지연 로딩 등 고급 기능을 쓰려면 DataProvider를 사용합니다.
import io.github.jogakdal.tbeg.simpleDataProvider
val provider = simpleDataProvider {
// 단순 변수
value("title", "직원 현황")
value("date", LocalDate.now().toString())
// 컬렉션 (즉시 로딩)
items("employees", employeeList)
// 컬렉션 (지연 로딩) - 데이터가 필요할 때 호출됨
items("bigData") {
repository.streamAll().iterator()
}
// 이미지
image("logo", logoBytes)
imageUrl("banner", "https://example.com/banner.png")
}
ExcelGenerator().use { generator ->
val bytes = generator.generate(template, provider)
}
import io.github.jogakdal.tbeg.SimpleDataProvider;
SimpleDataProvider provider = SimpleDataProvider.builder()
.value("title", "직원 현황")
.value("date", LocalDate.now().toString())
.items("employees", employeeList)
.itemsFromSupplier("bigData", () -> repository.streamAll().iterator())
.image("logo", logoBytes)
.build();
| 방식 | 장점 | 적합한 상황 |
|---|---|---|
| Map | 간단함, 코드량 적음 | 소량 데이터, 단순 보고서 |
| DataProvider | 지연 로딩, 이미지, 메타데이터 | 대용량 데이터, 이미지 삽입, 실무 |
실무에서는 대부분 DataProvider를 사용하게 됩니다.
템플릿에 ${image(logo)} 마커를 넣으면 해당 셀 위치에 이미지가 삽입됩니다.
val provider = simpleDataProvider {
value("company", "TBEG Inc.")
// 파일에서 읽기
image("logo", File("logo.png").readBytes())
// URL로 지정 (렌더링 시 자동 다운로드)
imageUrl("banner", "https://example.com/banner.png")
}
이미지는 바이트 배열 또는 URL 두 가지 방식으로 제공할 수 있습니다. URL 방식은 별도 다운로드 코드 없이 렌더링 시 자동으로 처리됩니다.
바이트 배열 대신 파일로 직접 저장할 수도 있습니다.
ExcelGenerator().use { generator ->
val path = generator.generateToFile(
template = template,
dataProvider = SimpleDataProvider.of(data),
outputDir = Path.of("./output"),
baseFileName = "report"
)
// 결과: ./output/report_20260115_143052.xlsx
}
타임스탬프가 자동으로 붙어서 파일명 충돌을 방지합니다.
1. Excel에서 템플릿 디자인 (서식, 차트, 수식 등 자유롭게)
2. 데이터 들어갈 자리에 ${변수명} 마커 배치
3. 리스트 데이터는 ${repeat(컬렉션, 범위, 변수)} 사용
4. 코드에서 데이터만 전달
5. TBEG이 결합 → 최종 Excel 생성
서식, 차트, 조건부 서식, 수식은 전부 템플릿에서 관리합니다.
코드는 데이터 바인딩에만 집중합니다.
다음 편에서는 TBEG의 템플릿 문법을 완전히 정복합니다. repeat의 다양한 옵션(DOWN/RIGHT 방향, 중첩 반복), 자동 셀 병합(merge), 요소 묶음(bundle), 빈 컬렉션 처리 등을 다룹니다.
📖 상세 문서