← 카탈로그

📊 Excel 내보내기 · 읽기

SheetJS(xlsx) 기반. 단일 시트 · 다중 시트 · 대용량 스트림까지 한 래퍼로.

샘플 데이터 (25행)

25
ID이름부서점수가입일
1사용자1개발812025-01-15
2사용자2디자인482025-02-15
3사용자3QA642025-03-15
4사용자4기획262025-04-15
5사용자5개발642025-05-15
6사용자6디자인272025-06-15
7사용자7QA272025-07-15
8사용자8기획572025-08-15
9사용자9개발752025-09-15
10사용자10디자인852025-10-15
1 / 3

내보내기 · 읽기 데모

사용법

import { excel } from "~/features/common/excelExporter";

// 1. 단일 시트
excel.exportRows(users, [
    { field: "id", header: "ID", width: 8 },
    { field: "name", header: "이름" },
    { field: "score", header: "점수", numFmt: "#,##0" },
], { fileName: "사용자목록", namuStyle: true });

// 2. AG Grid 현재 화면만 (필터·정렬 반영)
excel.exportFromGrid(api, { fileName: "필터된목록", onlySelected: true });

// 3. 다중 시트
excel.exportMultiSheet([
    { sheetName: "사용자", rows: users, columns: userCols },
    { sheetName: "주문",   rows: orders, columns: orderCols },
], { fileName: "통합리포트" });

// 4. 대용량 스트림 (진행률 표시)
for await (const p of excel.exportLargeAsStream(asyncRowGen, cols, 5000)) {
    setProgress(p.processed / p.estimatedTotal);
}

// 5. 업로드된 엑셀 읽기
const sheets = await excel.readExcel(file);
console.log(sheets[0].rows);

서버 대용량 (Java POI SAX)

10만 행 이상 업로드는 브라우저 OOM 위험 → Java SXSSF/SAX 스트리밍으로 넘기는 것이 안전. 백엔드 예시: POST /api/v1/admin/excel/stream (멀티파트)

curl -X POST http://localhost:8082/api/v1/admin/excel/stream \
  -H "Authorization: Bearer $TOKEN" \
  -F "file=@huge.xlsx"
# → 500만 행도 상수 메모리로 파싱, batch(5000) 씩 서버 로직에 넘김