vxe-table 数据分组 + 单元格图表:柱状图与饼图渲染实战

在数据管理后台中,我们经常需要按维度分组展示数据,并在表格内直接呈现图表(如销售对比、完成率等),让用户一眼看懂趋势。 vxe-table 提供了强大的分组聚合(aggregateConfig)与单元格渲染(cellRender)能力,可以轻松实现"分组表格 + 柱状图/饼图"的混合展示。

该示例在分组表格中为每一行数据渲染柱状图(计划 vs 实际)和饼图(占比)。

html 复制代码
<template>
  <div>
    <vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid>
  </div>
</template>

<script setup>
import { reactive } from 'vue'

const salesAmountsCellRender = reactive({
  name: 'bar',
  props: {
    bar: {
      max: 500 // 柱状图最大值(用于统一坐标尺度)
    },
    colors: ['#91C7AE', '#D48265'], // 系列颜色:[计划, 实际]
    labels: ['计划销售', '实际销售'],  // 图例标签
    tooltip: {
      formatter: '{label}:{value}元'
    },
    label: {
      formatter: '{value}元'
    }
  }
})

const salesCompletenessCellRender = reactive({
  name: 'pie',
  props: {
    colors: ['#91C7AE', '#D48265'],
    labels: ['计划销售', '实际销售'],
    tooltip: {
      formatter: '{label}:{value}元'
    }
  }
})

const gridOptions = reactive({
  height: 500,
  showOverflow: true,
  aggregateConfig: {
    groupFields: ['name']
  },
  columnConfig: {
    resizable: true
  },
  columns: [
    { type: 'seq', width: 70 },
    { field: 'group', title: 'Group', minWidth: 140, rowGroupNode: true },
    { field: 'date', title: '日期', width: 140 },
    { field: 'name', title: '产品名称' },
    { field: 'department', title: '部门' },
    { field: 'salesAmounts', title: '柱状图', minWidth: 160, cellRender: salesAmountsCellRender },
    { field: 'salesCompleteness', title: '饼图', width: 140, cellRender: salesCompletenessCellRender }
  ],
  data: [
    { id: 10001, name: '笔记本', department: '销售1部', actualAmount: 80, plannedAmount: 100, salesAmounts: [100, 80], salesCompleteness: [100, 80], date: '2025-02-01' },
    { id: 10002, name: '手机', department: '销售3部', actualAmount: 140, plannedAmount: 120, salesAmounts: [120, 140], salesCompleteness: [120, 140], date: '2025-01-01' },
    { id: 10003, name: '键盘', department: '销售2部', actualAmount: 220, plannedAmount: 200, salesAmounts: [200, 220], salesCompleteness: [200, 220], date: '2025-05-01' },
    { id: 10004, name: '鼠标', department: '销售1部', actualAmount: 110, plannedAmount: 140, salesAmounts: [140, 110], salesCompleteness: [140, 110], date: '2025-01-01' },
    { id: 10005, name: '笔记本', department: '销售2部', actualAmount: 40, plannedAmount: 90, salesAmounts: [90, 40], salesCompleteness: [90, 40], date: '2025-01-01' },
    { id: 10006, name: '鼠标', department: '销售4部', actualAmount: 40, plannedAmount: 120, salesAmounts: [120, 40], salesCompleteness: [120, 40], date: '2025-03-01' },
    { id: 10007, name: '键盘', department: '销售1部', actualAmount: 234, plannedAmount: 300, salesAmounts: [300, 234], salesCompleteness: [300, 234], date: '2025-05-01' },
    { id: 10008, name: '手机', department: '销售4部', actualAmount: 146, plannedAmount: 240, salesAmounts: [240, 146], salesCompleteness: [240, 146], date: '2025-11-01' },
    { id: 10009, name: '笔记本', department: '销售3部', actualAmount: 78, plannedAmount: 120, salesAmounts: [120, 78], salesCompleteness: [120, 78], date: '2025-05-01' },
    { id: 10010, name: '笔记本', department: '销售4部', actualAmount: 100, plannedAmount: 130, salesAmounts: [130, 100], salesCompleteness: [130, 100], date: '2025-03-01' },
    { id: 10011, name: '手机', department: '销售2部', actualAmount: 146, plannedAmount: 150, salesAmounts: [150, 146], salesCompleteness: [150, 146], date: '2025-03-01' },
    { id: 10012, name: '键盘', department: '销售4部', actualAmount: 130, plannedAmount: 130, salesAmounts: [130, 130], salesCompleteness: [130, 130], date: '2025-10-01' },
    { id: 10013, name: '手机', department: '销售2部', actualAmount: 140, plannedAmount: 80, salesAmounts: [80, 140], salesCompleteness: [80, 140], date: '2025-02-01' },
    { id: 10014, name: '笔记本', department: '销售1部', actualAmount: 200, plannedAmount: 100, salesAmounts: [100, 200], salesCompleteness: [100, 200], date: '2025-08-01' },
    { id: 10015, name: '键盘', department: '销售3部', actualAmount: 320, plannedAmount: 300, salesAmounts: [300, 320], salesCompleteness: [300, 320], date: '2025-05-01' },
    { id: 10016, name: '笔记本', department: '销售4部', actualAmount: 380, plannedAmount: 400, salesAmounts: [400, 380], salesCompleteness: [400, 380], date: '2025-10-01' },
    { id: 10017, name: '鼠标', department: '销售1部', actualAmount: 34, plannedAmount: 200, salesAmounts: [200, 34], salesCompleteness: [200, 34], date: '2025-12-01' },
    { id: 10018, name: '键盘', department: '销售4部', actualAmount: 100, plannedAmount: 150, salesAmounts: [150, 100], salesCompleteness: [150, 100], date: '2025-10-01' },
    { id: 10019, name: '鼠标', department: '销售3部', actualAmount: 90, plannedAmount: 120, salesAmounts: [120, 90], salesCompleteness: [120, 90], date: '2025-02-01' },
    { id: 10020, name: '手机', department: '销售2部', actualAmount: 40, plannedAmount: 50, salesAmounts: [50, 40], salesCompleteness: [50, 40], date: '2025-03-01' }
  ]
})
</script>

