element table 合并表头 合并列 合并行

本文记录了使用Element UI实现表格合并的过程,包括表头、行和列的合并。在实践中遇到诸多问题,通过处理数据和调整CSS解决了这些问题。提供了示例代码和数据格式说明。

记录一下首次合并表格。

遇到了很多坑,这是解决后的代码

ui的设计图(也是最终效果啦)

 element 的table:

 <div class="category">
      <el-table
        :data="alldata"
        :span-method="arraySpanMethod"
        :header-row-style="{ height: '56px', background: '#E5E5E5' }"
        :header-cell-style="tableHeaderColor"
        border
        style="width: 100%; margin-top: 5px"
      >
        
        <el-table-column prop label="设备未知" align="center">
          <template>
            <el-table-column prop="category"></el-table-column>
            <el-table-column prop="activityName"></el-table-column>
            <el-table-column prop="message"></el-table-column>
          </template>
       
        </el-table-column>
         <el-table-column prop="value" label="数字A"> </el-table-column>
        <el-table-column prop="value" label="数字B"> </el-table-column>
        <el-table-column prop="value" label="数字C"> </el-table-column>
        <el-table-column prop="value" label="数字D"> </el-table-column>
        <el-table-column prop="value" label="数字E"> </el-table-column>
        <el-table-column prop="value" label="数字F"> </el-table-column>
    
      </el-table>
    </div>

js:data的数据格式

 data() {
    return {
     
      list: [
        {
          id: "16EE8A54E6917F6479905CDC5B031F22",
          activityPointsDOS: [
            {
              id: "16EE8A54E0C17F647404A2DC7783EE88",
              activityPointsDOS: [
                {
                  id: "1",
                  value: "6",
                  activityName: "坚定政治立场。",
                  message: " (1)牢固树立“四个意识”巴拉巴拉",
                  period: "19上半年",
                },
                {
                  id: "2",
                  value: "8",
                  activityName: "坚定政治立场。",
                  message: "(2)严格遵守政治纪律和政治规矩.巴拉啦",
                  period: "19上半年",
                },
              ],
              activityName: "1. 坚定政治立场。(10分)",
            },
            {
              id: "16EE8A54E4817F64779EF35CC6671C10",
              activityPointsDOS: [
                {
                  id: "3",
                  value: "7",
                  activityName: "坚持学习提高。",
                  message: "(1)及时认真参加支部集体学习....",
                  period: "19上半年",
                },
                {
                  id: "4",
                  value: "3",
                  activityName: "坚持学习提高。",
                  message: "(2)每年集中学习培训....",
                  period: "19上半年",
                },
                {
                  id: "5",
                  value: "5",
                  activityName: "坚持学习提高。",
                  message: "(3)有取得更高....位",
                  period: "19上半年",
                },
              ],
              activityName: "2.坚持学习提高。(6分)",
            },
            {
              id: "16EE8A54E4817F64779EF35CC6671C10",
              activityPointsDOS: [
                {
                  id: "6",
                  value: "7",
                  activityName: "严格组织生活。",
                  message: "(1)按季度.....",
                  period: "19上半年",
                },
                {
                  id: "7",
                  value: "3",
                  activityName: "严格组织生活。",
                  message: "(2)按时上党课.......。",
                  period: "19上半年",
                },
                {
                  id: "8",
                  value: "5",
                  activityName: "坚持学习提高。",
                  message: "(3)积极参加",
                  period: "19上半年",
                },
              ],
              activityName: "3.严格组织生活。(13分)",
            },
          ],
          category: "合格积分\r\n(40分)",
        },
        {
          id: "16EE8A54FF617F6491391BD04A0D4E7F",
          activityPointsDOS: [
            {
              id: "16EE8A54EA517F647D257760897C805F",
              activityPointsDOS: [
                {
                  id: "8",
                  value: "10",
                  activityName: "1.所在基层党组织情况。(10分)",
                  message: " (1) 根据所在.....",
                  period: "19上半年",
                },
              ],
              activityName: "1.所在基层党组织情况。(10分)",
            },
            {
              id: "16EE8A54E8517F647B3DE374CF0D6D93",
              activityPointsDOS: [
                {
                  id: "10",
                  value: "3",
                  activityName: "2.年度评议、考核情况。(10分)",
                  message: " (1) 在党建....",
                  period: "19上半年",
                },
                {
                  id: "9",
                  value: "10",
                  activityName: "2.年度评议、考核情况。(10分)",
                  message:
                    " (2)在年度.........................................................................",
                  period: "19上半年",
                },
              ],
              activityName: "2.年度评议、考核情况。(10分)",
            },
          ],
          category: "综合积分\r\n(20分)",
        },
        {
          id: "16EE8A54FF617F6491391BD04A0D4E8F",
          activityPointsDOS: [
            {
              id: "16EE8A54EA517F647D257760897C805F",
              activityPointsDOS: [
                {
                  id: "8",
                  value: "100000",
                  // activityName: "1.所在基层党组织情况。(10分)",
                  // message: " (1) 根据所在.....",
                  period: "19上半年",
                },
              ],
              // activityName: "1.所在基层党组织情况。(10分)",
            },
          ],
          category: "积分\r\n(20分)",
        },
      ],
    
    };
}

