vue element table表格合计数值 合并单元格

本文介绍了如何使用Element UI构建一个动态的表格,展示了数据的分类、合并计算以及行列调整功能。通过JavaScript操作,实现根据名称合并行,数值求和并标记合计行。适合前端开发者了解表格数据处理技巧。
摘要由CSDN通过智能技术生成

在这里插入图片描述

<template>
  <div>
    <el-table
      :data="tableData"
      :cell-class-name="columnStyle"
      :span-method="arraySpanMethod"
      border
      style="width: 100%"
    >
      <el-table-column label="序号" width="55" align="center">
        <template slot-scope="scope">{{ scope.$index + 1 }}</template>
      </el-table-column>
      <el-table-column prop="name" label="名称" align="center">
      </el-table-column>
      <el-table-column prop="num1" label="数值 1" align="center">
      </el-table-column>
      <el-table-column prop="num2" label="数值 2" align="center">
      </el-table-column>
      <el-table-column prop="num3" label="数值 3" align="center">
      </el-table-column>
      <el-table-column prop="num4" label="数值 4" align="center">
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
export default {
  name: "",
  components: {},
  props: {},
  data() {
    return {
      tableData: [
        {
          id: "1",
          name: "工区1",
          num1: "11",
          num2: "20",
          num3: 12,
          num4: 100,
        },
        {
          id: "2",
          name: "工区1",
          num1: "11",
          num2: "20",
          num3: 12,
          num4: 100,
        },
        {
          id: "8",
          name: "工区1",
          num1: "11",
          num2: "20",
          num3: 12,
          num4: 100,
        },
        {
          id: "3",
          name: "工区2",
          num1: "11",
          num2: "20",
          num3: 12,
          num4: 100,
        },
        {
          id: "4",
          name: "工区2",
          num1: "11",
          num2: "20",
          num3: 12,
          num4: 100,
        },
        {
          id: "5",
          name: "工区3",
          num1: "539",
          num2: "20",
          num3: 12,
          num4: 100,
        },
        {
          id: "6",
          name: "工区3",
          num1: "539",
          num2: "20",
          num3: 12,
          num4: 100,
        },
      ],
      dataArr: [],
    };
  },
  filters: {},
  computed: {},
  watch: {},
  created() {},
  mounted() {
    let newArr = [];
    // 数据分类
    this.tableData.forEach((item) => {
      const parent = this.dataArr.find((c) => c.name === item.name);
      if (parent) {
        parent.childs.push(item);
      } else {
        const obj = {
          name: item.name,
          childs: [item],
        };
        this.dataArr.push(obj);
      }
    });

    // 增加合计
    this.dataArr.forEach((item) => {
      let obj = {
        name: "",
        num1: 0,
        num2: 0,
        num3: 0,
        num4: 0,
      };
      item.childs.forEach((items) => {
        obj.num1 = "合计";
        obj.name = items.name;
        obj.num2 += items.num2 * 1;
        obj.num3 += items.num3 * 1;
        obj.num4 += items.num4 * 1;
      });
      item.childs.push(obj);
    });

    // 扁平化数组 增加sameName判断合并行
    this.dataArr.forEach((item) => {
      item.childs[0].sameName = item.childs.length;
      item.childs.forEach((items) => {
        newArr.push(items);
      });
    });
    this.tableData = newArr;

    // 增加length判断合并列
    for (let i = 0; i < this.tableData.length; i++) {
      if (this.tableData[i].num1 === "合计") {
        this.tableData[i].length = i
      }
    }
  },
  beforeDestroy() {},
  methods: {
    /**
     * row:表格行
     * column:表格列
     * rowIndex:表格行下标
     * columnIndex:表格列下标
     * */
    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
      let cs = 2; // 合并列数
      let ci = 2; // 开始合并位置
      let num = ci + 1;
      // 合并列
      for (let i = num; i < cs + ci; i++) {
        if (rowIndex === row.length) {
          if (columnIndex === ci) {
            return {
              rowspan: 1,
              colspan: cs,
            };
          } else if (columnIndex === i) {
            return [0, 0];
          }
        }
      }

      // 合并行
      if (columnIndex === 1) {
        if (row.sameName) {
          return {
            rowspan: row.sameName,
            colspan: 1,
          };
        } else {
          return {
            rowspan: 0,
            colspan: 0,
          };
        }
      }
    },

    // 合计加背景颜色
    columnStyle({ row, column, rowIndex, columnIndex }) {
      for (let i = 0; i < this.tableData.length; i++) {
        if (this.tableData[i].num1 === "合计") {
          if (rowIndex === i) {
            if (columnIndex >= 2) {
              return "total";
            }
          }
        }
      }
    },
  },
};
</script>

<style scoped lang="less">
::v-deep {
  .total {
    background: #f5f7fa;
  }
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值