这个实现不对,要的是excel里面的高亮重复项效果

简介: 这个实现不对,要的是excel里面的高亮重复项效果

前言

项目里的一个比较数据重复的功能,根据勾选的列,选择表格行数据,然后点击高亮重复项对比当前选中的行里面的数据,抛开业务部分这个功能提取后长这样子

image.png

原型评审的时候,产品经理就说了一句,这里根据选择的列,勾选表格数据,校验数据重复

开发顺利开发完了,测试人员也测试通过标记当前任务结束了,结果过来一周多,产品经理跑过来说,这个功能实现的不对,我要的是 Excel 里面的高亮重复项功能,像这个操作,噼里啪啦演示了一波,我的天呐,怎么原型评审的时候不这么演示一下呢


项目开发周期这么紧张,这功能项关联的业务逻辑也需要调整,项目进度是不会因为这个功能调整了就改变上线时间的,还想抓紧时间改,当场我就EMO了


思路梳理

工作上的事情不能带情绪,虽然一万个不愿意,还是得抽空把产品经理的需求给搞定了,我们来看下 Excel 中的高亮重复项功能的实现效果是怎样的

image.png

通过 WPS Excel 中的操作可以看出,表格数据高亮重复项可以选中一个数据列实现当前数据列 数据重复高亮,也可以多列对比重复项

代码实现

根据 Excel 的高亮重复项操作逻辑我们分析得出,代码核心实现需要两个步骤:1.获取重复项数据;2.设置表格高亮

项目需求功能如下效果

image.png

通过实际项目需求操作模式来进行分析,首先基本的表格展示,多选功能,高亮列的选中,高亮重复项操作按钮, vue 文件中 template 代码如下

<el-table
  border
  ref="multipleTable"
  :data="tableData"
  @selection-change="handleSelectionChange"
  style="width: 500px"
>
  <el-table-column type="selection" width="55"> </el-table-column>
  <el-table-column label="日期">
    <template slot-scope="scope">{{ scope.row.date }}</template>
  </el-table-column>
  <el-table-column label="姓名">
    <template slot-scope="scope">
      <div
        v-if="scope.row.back"
        class="background-color-ffff00"
      >
        {{ scope.row.name }}
      </div>
      <div v-else>{{ scope.row.name }}</div>
    </template>
  </el-table-column>
  <el-table-column label="昵称">
    <template slot-scope="scope">
      <div
        v-if="scope.row.back2"
        class="background-color-ffff00"
      >
        {{ scope.row.nickName }}
      </div>
      <div v-else>{{ scope.row.nickName }}</div>
    </template>
  </el-table-column>
</el-table>
<div style="margin-top: 20px; display: flex">
  <el-checkbox-group
    v-model="checkList"
    style="margin-right: 20px; margin-top: 10px"
  >
    <el-checkbox label="name">姓名</el-checkbox>
    <el-checkbox label="nickName">昵称</el-checkbox>
  </el-checkbox-group>
  <el-button @click="highLightData">高亮重复项</el-button>
  <el-button @click="clearHighLightData">清除高亮重复项</el-button>