柱状图/ 饼图渲染器参数

参数 说明
bar.max 柱状图的最大值刻度,用于统一多个单元格的视觉比例
colors 系列颜色数组,按数据顺序对应
labels 图例/提示框显示的文本
tooltip.formatter 鼠标悬浮时的提示内容,{label} 对应 labels 项,{value} 对应数据值
label.formatter 柱顶数值标签格式

vxeui.com

相关推荐
ℋᙚᵐⁱᒻᵉ鲸落2 小时前
移动端滑动手势冲突:overflow: auto导致外层横向滑动失效
前端·javascript·css·vue.js·html
用户50093768390398 小时前
热敏小票 Web 打印:我在 58/80mm 上折腾的两周
前端·vue.js
snow@li16 小时前
服务器运维:Alibaba Cloud Linux 4 LTS・Vue前端 Java 后端 K3S 部署 CICD 目录规范清单
linux·前端·vue.js
honkun616 小时前
vue 表格组件 vxe-table 实实现专业记账凭证编辑表格与自动汇总
前端·javascript·vue.js
web打印社区1 天前
网页静默打印热敏小票:从 HTML 到出纸的完整指南
前端·javascript·vue.js·electron·pdf·html
parade岁月1 天前
为了给表格加虚拟滚动而选了 vxe-table?也可以考虑下这个
前端·vue.js
鹏多多2 天前
PC 网站接入微信登录,这 10 个坑我替你踩完了!
前端·javascript·vue.js
染指11102 天前
103.RAG-LLamaIndex后端rag问答-聊天接口
前端·javascript·vue.js·人工智能
单线程_012 天前
从案例分析 Vue3 Tokenizer+Parser 源码三
前端·javascript·vue.js
jay神2 天前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计