当前位置:   article > 正文

使用elementUI构建复杂表格,合并行或列,多级表头等

elementui

项目场景:

        前端开发过程中常常会遇到各种开发表格的场景,有时候有的表格比较简单有的比较复杂(如下图简单示例所示,有合并项和多级表头),Elementui的el-table控件也可以支持构建复杂的表格,本文将指导你如何快速开发复杂表格~~~


问题描述及解决方案

1、多级表头

数据结构比较复杂的时候,可使用多级表头来展现数据的层次关系。

只需要在 el-table-column 里面嵌套 el-table-column,就可以实现多级表头。

  1. <template>
  2. <div class="tableWrap">
  3. <el-table
  4. id="resultTableProject"
  5. :data="tableData"
  6. border
  7. v-loading="loading"
  8. element-loading-text="数据查询中"
  9. :span-method="spanMethod"
  10. height="620"
  11. size='small'
  12. >
  13. <el-table-column
  14. label="项目编号"
  15. prop="id"
  16. wdth="160"
  17. align="center"
  18. />
  19. <el-table-column
  20. label="项目名称"
  21. prop="casename"
  22. align="center"
  23. />
  24. <el-table-column
  25. label="部门"
  26. prop="bm"
  27. align="center"
  28. />
  29. <el-table-column
  30. label="部门人员(产值)"
  31. align="center"
  32. >
  33. <el-table-column
  34. v-for="(item, index) in userData"
  35. :key="index"
  36. :label="item.name"
  37. :prop="item.name + 'cz'"
  38. width="200"
  39. align="center"
  40. />
  41. </el-table-column>
  42. </el-table>
  43. </div>
  44. </template>
  45. <script setup>
  46. import { ref, onMounted,onBeforeMount, watch, reactive ,toRefs,toRaw,shallowRef} from "vue";
  47. let tableData=ref([
  48. { id:202112312,casename:'小家电项目',bm:"制造一队",'张三cz':100,},
  49. { id:202112342,casename:'小家电项目',bm:"制造二队",'李四cz':200,},
  50. { id:202112343,casename:'电视机',bm:"制造三队",'王五cz':300},
  51. { id:202112344,casename:'电视机',bm:"制造三队",'王五cz':300,},
  52. { id:202112345,casename:'空调项目',bm:"制造四队",'孙七cz':300},
  53. { id:202112346,casename:'冰箱项目',bm:"制造四队",'孙七cz':300},
  54. ])
  55. let userData=ref([
  56. {
  57. name:'张三',
  58. },
  59. {
  60. name:'李四',
  61. },
  62. {
  63. name:'王五',
  64. },
  65. {
  66. name:'孙七',
  67. }
  68. ])
  69. </script>

2、合并行或列