数据处理:

created() {
    // 二次处理数据
    this.alldata = this.handleTableArr(this.list);
    console.log(this.alldata);
  },
methods: {
// 解析数据
    handleTableArr(data) {
      let arr = [];
      for (let i = 0; i < data.length; i++) {
        let category_info = data[i];
        let activityPointsDOS = category_info["activityPointsDOS"];
        let count = 0;
        for (let j = 0; j < activityPointsDOS.length; j++) {
          let activityTwo_info = activityPointsDOS[j];
          let activityTwo_activityPointsDOS =
            activityPointsDOS[j]["activityPointsDOS"];
          for (let k = 0; k < activityTwo_activityPointsDOS.length; k++) {
            count++;
            let info = {
              // 确定每天数据的 合并行的数量
              span_num: k === 0 ? activityTwo_activityPointsDOS.length : 0,
              value: activityTwo_activityPointsDOS[k]["value"],
              message: activityTwo_activityPointsDOS[k]["message"],
              activityName: activityTwo_info["activityName"],
              category: category_info["category"],
            };
            arr.push(info);
          }
        }
        // 第一列的合并数量, 赋值给每个大项的第一个单元格. 比如合格积分要合并 8 行.
        arr[arr.length - count]["count"] = count;
      }
      return arr;
    },
}

合并表格和合并表头:

// 表格合并的方法
    arraySpanMethod({ row, column, rowIndex, columnIndex }) {
      console.log(row, "row");

 // row: 行,column:列;rowIndex:第几行;columnIndex:第几列
      // rowspan: 行宽;colspan: 列宽
      if (rowIndex === this.alldata.length - 1) {
        if (columnIndex === 0) {
          return {
             rowspan: 1,
             colspan: 3
          }
        }else if (columnIndex === 1) {
                    // 删除第二列
                    return [0, 0];
                }else if (columnIndex === 2) {
                    // 删除第二列
                    return [0, 0];
                }
      } else {
        if (columnIndex === 0) {
          if (row.count) {
            return [row.count, 1];
          } else {
            return [0, 0];
          }
        }
         // 第二列
      if (columnIndex === 1) {
        if (row.span_num > 0) {
          return [row.span_num, 1];
        } else {
          return [0, 0];
        }
      }
      }
    },
    // 表头合并的方法
    tableHeaderColor({ row, column, rowIndex, columnIndex }) {
      console.log(row, "row");
      // 第一列
      if (rowIndex === 0) {
        // if(columnIndex === 1) {
        this.$nextTick(() => {
          console.log(document.getElementsByClassName(column.id).length, "行");

          if (document.getElementsByClassName(column.id).length !== 0) {
            console.log(rowIndex, columnIndex, "行");
            document
              .getElementsByClassName(column.id)[0]
              .setAttribute("rowspan", 3);
            return false;
          }
        });
        console.log(column);
        return column;
        // }
        // return 'height:40px!important;line-height:40px!important;'
      }
    },

