自动模式路由
exportExcel 的 mode 参数默认是 "auto":库根据总行数与运行环境自动选择最优路径,业务代码无需感知数据量变化。
路由规则
浏览器
| 数据量 | 路径 | 说明 |
|---|---|---|
< 20,000 行 | main | 主线程同步构建,10k×6 列浏览器实测约 120ms |
20,000 – 49,999 行 | worker + Workbook | 主线程只做一次结构化克隆(10 万行约 94ms),WASM 在 Worker 内执行 |
>= 50,000 行 | worker + Fast stream | 自研 fflate 写入,避免 toBuffer 性能断崖 |
Node / SSR(无 Web Worker)
| 数据量 | 路径 | 说明 |
|---|---|---|
< 50,000 行 | main | 主线程 Workbook 构建,保留完整样式 |
>= 50,000 行 | stream | Fast stream,10 万行约 0.8s |
手动指定
ts
await exportExcel({ ..., mode: "stream" }); // 强制流式
await exportExcel({ ..., mode: "worker" }); // 强制 Worker(浏览器)
await exportExcel({ ..., mode: "main" }); // 强制主线程mode: "worker" 在 Node/SSR 环境不会报错:库会回退到主线程路径(≥ 5 万行用 stream),保证样式语义不丢失,而不是降级成无样式的流式路径。
阈值为什么是 20,000 / 50,000
- 20,000 行:主线程同步工作在此量级以下可接受,避免不必要的 Worker 启动开销;
- 50,000 行:实测
Workbook.toBuffer()在 ~5.5 万行开始出现超线性性能断崖(10 万行 ~17.5s),而 Fast stream 约 0.8s。STREAM_THRESHOLD = 50_000保留了安全余量。
代价说明:Stream 路径支持多行表头与单元格合并,但不支持单元格样式、表头样式与列宽/冻结/筛选等布局特性。需要完整样式的导出请控制在 5 万行以内,或拆分为多个工作表。