매번 들어오는 원본 데이터
| A | B | C | D | |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 |
고객, 금액, 담당자처럼 매번 바뀌는 데이터를 .xlsx 또는 JSON으로 전달합니다. 아직 템플릿을 적용하기 전의 입력 데이터입니다.
동작 방식
Excel에서 양식 을 디자인하고 데이터를 연결하면 xl3가 문서를 생성합니다. 원본 데이터 → 템플릿 → 결과를 나란히 비교해 보세요.
| A | B | C | D | |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 | ||||
| 5 | ||||
| 6 | ||||
| 7 | ||||
| 8 |
고객, 금액, 담당자처럼 매번 바뀌는 데이터를 .xlsx 또는 JSON으로 전달합니다. 아직 템플릿을 적용하기 전의 입력 데이터입니다.
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Customer Renewal Report | ||||
| 2 | |||||
| 3 | |||||
| 4 | |||||
| 5 | |||||
| 6 | |||||
| 7 | |||||
| 8 | |||||
Excel에서 제목 배경색, 글꼴, 테두리와 셀 병합을 디자인합니다. 데이터가 들어갈 셀에는 XTL {{ … }}을 작성합니다.
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Customer Renewal Report | ||||
| 2 | |||||
| 3 | |||||
| 4 | |||||
| 5 | |||||
| 6 | |||||
| 7 | |||||
| 8 | |||||
데이터가 달라져도 템플릿의 제목 배경색, 글꼴, 셀 병합, 테두리와 숫자 서식은 그대로 유지됩니다.
책임 기반 자동화
대부분의 Excel 자동화 도구는 개발자를 더 빠르게 만듭니다. xl3는 다른 결과를 지향합니다 — 예전에는 개발자가 필요했던 문서 변경을 운영자가 직접 맡도록 하는 것입니다. 모든 거래처가 저마다의 포맷을 요구할 때, 개발자 한 명이 그 포맷을 하나씩 구현하고 바뀔 때마다 다시 고치는 구조는 병목이 됩니다.
xl3는 수개월간 운영된 사내 서비스에서 다듬어졌습니다. 그 기간 동안 비개발자들이 Excel에서 직접 템플릿과 변환 규칙을 유지했고, 개발자는 거의 전적으로 런타임에 집중했습니다. 실제로 줄어든 것은 코드의 양이 아니라, 애초에 개발자가 손대야 하는 일의 양이었습니다.
런타임을 소유합니다: 엔진 동작, 검증, 통합, 배포, 안정성.
runtime템플릿을 소유합니다: 레이아웃, 열, 반복 규칙, 출력 형식, 문서별 로직 — Excel에서 직접 편집합니다.
template.xlsx문서가 조금 바뀔 때마다 릴리스를 기다리지 않고, 완성된 Excel 파일을 바로 받아 씁니다.
result.xlsxxl3는 개발자를 대체하려는 것이 아닙니다. 개발자는 런타임을, 운영자는 템플릿을 소유하며, 문서 자동화는 개발자만의 업무가 아니라 조직의 역량이 됩니다.
왜 Excel이 템플릿인가
ExcelJS, SheetJS, openpyxl, Apache POI는 스프레드시트의 DOM API입니다. 강력하지만 장황합니다. 리포트 레이아웃, 스타일, 병합 셀, 반복이 코드에 들어가면 열 하나 추가, 소계 이동, 헤더 서식 변경 같은 모든 디자인 변경이 배포가 됩니다.
xl3는 매번 되풀이되는 그 규칙을 다시 Excel 안으로 돌려놓습니다. Excel 파일은 이미 뷰이고, XTL이 이를 실행 가능하게 만듭니다. 애플리케이션은 데이터를 공급하고 엔진을 실행할 뿐입니다. 템플릿은 평범한 .xlsx이므로 — 매크로도, 벤더 클라우드도 없습니다 — diff를 뜨고, 풀 리퀘스트에서 리뷰하고, xl3를 들어본 적 없는 사람에게 건넬 수 있습니다.
라이브러리가 아니라 열린 표준
xl3는 세 부분으로 이루어진, 구현에 독립적인 열린 표준으로 정의됩니다. XTL의 표현 범위는 의도적으로 작게 유지해, 템플릿을 사람이 읽기도 AI가 초안을 쓰기도 쉽습니다.
규범적 정의: xl3 워크북 포맷과 그 작은 임베디드 표현 언어인 XTL. 함수는 파일이 만들어지기 전에 값이 정해져야 할 때만 XTL에 존재합니다 (ADR-0043).
spec/모든 구현이 실행해 적합성을 증명하는 언어 중립적 픽스처. 다른 언어 이식이 맞춰야 하는 계약은 특정 구현이 아니라 이 픽스처 모음입니다.
conformance/@xl3-lang/xl3(TypeScript)는 브라우저와 Node에서 실행됩니다. 유용하지만 규범은 아닙니다. Rust/WASM과 Python 이식이 진행 중입니다.
@xl3-lang/xl3XTL 0.1은 79 ADRs와 171 conformance fixtures를 갖추고 있으며, Stage 2에서 모두 통과합니다. TypeScript 레퍼런스 구현은 @xl3-lang/xl3에 게시되어 있습니다. 포팅 가이드가 계약을 문서화해, 다른 언어 이식이 이를 맞출 수 있게 합니다.
비교
| 접근 방식 | 강점 | 트레이드오프 |
|---|---|---|
| xl3 | 선언적 Excel 템플릿 실행. Excel 파일은 이미 존재하고, xl3가 데이터를 넣어 실행합니다. | 릴리스 후보, 단일 메인테이너, 1.0 계약은 2026-11-28까지 기술 안정화 중입니다. |
| Workbook APIs (ExcelJS, SheetJS, openpyxl, POI) | 애플리케이션 코드에서 저수준 또는 완전한 기능의 Excel 파일 생성. | 레이아웃, 스타일, 병합, 반복, 비즈니스 규칙이 코드가 됩니다. 비개발자는 템플릿을 안전하게 편집할 수 없습니다. |
| Python / VBA scripts | 기존 스프레드시트에 가까운 빠른 일회성 자동화. | 규칙이 코드나 한 담당자의 기억 속에 존재하며, 레이아웃 변경에는 여전히 코드 수정이 필요합니다. |
| Power Query / Office Scripts | Excel 생태계 안에서의 Microsoft 365 워크플로와 데이터 정형화. | 테넌트에 종속되며, 워크플로 규칙이 Excel 파일과 함께 이동하지 않습니다. |
| Template engines (JXLS, xltpl, jsreport xlsx) | 스프레드시트형 템플릿에서의 서버 사이드 리포트 생성. | 유용한 선행 사례지만, 대개 하나의 런타임에 묶여 있고 작고 이식 가능한 Excel 규칙 포맷으로 자리 잡지는 못했습니다. |
| Doc-gen SaaS (Plumsail, Conga, Formstack) | 관리형 문서 워크플로, 통합, 승인, 전달. | 규칙이 벤더 서비스에 존재하며, 직접 검토하고 실행할 수 있는 이식 가능한 Excel 템플릿이 아닙니다. |
| Direct LLM → xlsx | 빠른 탐색적 초안 작성, 일회성 차트. | 반복 운영을 위한 결정론적 변환 계약이 아니며, 실행할 때마다 스타일과 합계가 달라집니다. |
개발자 API
애플리케이션이 이미 메모리에 가진 데이터를 넘기고, Excel 템플릿을 적용해 완성된 .xlsx 파일을 받으세요. convertJson()은 JavaScript 객체를 직접 받으므로 원본 데이터 파일이나 중간 workbook이 필요하지 않습니다.
$npm install @xl3-lang/xl3import { convertJson } from '@xl3-lang/xl3';
const outputs = await convertJson(templateBuffer, {
version: 'xl3-source-json/0.1',
sources: { default: {
headers: ['Customer', 'Amount'],
rows: orders.map(o => [o.customer, o.amount]),
} },
});
// OutputFile[].data → .xlsx Uint8Array5분 만에 시작하기 · 명세 읽기 · 포팅 가이드