</div>
<script>
export default {
  name: 'Table1',
  components: {},
 data () {
    return {
      checkList: [],
      tableData: [
        {
          id: '1',
          date: '2016-05-03',
          name: '张三',
          nickName: '李四'
        },
        {
          id: '2',
          date: '2016-05-02',
          name: '李四',
          nickName: '曹操'
        },
        {
          id: '3',
          date: '2016-05-04',
          name: '张三',
          nickName: '赵云'
        }
...

表格单元格数据高亮是通过设置的一个自定义变量的来实现的,由于实际项目需求中表格数据只有两列需要高亮显示,因此这里使用两个控制变量来实现,通过 checkList 选中的 name 值对应不同的变量,通过 v-if 的方式控制高亮的 div 背景样式

接下来,来分析对应的操作功能,高亮重复项功能通过选中数据和表格列后,只需要一个点击,所有的逻辑都在这个这个按钮的点击触发函数里完成,开始JS逻辑的实现分析

1.获取重复项数据

基于选中列和行的对比的表格中的重复数据, 高亮重复项 按钮点击后先校验数据行是否选中,以及高亮重复项的列是否选中,这个是基础的校验,所有操作,由于是基于案例分析单独写的 demo,校验失败使用的 console.warn

通过 multipleSelection 表格选中行数据和 checkList 选中列筛选出重复项内容,得到高亮重复项数据后,接下来获取到对应的行索引并记录,并把当前行对应的列的控制变量 back* 设置为 true

if (this.multipleSelection.length < 2) {
  console.warn('先选择至少两行数据')
  return false
}
if (this.checkList.length === 0) {
  console.warn('请先选择一列')
  return false
}
// 获取重复项内容
const arr = []
const arr2 = []
this.multipleSelection.forEach((v, k) => {
  this.checkList.forEach(v2 => {
    if (arr.indexOf(v[v2]) === -1) {
      arr.push(v[v2])
    } else {
      if (arr2.indexOf(v[v2]) === -1) {
        arr2.push(v[v2])
      }
    }
  })
})
console.log('arr --xxx ', arr)
console.log('arr2 -- ', arr2)
this.multipleSelection.forEach((v, k) => {
  // 设置重复项所在的数据行
  arr2.forEach(item => {
    this.checkList.forEach(v2 => {
      if (v2 === 'name') {
        if (item === v[v2]) {
          v.back = true
        }
      }
      if (v2 === 'nickName') {
        if (item === v[v2]) {
          v.back2 = true
        }
      }
    })
  })
})

2.设置表格高亮

上面的步骤中已经把当前行对应的列的控制变量 back* 设置为 true, 这个时候可以在设置重复项所在的数据行的同时把当前高亮重复项的标记行数据替换到绑定的表格数据中,这样可以共用一个循环

// 更新表格行数据为高亮数据
const i = this.tableData.findIndex(item => item.id === v.id)
this.tableData.splice(i, 1, v)

这时候对于整个数据层,表格数据已经根据选中的行和列对比出高亮的数据项了,但是, 此时页面中的表格并没有根据数据的变化而重新渲染,手动处理一下表格数据,让表格数据渲染出高亮设置后的效果

// 更新表格视图,实现高亮
const highlightArr = JSON.parse(JSON.stringify(this.tableData))
this.tableData = []
this.tableData = highlightArr

整个表格数据列高亮重复项的功能总算完成了,我们来看下完整的 Demo 操作效果

image.png

演示代码地址

github.com/gywgithub/v…

思考总结

文章中的高亮重复项是两列对比,如果是更多列对比,例如表格数据是动态配置列显示,基于动态列,动态查询指定的数据,又是动态自定义高亮重复项,就像 Excel 表格中的高亮重复项功能一样,可以随便根据表格数据进行高亮重复项操作,像这种情况实现方面的可能就不能参考当前文章解决方案了,那遇到这种情况怎么解决呢?

我在做这里的项目需求功能的时候想到过一个思路:根据表格数据行索引和数据列索引的方式,去对比数据重复项,根据数据重复项记录需要表格中需要高亮的数据单元格位置,然后把这些记录的位置对应的单元格进行高亮处理

JYM 你们还有别的更好的思路或者实现方案吗? 欢迎大家评论区讨论交流,一起学习共同进步 ^-^

目录
相关文章
Excel提取重复项
学习了解Excel提取重复项。
103 0
Excel提取重复项
Excel删除重复项,不保留重复项数据
学习了解Excel删除重复项,不保留重复项数据。
292 0
Excel删除重复项,不保留重复项数据
Excel 当前行高亮
格式-条件格式-条件(公式)- =ROW()=CELL("row") 再选颜色...即可.
1031 0
|
8天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
112 4
|
4月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
47 0
|
2月前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
62 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
3月前
|
数据采集 存储 数据挖掘
使用Python读取Excel数据
本文介绍了如何使用Python的`pandas`库读取和操作Excel文件。首先,需要安装`pandas`和`openpyxl`库。接着,通过`read_excel`函数读取Excel数据,并展示了读取特定工作表、查看数据以及计算平均值等操作。此外,还介绍了选择特定列、筛选数据和数据清洗等常用操作。`pandas`是一个强大且易用的工具,适用于日常数据处理工作。
|
4月前
|
SQL JSON 关系型数据库
n种方式教你用python读写excel等数据文件
n种方式教你用python读写excel等数据文件