element-ui中el-table数据合并行和列,应该怎么解决

最近接到一个任务,要实现一个数据报表,涉及到很多合并问题,一开始想着原生会简单点,实际上很麻烦,最后还是用elemen-ui中table自带的合并方法.

最终的效果是要做成这种:1.数据处理,后端返回来的数据是,一个大对象,包含三个数组,既然合并,肯定是要处理成一个数组,并且要把相同的追加一个属性,后面根据这个属性进行合并处理.

2.页面结构代码

 <div class="p-title-header">
      <span>日期:{{ currentDate }}</span>
      <span>门诊业务信息日报表</span>
      <span>单位: 元</span>
    </div>
    <el-table
      :data="tableData1"
      ref="recordTable"
      :span-method="arraySpanMethod1"
      border
      :cell-style="{ textAlign: 'center' }"
      :header-cell-style="{ textAlign: 'center' }"
      :row-style="{ height: '0' }"
    >
      <el-table-column prop="name" label="类型" width="100"> </el-table-column>
      <el-table-column prop="docName" label="疫苗种类"> </el-table-column>
      <el-table-column prop="serviceCount" label="日业务量"> </el-table-column>
      <el-table-column prop="totalFee" label="单价"> </el-table-column>
      <el-table-column label="当日确认收入">
        <el-table-column prop="vaccineIncome" label="疫苗收入">
        </el-table-column>
        <el-table-column prop="vaccinateIncome" label="接种收入">
        </el-table-column>
      </el-table-column>
    </el-table>

2.请求回来的数据,进行数据处理

// 获取数据
    getDataList() {
      let params = {};
      this.filter.forEach((item) => {
        if (item.value && item.type != "daterange") {
          params[item.key] = item.value;
        }
        if (item.value && item.type == "daterange") {
          params.visitDateStart = item.value[0];
          params.visitDateEnd = item.value[1];
        }
      });
      // if (
      //   !this.filter.some((item) => item.type === "daterange" && item.value)
      // ) {
      //   this.$message.error('请选择要查询的日期范围')
      //   return;
      // }
      this.$http({
        method: "post",
        url: "/report/forms/reportQuery",
        mode: "main",
        data: params,
      })
        .then((res) => {
          console.log(res, "666-res");
        })
        .catch((err) => {
          console.log(err, "555-err");
          let arr = [];
          let arr1 = err.data.listCheck;
          let arr2 = err.data.listVaccine;
          let arr3 = err.data.listSpecial;
          arr1.map((val) => {
            return { ...(val.name = "疫苗接种") };
          });
          arr1.push({
            name: "疫苗接种",
            docName: "疫苗接种收入合计",
            vaccineIncome: err.data.listVaccine[0].vaccineIncomeAmount,
          });
          arr2.map((val) => {
            return { ...(val.name = "个人检测") };
          });
          arr2.push({
            name: "个人检测",
            docName: "个人检测收入合计",
            vaccineIncome: err.data.listCheck[0].vaccineIncomeAmount,
          });
          arr3.map((val) => {
            return { ...(val.name = "特色健康门诊") };
          });
          arr3.push({
            name: "特色健康门诊",
            docName: "特色健康门诊收入合计",
            vaccineIncome: err.data.listSpecial[0].vaccineIncomeAmount,
          });
          let arr4 = [
            {
              name: "当日确认收入合计",
              vaccinateIncome: err.data.listVaccine[0].vaccinateAllAmount,
            },
          ];
          console.log(err.data.listCheck, 22222);
          // this.tableData1 = arr
          //   .concat(arr1)
          //   .concat(arr2)
          //   .concat(arr3)
          //   .concat(arr4);
          this.tableData1 = [...arr, ...arr1, ...arr2, ...arr3, ...arr4];
          console.log(this.tableData1, "099090909090");
        });
    },

4.合并公共方法

 // 合并公共方法
    flitterData(arr) {
      let spanOneArr = [],
        spanTwoArr = [],
        concatOne = 0;
      arr.forEach((item, index) => {
        if (index === 0) {
          spanOneArr.push(1);
          spanTwoArr.push(1);
        } else {
          // 只需要将 span_name 修改为自己需要合并的字段名即可
          if (item.name === arr[index - 1].name) {
            // 第一列需合并相同内容的判断条件
            spanOneArr[concatOne] += 1;
            spanOneArr.push(0);
          } else {
            spanOneArr.push(1);
            concatOne = index;
          }
        }
      });
      return {
        one: spanOneArr,
      };
    },

5.合并方法,这里是要根据自己的业务请求进行调整处理的

// 合并方法
    arraySpanMethod1({ row, column, rowIndex, columnIndex }) {
      // console.log(rowIndex, columnIndex)
      if (columnIndex == 0) {
        const _row = this.flitterData(this.tableData1).one[rowIndex];
        if (row.name == "当日确认收入合计") {
          return [1, 1];
        } else {
          return {
            rowspan: _row,
            colspan: 1,
          };
        }
      }
      if (
        row.docName == "个人检测收入合计" ||
        row.docName == "特色健康门诊收入合计" ||
        row.docName == "疫苗接种收入合计"
      ) {
        if (columnIndex == 1) return [1, 3];
        else if (columnIndex == 4) return [1, 2];
        else return [0, 0];
      }
    },

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
element-ui的表格el-table本身并不支持动态合并单元格(行和列),但可以通过自定义表格的slot-scope和span-method来实现动态合并单元格的功能。首先,我们需要在表格定义时添加span-method属性,并指定一个方法来计算单元格的合并行数和数。例如: ```html <el-table :data="tableData" :span-method="mergeCells"> ... </el-table> ``` 然后,在methods定义mergeCells方法来计算单元格的合并行数和数。该方法有四个参数分别是({row, column, rowIndex, columnIndex}),我们可以根据需要通过判断行索引和索引来返回合适的行数和数,例如合并第一行的两可以这样实现: ```javascript methods: { mergeCells({row, column, rowIndex, columnIndex}) { if (rowIndex === 0 && columnIndex < 2) { return { rowspan: 1, colspan: 2 }; } } } ``` 这样就实现了动态合并第一行的两个单元格。如果想要合并其他行或,可以根据需要进行判断和返回。 给表头添加斜线可以通过自定义表头的样式来实现。可以通过CSS的`::before`或`::after`伪元素来添加斜线样式。例如,给第一的表头添加斜线可以这样实现: ```html <el-table ...> <el-table-column label="姓名"> <template slot="header" slot-scope="scope"> <div class="header-wrapper"> <div class="header-content"> <span>{{scope.column.label}}</span> </div> </div> </template> </el-table-column> ... </el-table> ``` 然后在样式定义斜线效果: ```css <style> .header-content::before { content: ""; display: block; border-bottom: 1px solid #333; transform: skew(-45deg); width: 80%; margin-left: 10%; } </style> ``` 这样就实现了给第一的表头添加斜线的效果。可以根据需要调整斜线的样式和位置来达到期望的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值