el-table表格動態合并相同數據單元格(可指定列+自定義合并)

目錄 1.固定合并 2. 動態合并相同數據單元格(所有列) 3. 動態合并相同數據單元格(指定列) 4. 動態合并相同數據單元格(指定列+合并條件) 完整代碼 1.固定合并 官方挺提供的合并
目錄
  • 1.固定合并
  • 2. 動態合并相同數據單元格(所有列)
  • 3. 動態合并相同數據單元格(指定列)
  • 4. 動態合并相同數據單元格(指定列+合并條件)
  • 完整代碼

1.固定合并

  • 官方挺提供的合并具體某行列的方法:el-table合并行或列
  • 通過給table傳入span-method方法可以實現合并行或列,方法的參數是一個對象,里面包含當前行row、當前列column、當前行號rowIndex、當前列號columnIndex四個屬性。

該函數可以返回一個包含兩個元素的數組,第一個元素代表rowspan,第二個元素代表colspan。 也可以返回一個鍵名為rowspan和colspan的對象。

<template>
  <div>
    <el-table
      :data="tableData"
      :span-method="arraySpanMethod"
      border
      style="width: 100%">
      <el-table-column
        prop="id"
        label="ID"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="amount1"
        sortable
        label="數值 1">
      </el-table-column>
      <el-table-column
        prop="amount2"
        sortable
        label="數值 2">
      </el-table-column>
      <el-table-column
        prop="amount3"
        sortable
        label="數值 3">
      </el-table-column>
    </el-table>
    <el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      border
      style="width: 100%; margin-top: 20px">
      <el-table-column
        prop="id"
        label="ID"
        width="180">
      </el-table-column>
      <el-table-column
        prop="name"
        label="姓名">
      </el-table-column>
      <el-table-column
        prop="amount1"
        label="數值 1(元)">
      </el-table-column>
      <el-table-column
        prop="amount2"
        label="數值 2(元)">
      </el-table-column>
      <el-table-column
        prop="amount3"
        label="數值 3(元)">
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        tableData: [{
          id: '12987122',
          name: '王小虎',
          amount1: '234',
          amount2: '3.2',
          amount3: 10
        }, {
          id: '12987123',
          name: '王小虎',
          amount1: '165',
          amount2: '4.43',
          amount3: 12
        }, {
          id: '12987124',
          name: '王小虎',
          amount1: '324',
          amount2: '1.9',
          amount3: 9
        }, {
          id: '12987125',
          name: '王小虎',
          amount1: '621',
          amount2: '2.2',
          amount3: 17
        }, {
          id: '12987126',
          name: '王小虎',
          amount1: '539',
          amount2: '4.1',
          amount3: 15
        }]
      };
    },
    methods: {
      arraySpanMethod({ row, column, rowIndex, columnIndex }) {
        if (rowIndex % 2 === 0) {
          if (columnIndex === 0) {
            return [1, 2];
          } else if (columnIndex === 1) {
            return [0, 0];
          }
        }
      },
      objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) {
          if (rowIndex % 2 === 0) {
            return {
              rowspan: 2,
              colspan: 1
            };
          } else {
            return {
              rowspan: 0,
              colspan: 0
            };
          }
        }
      }
    }
  };
</script>

運行效果:

缺點這種只適合寫死的數據和固定的表格行列,無法動態判斷單元格數據是否相等再合并;

2. 動態合并相同數據單元格(所有列)

  • 可以對所有相同數據的列,進行動態合并
  • 此方法適合需要合并所有的相同數據的單元格