通过给table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列column、当前行号rowIndex、当前列号columnIndex四个属性。该函数可以返回一个包含两个元素的数组,第一个元素代表rowspan,第二个元素代表colspan。 也可以返回一个键名为rowspancolspan的对象。

  1. <template>
  2. <div class="tableWrap">
  3. <el-table
  4. id="resultTableProject"
  5. :data="tableData"
  6. border
  7. v-loading="loading"
  8. element-loading-text="数据查询中"
  9. :span-method="spanMethod"
  10. height="620"
  11. size='small'
  12. >
  13. <el-table-column
  14. label="项目编号"
  15. prop="id"
  16. wdth="160"
  17. align="center"
  18. />
  19. <el-table-column
  20. label="项目名称"
  21. prop="casename"
  22. align="center"
  23. />
  24. <el-table-column
  25. label="部门"
  26. prop="bm"
  27. align="center"
  28. />
  29. <el-table-column
  30. label="部门人员(产值)"
  31. align="center"
  32. >
  33. <el-table-column
  34. v-for="(item, index) in userData"
  35. :key="index"
  36. :label="item.name"
  37. :prop="item.name + 'cz'"
  38. width="200"
  39. align="center"
  40. />
  41. </el-table-column>
  42. </el-table>
  43. </div>
  44. </template>
  45. <script setup>
  46. import { ref, onMounted,onBeforeMount, watch, reactive ,toRefs,toRaw,shallowRef} from "vue";
  47. let tableData=ref([
  48. { id:202112312,casename:'小家电项目',bm:"制造一队",'张三cz':100,},
  49. { id:202112342,casename:'小家电项目',bm:"制造二队",'李四cz':200,},
  50. { id:202112343,casename:'电视机',bm:"制造三队",'王五cz':300},
  51. { id:202112344,casename:'电视机',bm:"制造三队",'王五cz':300,},
  52. { id:202112345,casename:'空调项目',bm:"制造四队",'孙七cz':300},
  53. { id:202112346,casename:'冰箱项目',bm:"制造四队",'孙七cz':300},
  54. ])
  55. let userData=ref([
  56. {
  57. name:'张三',
  58. },
  59. {
  60. name:'李四',
  61. },
  62. {
  63. name:'王五',
  64. },
  65. {
  66. name:'孙七',
  67. }
  68. ])
  69. const spanMethod = ({ row, column, rowIndex, columnIndex }) => {
  70. // 如果当前列不是组织机构列,则返回 { rowspan: 1, colspan: 1 },表示该单元格不需要合并
  71. // if (columnIndex !== 0 && columnIndex !== 1&& columnIndex !== 2 &&columnIndex!==9&&columnIndex!==10) {
  72. // return { rowspan: 1, colspan: 1 };
  73. // }
  74. if (columnIndex !== 0 && columnIndex !== 1) {
  75. return { rowspan: 1, colspan: 1 };
  76. }
  77. // 如果当前行是该组织机构的第一行,则计算该组织机构的行数,并返回 { rowspan, colspan: 1 },表示需要合并的行数为 rowspan
  78. if (
  79. rowIndex === 0 ||
  80. row.casename !== tableData.value[rowIndex - 1].casename
  81. ) {
  82. const rowCount = tableData.value.filter(
  83. (i) => i.casename === row.casename
  84. ).length;
  85. return { rowspan: rowCount, colspan: 1 };
  86. }
  87. // 否则返回 { rowspan: 0, colspan: 0 },表示该单元格已被上方单元格合并
  88. return { rowspan: 0, colspan: 0 };
  89. };
  90. </script>
  91. <style lang="less" scoped>
  92. .tableQualityProject {
  93. height: 100vh;
  94. width: 100%;
  95. overflow: auto;
  96. background-image: #f2f2f2;
  97. h1 {}
  98. }
  99. .tableWrap {
  100. padding: 0 20px;
  101. // width: 100%;
  102. // margin: 0 auto;
  103. /deep/ .el-table__header th {
  104. background-color: #409eff!important ; /* 设置表头颜色 */
  105. color: #fff; /* 设置表头文字颜色 */
  106. // background-color:#FAFAFA;
  107. // color:#252525;
  108. border:1px solid f5f5f5;
  109. }
  110. /deep/ .el-table .cell {
  111. // font-weight: 700;
  112. font-size: 16px;
  113. padding: 0;
  114. }
  115. .gzlWrap {
  116. // border-bottom:1px solid #dfdfdf;
  117. &:last-child {
  118. border-bottom: none;
  119. }
  120. span {
  121. display: inline-block;
  122. padding: 5px 0;
  123. }
  124. .key {
  125. width: 60%;
  126. }
  127. .value {
  128. width: 40%;
  129. }
  130. }
  131. .selfTableHead {
  132. display: flex;
  133. span {
  134. display: inline-block;
  135. width: 60px;
  136. }
  137. }
  138. }
  139. </style>

3、自定义表头颜色

最简单的:修改表头样式即可

  1. .tableWrap {
  2. padding: 0 20px;
  3. // width: 100%;
  4. // margin: 0 auto;
  5. /deep/ .el-table__header th {
  6. background-color: #409eff!important ; /* 设置表头颜色 */
  7. color: #fff; /* 设置表头文字颜色 */
  8. // background-color:#FAFAFA;
  9. // color:#252525;
  10. border:1px solid f5f5f5;
  11. }
  12. /deep/ .el-table .cell {
  13. // font-weight: 700;
  14. font-size: 16px;
  15. padding: 0;
  16. }
  17. .gzlWrap {
  18. // border-bottom:1px solid #dfdfdf;
  19. &:last-child {
  20. border-bottom: none;
  21. }
  22. span {
  23. display: inline-block;
  24. padding: 5px 0;
  25. }
  26. .key {
  27. width: 60%;
  28. }
  29. .value {
  30. width: 40%;
  31. }
  32. }
  33. .selfTableHead {
  34. display: flex;
  35. span {
  36. display: inline-block;
  37. width: 60px;
  38. }
  39. }
  40. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/621566
推荐阅读
相关标签
  

闽ICP备14008679号