案例:10 万行大文件导出
大数据量导出是 Fast stream 路径的目标场景:10 万行在浏览器 Worker 中执行,主线程仅做一次结构化克隆,Fast stream 约 0.8s 完成。
Mock 数据预览
| 订单号 | 日期 | 区域 | 商品 | 渠道 | 数量 | 单价 | 金额 | 状态 |
|---|---|---|---|---|---|---|---|---|
| ORD-000001 | 2026-07-21 | 华东 | USB-C 扩展坞 | 线上 | 18 | 789.44 | 14209.92 | pending |
| ORD-000002 | 2026-07-28 | 西南 | 显示器支架 | 线上 | 5 | 1127.47 | 5637.35 | paid |
| ORD-000003 | 2026-07-15 | 东北 | 机械键盘 | 线下 | 1 | 898.61 | 898.61 | paid |
实现代码
ts
import { exportExcel } from "@marcusok/excel-exporter";
// rows:业务侧的销售明细数据,字段与下方 columns 一一对应
//(由你的业务代码提供,此处省略取数过程;示例场景为 10 万行,
// 在线演示用的是同一销售场景的 mock 数据,列数为完整列集)
const result = await exportExcel({
filename: "大文件导出-10w",
sheets: [
{
name: "销售明细",
columns: [
{ prop: "orderId", label: "订单号", width: 18 },
{ prop: "date", label: "日期", width: 12 },
{ prop: "amount", label: "金额", width: 14 },
{ prop: "status", label: "状态", width: 10 },
],
data: rows,
},
],
mode: "auto", // ≥ 5 万行自动走 worker + stream
onProgress: (p) => setProgress(p),
});
console.log(result); // engine: "modern-xlsx", mode: "stream", rowCount: 100000要点
- 10 万行下
auto选择worker + Fast stream,实测约 0.8s(Workbook 路径同数据量 17.5s); - stream 路径支持多行表头与合并,但不支持样式/列宽/冻结/筛选,会打印 console 警告,属预期行为;
onProgress每 1000 行上报一次,适合展示进度;- 数字列建议显式声明
decimals,保证存储值与 Workbook 路径一致。
到 在线演示 选择 100,000 行,切换 auto 与 main 对比体验差异。