<template>
  <div>
    <el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      border
      :header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
    >
      <el-table-column prop="School" label="學校" align="center">
      </el-table-column>
      <el-table-column prop="Grade" label="年級" align="center" />
      <el-table-column prop="Class" label="班級" align="center" />
      <el-table-column prop="Name" label="姓名" align="center" />
      <el-table-column prop="Chinese" label="語文" align="center" />
      <el-table-column prop="Math" label="數學" align="center" />
      <el-table-column prop="English" label="英語" align="center" />
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      // 存放所有的表頭 一定要與tableData一致
      colFields: [
        "School",
        "Grade",
        "Class",
        "Name",
        "Chinese",
        "Math",
        "English",
      ],
      spanArr: [], //存儲合并單元格的開始位置
      // 表格數據
      tableData: [
        // 一年級
        {
          School: "第一小學",
          Grade: "1年級",
          Class: "1班",
          Name: "張三",
          Chinese: "90",
          Math: "100",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "1年級",
          Class: "2班",
          Name: "李四",
          Chinese: "90",
          Math: "85",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "1年級",
          Class: "3班",
          Name: "王五",
          Chinese: "79",
          Math: "100",
          English: "80",
        },
        // 二年級
        {
          School: "第一小學",
          Grade: "2年級",
          Class: "1班",
          Name: "趙六",
          Chinese: "95",
          Math: "100",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "2年級",
          Class: "2班",
          Name: "錢八",
          Chinese: "98",
          Math: "85",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "2年級",
          Class: "3班",
          Name: "陳九",
          Chinese: "79",
          Math: "100",
          English: "80",
        },
        // 三年級
        {
          School: "第一小學",
          Grade: "3年級",
          Class: "1班",
          Name: "黃十",
          Chinese: "91",
          Math: "88",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "3年級",
          Class: "2班",
          Name: "魏一",
          Chinese: "90",
          Math: "86",
          English: "87",
        },
        {
          School: "第一小學",
          Grade: "3年級",
          Class: "3班",
          Name: "楊二",
          Chinese: "79",
          Math: "99",
          English: "80",
        },
      ],
    };
  },
  methods: {
    /**
     * 分析每一列,找出相同的
     * @param data
     */
    getSpanArr() {
      for (let i = 0; i < this.tableData.length; i++) {
        let row = i;
        // let col = i % this.colCount;
        if (row === 0) {
          // i 表示行 j表示列
          for (let j = 0; j < this.colFields.length; j++) {
            this.spanArr[i * this.colFields.length + j] = {
              rowspan: 1,
              colspan: 1,
            };
          }
        } else {
          for (let j = 0; j < this.colFields.length; j++) {
            // 當前和上一次的一樣
            // 1. 合并所有列的相同數據單元格
            if (
              this.tableData[row][this.colFields[j]] ===
              this.tableData[row - 1][this.colFields[j]]
            ) {
              let beforeItem =
                this.spanArr[(row - 1) * this.colFields.length + j];
              this.spanArr[row * this.colFields.length + j] = {
                rowspan: 1 + beforeItem.rowspan, // 合并幾行
                colspan: 1, // 合并幾列,我這里只是跨行合并,不跨列合并,所以用的1
              };
              beforeItem.rowspan = 0;
              beforeItem.colspan = 0;
            } else {
              // rowspan 和 colspan 都為1表格此單元格不合并
              this.spanArr[row * this.colFields.length + j] = {
                rowspan: 1,
                colspan: 1,
              };
            }
          }
        }
      }
      // 對數據進行倒序
      let stack = [];
      for (let i = 0; i < this.colFields.length; i++) {
        for (let j = 0; j < this.tableData.length; j++) {
          // console.log("i=" + i + " j=" + j);
          // i 表示列 j表示行
          if (j === 0) {
            if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
              stack.push(this.spanArr[j * this.colFields.length + i]);
            }
          } else {
            if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
              stack.push(this.spanArr[j * this.colFields.length + i]);
            } else {
              stack.push(this.spanArr[j * this.colFields.length + i]);
              while (stack.length > 0) {
                let pop = stack.pop();
                let len = stack.length;
                this.spanArr[(j - len) * this.colFields.length + i] = pop;
              }
            }
          }
        }
      }
      // console.log(this.spanArr);
    },
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]);
      return this.spanArr[rowIndex * this.colFields.length + columnIndex];
    },
  },
  mounted() {
    this.getSpanArr();
  },
};
</script>
<style lang="scss" scoped></style>

效果:

我們可以看到,所有列,只要數據相同的單元格都被合并了,包括我不想合并的單元格,這時候就要指定合并的列

3. 動態合并相同數據單元格(指定列)

只需要加個if判斷即可指定要合并哪些列

// 這里只放了部分代碼,除了加了個if,其他代碼和上面的一樣
 getSpanArr() {
      for (let i = 0; i < this.tableData.length; i++) {
        let row = i;
        // let col = i % this.colCount;
        if (row === 0) {
          // i 表示行 j表示列
          for (let j = 0; j < this.colFields.length; j++) {
            this.spanArr[i * this.colFields.length + j] = {
              rowspan: 1,
              colspan: 1,
            };
          }
        } else {
          for (let j = 0; j < this.colFields.length; j++) {
            // 當前和上一次的一樣
            //  合并所有列的相同數據單元格
            if (
              this.colFields[j] == "School" ||
              this.colFields[j] == "Grade" ||
              this.colFields[j] == "Class"
            ) { // 指定合并哪些列
              if (
                this.tableData[row][this.colFields[j]] ===
                this.tableData[row - 1][this.colFields[j]]
              ) {
                let beforeItem =
                  this.spanArr[(row - 1) * this.colFields.length + j];
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1 + beforeItem.rowspan,
                  colspan: 1,
                };
                beforeItem.rowspan = 0;
                beforeItem.colspan = 0;
              } else {
                // rowspan 和 colspan 都為1表格此單元格不合并
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1,
                  colspan: 1,
                };
              }
            }
          }
        }
      }