css:


<style lang="scss" scope>
.category {
  width: 100%;
  .el-table tr {
    height: 28px !important;
  }
  .el-table--border th {
    border-bottom: 2px solid #ffffff;
  }
  .el-table--medium th,
  .el-table--medium td {
    padding: 0px 0;
  }
  .el-table th > .cell {
    font-size: 14px;
    line-height: 13px;
    // height: 61px;
  }

  .el-table__header-wrapper {
    height: 56px !important;
  }
  .el-table thead.is-group th {
    height: 24px !important;
  }
  .el-table .cell {
    padding: 5px;
  }
  .el-table thead.is-group th {
    background: #e5e5e5;
  }
}


</style>

合并列后多出两列tb的参考链接:Element表格之表头合并、行合并和列合并_rayong的博客-优快云博客_element 合并表头

<think>好的,我现在需要帮助用户解决在Element UI的表格中合并表头的问题。首先,我得回忆一下Element UI的文档和相关引用内容。用户提到的引用[1]和引用[3]都涉及到了表格的高级用法,特别是合并单元格和多级表头。 首先,合并表头Element UI中通常通过使用el-table-column的嵌套来实现多级表头。每个el-table-column可以包含子列,从而形成层级结构。例如,一个主表头下面有两个子表头,可以通过在父列中嵌套两个子列来实现。 接下来,我需要考虑用户的具体需求是合并表头,可能是指横向或纵向的合并。根据引用[3]中的示例,使用v-for循环生成列,并且通过slot-scope来动态显示内容。这可能对实现动态表头合并有帮助。 然后,引用[1]提到有多级表头合并单元格的需求,用户可能希望同时合并表头单元格和行内的单元格。但当前问题聚焦在表头合并,所以需要重点说明如何通过嵌套el-table-column来创建多级表头,从而达到合并的效果。 我需要提供一个清晰的代码示例,展示如何嵌套列来实现合并表头。例如,假设有一个“基本信息”作为父表头,下面包含“姓名”和“年龄”两个子表头。这样,在表格中,“基本信息”会跨两列显示,合并这两个子列的表头。 同时,可能需要解释一些关键属性,比如label、prop,以及如何通过插槽自定义表头内容。不过根据用户的问题,主要关注的是结构上的合并,所以代码结构会更重要。 另外,要注意用户可能遇到的常见问题,例如样式调整或数据绑定是否正确,但在这个回答中可能不需要深入,除非用户后续提问。 最后,根据用户的要求,生成相关问题。可能需要考虑Element UI表格的其他高级功能,比如行内编辑、动态列生成或单元格合并,这些都是相关的扩展问题。</think>在Element UI中实现表格表头合并可通过嵌套`<el-table-column>`组件实现多级表头结构。以下是具体实现示例和说明: ### 基础多级表头实现 ```html <el-table :data="tableData"> <!-- 合并两列的父级表头 --> <el-table-column label="基础信息"> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table-column> <!-- 合并三列的父级表头 --> <el-table-column label="成绩统计"> <el-table-column label="理科"> <el-table-column prop="math" label="数学"></el-table-column> <el-table-column prop="physics" label="物理"></el-table-column> </el-table-column> <el-table-column prop="history" label="历史"></el-table-column> </el-table-column> </el-table> ``` ### 动态渲染复杂表头[^3] ```javascript data() { return { headerStructure: [ { label: '部门信息', children: [ { prop: 'deptName', label: '部门名称' }, { prop: 'manager', label: '负责人' } ] }, { label: '业绩指标', children: [ { label: '季度完成率', children: [ { prop: 'q1', label: 'Q1' }, { prop: 'q2', label: 'Q2' } ] } ] } ] } } ``` ```html <el-table :data="tableData"> <template v-for="col in headerStructure"> <el-table-column v-if="col.children" :key="col.label" :label="col.label"> <el-table-column v-for="child in col.children" :key="child.label" :label="child.label" :prop="child.prop"> </el-table-column> </el-table-column> <el-table-column v-else :key="col.label" :label="col.la
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值