vxe-table数据分组统计与表尾合计实现方法

作者:袖梨 2026-06-02

数据报表开发中,字段分组统计是常见需求。vxe-table的aggregateConfig和calcValuesMethod功能,配合footerData表尾配置,能高效实现分组求和与总计功能。

属性说明

配置项 / 属性 所在位置 作用
aggregateConfig.groupFields 表格配置(gridOptions) 指定分组字段,例如 ['role'],表格会按该字段对数据进行分组,并在每个分组后插入"分组合计行"
aggregateConfig.calcValuesMethod 表格配置 自定义分组统计值计算函数,接收当前分组的子数据(children)和列信息(column),返回统计值
aggFunc 列配置(columns) 标记该列需要参与聚合计算,配合分组统计使用
footerData 表格配置 手动指定表尾合计行的数据,适用于简单的总计、平均值等,更复杂时可配合 updateFooter 方法动态计算
rowGroupNode 列配置 标识该列作为分组的显示节点,通常设置为 true,使分组后的行可以展开/折叠(示例中使用)

实现分组聚合需要同时配置aggregateConfig.groupFields和至少一列的rowGroupNode:true,参与聚合的列需设置aggFunc:true或自定义聚合函数。

代码

img_6a1e845067ce030.webp

<template>
  <div>
    <vxe-grid v-bind="gridOptions">vxe-grid>
  div>
template><script setup>
import { reactive } from 'vue'// 表尾合计行数据(手动维护总计)
const footerSummaryRow = reactive({
  seq: '总计',
  num: 0
})const gridOptions = reactive({
  border: true,
  showOverflow: true,       // 超出显示省略号
  showFooter: true,         // 开启表尾
  height: 500,
  loading: false,  // 分组聚合配置
  aggregateConfig: {
    groupFields: ['role'],   // 按角色字段分组
    // 自定义分组统计值的计算方法
    calcValuesMethod({ column, children }) {
      // 只对 num 列进行求和
      if (column.field === 'num') {
        let sum = 0
        children.forEach(item => {
          sum += item.num
        })
        return sum
      }
      // 其他列不统计,返回 0 或空字符串
      return 0
    }
  },  // 列定义
  columns: [
    { type: 'seq', width: 70, title: '序号' },
    { field: 'name', title: '姓名', minWidth: 150, rowGroupNode: true },  // 分组显示节点
    { field: 'role', title: '角色', width: 120 },
    { field: 'num', title: '数量', width: 100, aggFunc: true },           // 参与聚合
    { field: 'age', title: '年龄', width: 80 },
    { field: 'address', title: '地址', minWidth: 200 }
  ],  data: [],               // 动态加载的数据
  footerData: [footerSummaryRow]   // 表尾数据
})// 模拟异步加载数据,并计算表尾总计
const loadData = () => {
  gridOptions.loading = true
  setTimeout(() => {
    const rawData = [
      { id: 10001, name: 'Test1', role: 'Develop', sex: 'Woman', age: 28, num: 63, date: '2025-02-01', address: 'test abc' },
      { id: 10002, name: 'Test2', role: 'Test', sex: 'Man', age: 22, num: 63, date: '2025-01-01', address: 'Guangzhou' },
      { id: 10003, name: 'Test3', role: 'PM', sex: 'Woman', age: 32, num: 10, date: '2025-05-01', address: 'Shanghai' },
      { id: 10004, name: 'Test4', role: 'Designer', sex: 'Man', age: 32, num: 24, date: '2025-01-01', address: 'test abc' },
      { id: 10005, name: 'Test5', role: 'Develop', sex: 'Man', age: 30, num: 98, date: '2025-01-01', address: 'Shanghai' },
      { id: 10006, name: 'Test6', role: 'Designer', sex: 'Man', age: 30, num: 46, date: '2025-03-01', address: 'test abc' },
      { id: 10007, name: 'Test7', role: 'Test', sex: 'Woman', age: 29, num: 35, date: '2025-05-01', address: 'test abc' },
      { id: 10008, name: 'Test8'

相关文章

精彩推荐