效果:這樣就只合并了我們指定的那幾列了

4. 動態合并相同數據單元格(指定列+合并條件)

有時候我們會遇到不想合并的單元格,比如下面這種情況:

按常理來說,不同小學的數據應該是不做合并才對,正確是這種:

這時候就需要加上一些自定義的合并條件了:

getSpanArr() {
      for (let i = 0; i < this.tableData.length; i++) {
        let row = i;
        // let col = i % this.colCount;
        if (row === 0) {
          // i 表示行 j表示列
          for (let j = 0; j < this.colFields.length; j++) {
            this.spanArr[i * this.colFields.length + j] = {
              rowspan: 1,
              colspan: 1,
            };
          }
        } else {
          for (let j = 0; j < this.colFields.length; j++) {
            // 當前和上一次的一樣
            //  合并所有列的相同數據單元格
            if (
              this.colFields[j] == "School" ||
              this.colFields[j] == "Grade" ||
              this.colFields[j] == "Class"
            ) { // 指定合并哪些列
              if (
                this.tableData[row]["School"] !==
                  this.tableData[row - 1]["School"]
              ) { // 哪些不合并:School不一樣的,不合并
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1,
                  colspan: 1,
                };
              } else if (
                this.tableData[row][this.colFields[j]] ===
                this.tableData[row - 1][this.colFields[j]]
              ) {
                let beforeItem =
                  this.spanArr[(row - 1) * this.colFields.length + j];
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1 + beforeItem.rowspan,// 合并幾列
                  colspan: 1,// 合并幾行
                };
                beforeItem.rowspan = 0;
                beforeItem.colspan = 0;
              } else {
                // rowspan 和 colspan 都為1表格此單元格不合并
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1,
                  colspan: 1,
                };
              }
            }
          }
        }
      }
      // console.log(this.spanArr);
    },

這時候再看,就是我們想要的效果了

完整代碼

最后附完整代碼:

