当前位置: 首页 > news >正文

vue2+antd实现表格合并;excel效果

效果图

在这里插入图片描述

一、html

<template><div><a-table :columns="columns" :dataSource="dataSource" rowKey="id" :pagination="false" bordered><template slot="content1" slot-scope="text">{{text}}</template> </a-table></div>
</template>

二、js

export default {data () {return {sortLevel: ['date'],columns: [{title: '日期',align: 'center',dataIndex: 'date',key: 'date',customRender: this.dateRender,},{title: '内容',colSpan: 2,dataIndex: 'content',scopedSlots: { customRender: 'content1' },},{title: '内容',colSpan: 0,dataIndex: 'content2',// customRender: renderContent,},],datas: [{id: 1,content: '123',content2: 'qqw',date: '周一'},{id: 2,content: '123',content2: 'qwqw',date: '周二'},{id: 3,content: '123',content2: 'wewe',date: '周一'},,{id: 42,content: '12332',content2: 'sad',date: '周三'},,{id: 52,content: '1223',content2: 'asdasd',date: '周一'}],dataSource: []}},mounted () {this.dataSource = this.convertData(this.datas)console.log('   this.dataSource : ', this.dataSource);},methods: {dateRender (value, row, index) {return {children: value,attrs: {rowSpan: row.dateRowSpan},};},// 获取需要合并数据的rowSpanconvertData (arr, levelIndex = 0) {const levelKey = this.sortLevelconst key = levelKey[levelIndex]// 根据不同维度重新整合数据let groupObj = this.groupBy(arr, key) || {};Object.keys(groupObj).forEach(groupKey => {if (levelIndex < levelKey.length - 1) {groupObj[groupKey] = this.convertData(groupObj[groupKey], levelIndex + 1)}// 计算rowSpangroupObj[groupKey].forEach((item, index, arr) => {item[`${key}RowSpan`] = index === 0 ? arr.length : 0})})return Object.values(groupObj).flat()},// 根据属性分组groupBy (arr = [], key) {let obj = {}arr.forEach(item => {const val = item[key]if (!obj[val]) {obj[val] = []}obj[val].push(item)})return obj},},
}

三、完整代码

<template><div><a-table :columns="columns" :dataSource="dataSource" rowKey="id" :pagination="false" bordered></a-table></div>
</template><script>export default {data () {const renderContent = (value, row, index) => {const obj = {children: value,attrs: {},};if (index === 3) {obj.attrs.colSpan = 0;}return obj;};return {sortLevel: ['date'],columns: [{title: '日期',align: 'center',dataIndex: 'date',key: 'date',customRender: this.dateRender,},{title: '内容',colSpan: 2,dataIndex: 'content',},{title: '内容',colSpan: 0,dataIndex: 'content2',// customRender: renderContent,},],datas: [{id: 1,content: '123',content2: 'qqw',date: '周一'},{id: 2,content: '123',content2: 'qwqw',date: '周二'},{id: 3,content: '123',content2: 'wewe',date: '周一'},,{id: 42,content: '12332',content2: 'sad',date: '周三'},,{id: 52,content: '1223',content2: 'asdasd',date: '周一'}],dataSource: []}},mounted () {this.dataSource = this.convertData(this.datas)console.log('   this.dataSource : ', this.dataSource);},methods: {dateRender (value, row, index) {return {children: value,attrs: {rowSpan: row.dateRowSpan},};},// 获取需要合并数据的rowSpanconvertData (arr, levelIndex = 0) {const levelKey = this.sortLevelconst key = levelKey[levelIndex]// 根据不同维度重新整合数据let groupObj = this.groupBy(arr, key) || {};Object.keys(groupObj).forEach(groupKey => {if (levelIndex < levelKey.length - 1) {groupObj[groupKey] = this.convertData(groupObj[groupKey], levelIndex + 1)}// 计算rowSpangroupObj[groupKey].forEach((item, index, arr) => {item[`${key}RowSpan`] = index === 0 ? arr.length : 0})})return Object.values(groupObj).flat()},// 根据属性分组groupBy (arr = [], key) {let obj = {}arr.forEach(item => {const val = item[key]if (!obj[val]) {obj[val] = []}obj[val].push(item)})return obj},},
}
</script>
<style lang="less" scoped></style>```

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mac电脑显示隐藏文件
  • 密码学原理精解【8】
  • 园区道路车辆智能管控视频解决方案,打造安全畅通的园区交通环境
  • Redis高级篇—分布式缓存
  • 入门C语言只需一个星期(星期六)
  • Gemma的简单理解;Vertex AI的简单理解,与chatGpt区别
  • Guitar Pro 8 中文破解版百度云免费下载
  • uni-app 影视类小程序开发从零到一 | 开源项目推荐
  • 从安装Node到TypeScript到VsCode的配置教程
  • k8s集群 安装配置 Prometheus+grafana
  • 【大数据面试题】38 说说 Hive 怎么行转列
  • 「网络通信」HTTP 协议
  • 服务器系统盘存储不够,添加数据盘并挂载(阿里云)
  • 各模型文件后缀及其相关框架和用途的简要介绍
  • SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测
  • 《剑指offer》分解让复杂问题更简单
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【React系列】如何构建React应用程序
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android单元测试 - 几个重要问题
  • CSS居中完全指南——构建CSS居中决策树
  • Date型的使用
  • Linux各目录及每个目录的详细介绍
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Redis字符串类型内部编码剖析
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • - 概述 - 《设计模式(极简c++版)》
  • 关于extract.autodesk.io的一些说明
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 一份游戏开发学习路线
  • 阿里云重庆大学大数据训练营落地分享
  • # Redis 入门到精通(一)数据类型(4)
  • #QT(QCharts绘制曲线)
  • $ git push -u origin master 推送到远程库出错
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (39)STM32——FLASH闪存
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (四)js前端开发中设计模式之工厂方法模式
  • (一)80c52学习之旅-起始篇
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • *算法训练(leetcode)第四十七天 | 并查集理论基础、107. 寻找存在的路径
  • .net dataexcel winform控件 更新 日志
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net接口调试与案例
  • .net解析传过来的xml_DOM4J解析XML文件
  • @KafkaListener注解详解(一)| 常用参数详解
  • @vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
  • [ SNOI 2013 ] Quare
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [2019红帽杯]Snake
  • [AIGC] SpringBoot的自动配置解析
  • [AIGC] 广度优先搜索(Breadth-First Search,BFS)详解
  • [Angular 基础] - 数据绑定(databinding)