Appearance
BizPivotTable 透视表
数据透视表:扁平明细数据 → 行/列维度交叉汇总,纯前端聚合零依赖。行维度多级嵌套(rowspan 合并)、列维度多层表头,指标支持 sum / count / avg / max / min / custom 多个并列;一级行分组小计 + 总计行;单元格点击下钻回传维度路径与命中的原始记录;expose exportCsv 一键导出当前透视结果(含 BOM,Excel 打开不乱码)。
适用于:报表中心、销量/营收多维统计(大区×月份、渠道×产品)、绩效汇总、运营日报——过去只能在服务端拼宽表或手写 reduce 的场景。
与 BizTable 的分工
BizTable 是明细行渲染(一行一条记录);本组件是多维交叉汇总(一格一个聚合值)。两者常配合:透视表看总量、cell-click 下钻弹明细表(见下钻示例,明细弹窗直接用 openBizDrawer)。
基础透视
| 大区 | 7月 | 8月 | 9月 |
|---|---|---|---|
| 华东 | 907,147 | 830,645 | 1,028,178 |
| 658,246 | 664,568 | 633,966 | |
| 639,400 | 731,012 | 638,132 | |
| 总计 | 2,204,793 | 2,226,225 | 2,300,276 |
多级维度嵌套
| 大区 / 城市 | 线上 | 门店 | 分销 | |
|---|---|---|---|---|
| 华东 | 上海 | 263,553 | 345,011 | 228,161 |
| 华东 | 325,582 | 294,798 | 376,368 | |
| 华东 | 329,637 | 301,103 | 301,757 | |
| 华东 小计 | 918,772 | 940,912 | 906,286 | |
| 北京 | 354,511 | 349,196 | 289,456 | |
| 297,149 | 380,551 | 285,917 | ||
| 华北 小计 | 651,660 | 729,747 | 575,373 | |
| 深圳 | 303,025 | 320,189 | 354,307 | |
| 245,864 | 360,708 | 424,451 | ||
| 华南 小计 | 548,889 | 680,897 | 778,758 | |
| 总计 | 2,119,321 | 2,351,556 | 2,260,417 | |
多指标并列
| 大区 | 7月 | 8月 | 9月 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| 销售额 | 订单数 | 客单价 | 销售额 | 订单数 | 客单价 | 销售额 | 订单数 | 客单价 | |
| 华东 | 907,147 | 709 | 33598 元 | 830,645 | 635 | 30765 元 | 1,028,178 | 864 | 38081 元 |
| 658,246 | 591 | 36569 元 | 664,568 | 513 | 36920 元 | 633,966 | 514 | 35220 元 | |
| 639,400 | 550 | 35522 元 | 731,012 | 579 | 40612 元 | 638,132 | 524 | 35452 元 | |
| 总计 | 2,204,793 | 1,850 | 34997 元 | 2,226,225 | 1,727 | 35337 元 | 2,300,276 | 1,902 | 36512 元 |
聚合方式切换
| 产品 | 线上 | 门店 | 分销 |
|---|---|---|---|
| 传感器 | 702,617 | 748,405 | 749,363 |
| 699,714 | 657,690 | 690,928 | |
| 716,990 | 945,461 | 820,126 | |
| 总计 | 2,119,321 | 2,351,556 | 2,260,417 |
小计与总计
分组小计
总计行
| 大区 / 产品 | 线上 | 门店 | 分销 | |
|---|---|---|---|---|
| 华东 | 传感器 | 291,731 | 275,285 | 314,896 |
| 华东 | 346,812 | 319,901 | 308,203 | |
| 华东 | 280,229 | 345,726 | 283,187 | |
| 华东 小计 | 918,772 | 940,912 | 906,286 | |
| 传感器 | 203,184 | 276,602 | 193,070 | |
| 160,580 | 192,964 | 139,782 | ||
| 287,896 | 260,181 | 242,521 | ||
| 华北 小计 | 651,660 | 729,747 | 575,373 | |
| 传感器 | 207,702 | 196,518 | 241,397 | |
| 192,322 | 144,825 | 242,943 | ||
| 148,865 | 339,554 | 294,418 | ||
| 华南 小计 | 548,889 | 680,897 | 778,758 | |
| 总计 | 2,119,321 | 2,351,556 | 2,260,417 | |
单元格下钻
| 大区 / 产品 | 7月 | 8月 | 9月 | ||||
|---|---|---|---|---|---|---|---|
| 销售额 | 订单数 | 销售额 | 订单数 | 销售额 | 订单数 | ||
| 华东 | 传感器 | 227,303 | 205 | 239,446 | 218 | 415,163 | 314 |
| 华东 | 417,673 | 268 | 236,430 | 172 | 320,813 | 292 | |
| 华东 | 262,171 | 236 | 354,769 | 245 | 292,202 | 258 | |
| 传感器 | 201,317 | 164 | 163,333 | 121 | 308,206 | 216 | |
| 188,242 | 199 | 164,715 | 149 | 140,369 | 132 | ||
| 268,687 | 228 | 336,520 | 243 | 185,391 | 166 | ||
| 传感器 | 170,914 | 185 | 218,798 | 189 | 255,905 | 205 | |
| 171,352 | 161 | 213,373 | 179 | 195,365 | 162 | ||
| 297,134 | 204 | 298,841 | 211 | 186,862 | 157 | ||
| 总计 | 2,204,793 | 1,850 | 2,226,225 | 1,727 | 2,300,276 | 1,902 | |
点击任意有数据的值单元格,弹窗展示该格命中的原始明细(行列维度路径 + 记录全集,可直接对接明细页/导出)。
预置分析方案
| 大区 | 7月 | 8月 | 9月 |
|---|---|---|---|
| 华东 | 907,147 | 830,645 | 1,028,178 |
| 658,246 | 664,568 | 633,966 | |
| 639,400 | 731,012 | 638,132 | |
| 总计 | 2,204,793 | 2,226,225 | 2,300,276 |
导出 CSV
| 大区 | 线上 | 门店 | 分销 |
|---|---|---|---|
| 华东 | ¥918,772 | ¥940,912 | ¥906,286 |
| ¥651,660 | ¥729,747 | ¥575,373 | |
| ¥548,889 | ¥680,897 | ¥778,758 | |
| 总计 | ¥2,119,321 | ¥2,351,556 | ¥2,260,417 |
加载/空态与自定义单元格
| 大区 | 线上 | 门店 | 分销 |
|---|---|---|---|
| 华东 | 918,772 | 940,912 | 906,286 |
| 651,660 | 729,747 | 575,373 | |
| 548,889 | 680,897 | 778,758 | |
| 总计 | 2,119,321 | 2,351,556 | 2,260,417 |
#cell 插槽可拿到聚合上下文 ctx(值/维度路径/原始记录)——此处对超 30 万的单元格红字加粗。
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| data | Array<Record<string, unknown>> | [] | 扁平源数据(一行一条明细,前端聚合) |
| rows | PivotDimension[] | [] | 行维度(至少 1 个,多个依次嵌套) |
| cols | PivotDimension[] | [] | 列维度(为空 = 不做列拆分,指标作唯一表头) |
| measures | PivotMeasure[] | [] | 指标(至少 1 个,多个并列展示) |
| show-subtotal | boolean | false | 一级行分组小计(行维度 ≥2 时生效) |
| show-total | boolean | true | 总计行(无数据自动隐藏) |
| size | 'small' | 'default' | 'large' | 'default' | 尺寸 |
| empty-text | string | '暂无数据' | 空数据文案 |
| loading | boolean | false | 加载中覆盖浮层 |
| border | boolean | true | 是否显示表格边框 |
PivotDimension 结构:{ field; title?; sort?: 'asc' | 'desc'; formatter? }——field 为取值字段;缺省排序按数据首次出现顺序。
PivotMeasure 结构:{ field; title?; aggregate?; aggregator?; formatter? }——aggregate 缺省 sum;custom 时用 aggregator 自定义聚合函数;formatter 只对数值结果生效(count/custom 返回字符串时原样展示)。
Events
| 事件名 | 参数 | 说明 |
|---|---|---|
| cell-click | (ctx: PivotCellContext) | 点击有数据的值单元格(空格与小计/总计格不触发);ctx 含 rowDims / colDims 维度路径、measure、value 聚合值、records 命中原始记录 |
Slots
| 插槽名 | 作用域 | 说明 |
|---|---|---|
| cell | { ctx: PivotCellContext | null, text: string } | 自定义值单元格(着色、加图标、迷你条等) |
| empty | — | 空数据内容 |
Expose
| 名称 | 类型 | 说明 |
|---|---|---|
| exportCsv | (fileName?: string) => void | 导出当前透视结果为 CSV(含 BOM) |
| getModel | () => PivotModel | 当前渲染模型(表头矩阵 + 渲染行,自渲染/调试用) |
聚合引擎导出
引擎为纯函数,自渲染场景(如虚拟滚动大表、SSR 拼表)可直接复用:
| 导出 | 说明 |
|---|---|
| buildPivotModel(data, rows, cols, measures, options) | 扁平数据 → 透视渲染模型 |
| pivotModelToCsv(model, dimCount) | 渲染模型 → CSV 文本 |
| aggregateRecords(measure, records) | 单指标聚合 |
| dimKeyOf(value) | 维度取值归一(空值显示「(空)」) |