<template>
  <div>
    <el-table
      :data="tableData"
      :span-method="objectSpanMethod"
      border
      :header-cell-style="{ textAlign: 'center', backgroundColor: '#F5F7FA' }"
    >
      <el-table-column prop="School" label="學校" align="center">
      </el-table-column>
      <el-table-column prop="Grade" label="年級" align="center" />
      <el-table-column prop="Class" label="班級" align="center" />
      <el-table-column prop="Name" label="姓名" align="center" />
      <el-table-column prop="Chinese" label="語文" align="center" />
      <el-table-column prop="Math" label="數學" align="center" />
      <el-table-column prop="English" label="英語" align="center" />
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      // 存放所有的表頭 一定要與tableData一致
      colFields: [
        "School",
        "Grade",
        "Class",
        "Name",
        "Chinese",
        "Math",
        "English",
      ],
      spanArr: [], //存儲合并單元格的開始位置
      // 表格數據
      tableData: [
        // 一年級
        {
          School: "第一小學",
          Grade: "1年級",
          Class: "1班",
          Name: "張三",
          Chinese: "90",
          Math: "100",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "1年級",
          Class: "1班",
          Name: "張偉",
          Chinese: "90",
          Math: "99",
          English: "89",
        },
        {
          School: "第一小學",
          Grade: "1年級",
          Class: "2班",
          Name: "李四",
          Chinese: "90",
          Math: "85",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "1年級",
          Class: "3班",
          Name: "王五",
          Chinese: "79",
          Math: "100",
          English: "80",
        },
        // 二年級
        {
          School: "第一小學",
          Grade: "2年級",
          Class: "1班",
          Name: "趙六",
          Chinese: "95",
          Math: "100",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "2年級",
          Class: "2班",
          Name: "錢八",
          Chinese: "98",
          Math: "85",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "2年級",
          Class: "3班",
          Name: "陳九",
          Chinese: "79",
          Math: "100",
          English: "100",
        },
        // 三年級
        {
          School: "第一小學",
          Grade: "3年級",
          Class: "1班",
          Name: "黃十",
          Chinese: "91",
          Math: "88",
          English: "80",
        },
        {
          School: "第一小學",
          Grade: "3年級",
          Class: "2班",
          Name: "魏一",
          Chinese: "90",
          Math: "86",
          English: "87",
        },
        {
          School: "第一小學",
          Grade: "3年級",
          Class: "3班",
          Name: "楊二",
          Chinese: "79",
          Math: "99",
          English: "80",
        },
        // 第二小學
        {
          School: "第二小學",
          Grade: "3年級",
          Class: "3班",
          Name: "袁零",
          Chinese: "79",
          Math: "99",
          English: "80",
        },
      ],
    };
  },
  methods: {
    /**
     * 分析每一列,找出相同的
     * @param data
     */
    getSpanArr() {
      for (let i = 0; i < this.tableData.length; i++) {
        let row = i;
        // let col = i % this.colCount;
        if (row === 0) {
          // i 表示行 j表示列
          for (let j = 0; j < this.colFields.length; j++) {
            this.spanArr[i * this.colFields.length + j] = {
              rowspan: 1,
              colspan: 1,
            };
          }
        } else {
          for (let j = 0; j < this.colFields.length; j++) {
            // 當前和上一次的一樣
            //  合并所有列的相同數據單元格
            if (
              this.colFields[j] == "School" ||
              this.colFields[j] == "Grade" ||
              this.colFields[j] == "Class"
            ) { // 指定合并哪些列
              if (
                this.tableData[row]["School"] !==
                  this.tableData[row - 1]["School"]
              ) { // 哪些不合并:School不一樣的,不合并
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1,
                  colspan: 1,
                };
              } else if (
                this.tableData[row][this.colFields[j]] ===
                this.tableData[row - 1][this.colFields[j]]
              ) {
                let beforeItem =
                  this.spanArr[(row - 1) * this.colFields.length + j];
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1 + beforeItem.rowspan,// 合并幾列
                  colspan: 1,// 合并幾行
                };
                beforeItem.rowspan = 0;
                beforeItem.colspan = 0;
              } else {
                // rowspan 和 colspan 都為1表格此單元格不合并
                this.spanArr[row * this.colFields.length + j] = {
                  rowspan: 1,
                  colspan: 1,
                };
              }
            }
          }
        }
      }
      // 對數據進行倒序
      let stack = [];
      for (let i = 0; i < this.colFields.length; i++) {
        for (let j = 0; j < this.tableData.length; j++) {
          // console.log("i=" + i + " j=" + j);
          // i 表示列 j表示行
          if (j === 0) {
            if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
              stack.push(this.spanArr[j * this.colFields.length + i]);
            }
          } else {
            if (this.spanArr[j * this.colFields.length + i].rowspan === 0) {
              stack.push(this.spanArr[j * this.colFields.length + i]);
            } else {
              stack.push(this.spanArr[j * this.colFields.length + i]);
              while (stack.length > 0) {
                let pop = stack.pop();
                let len = stack.length;
                this.spanArr[(j - len) * this.colFields.length + i] = pop;
              }
            }
          }
        }
      }
      // console.log(this.spanArr);
    },
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]);
      return this.spanArr[rowIndex * this.colFields.length + columnIndex];
    },
  },
  mounted() {
    this.getSpanArr();
  },
};
</script>
<style lang="scss" scoped></style>

參考:https://blog.csdn.net/u010735120/article/details/122184493

到此這篇關于el-table表格動態合并相同數據單元格(可指定列+自定義合并)的文章就介紹到這了,更多相關el-table 動態合并單元格內容請搜索技圈網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持技圈網!

聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
發表評論
更多 網友評論0 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 亚洲av永久综合在线观看尤物| 国产精品无码日韩欧| 国产91中文剧情在线观看| 久久伊人精品一区二区三区| 国产喷水在线观看| 日韩黄色一级大片| 国产精品毛片无遮挡| 亚洲另类专区欧美制服| 2020阿v天堂网| 欧美国产综合视频| 国产精品不卡高清在线观看| 亚洲乱码中文字幕综合| jizzjizz丝袜老师| 最近的中文字幕国语电影直播| 国产欧美日韩综合精品二区| 九九综合VA免费看| 黑森林av福利网站| 日本高清视频色wwwwww色| 国产剧情av麻豆香蕉精品| 久久久久久久久久久福利| 色欲香天天天综合网站| 成人免费公开视频| 免费a级毛片大学生免费观看| www.黄在线| 激情内射亚洲一区二区三区爱妻| 国内精品久久久久久久97牛牛| 亚洲日本一区二区一本一道| 伊人中文字幕在线观看| 最新国产在线播放| 国产一级特黄生活片| 一级毛片人与动免费观看| 粗暴hd另类另类| 国产裸体舞一区二区三区| 亚洲乱码一区av春药高潮| 麻豆av一区二区三区| 手机看片你懂的| 人人妻人人澡av天堂香蕉| 2018天天操夜夜操| 日韩中文字幕在线观看| 含羞草实验研所入口 | 欧美日韩国产成人精品|