JS前端模拟Excel条件格式实现数据条效果

目录
  • 需求背景
  • 需求分析
  • 实现逻辑
  • 完整代码实现
    • template 部分
    • style 部分
    • script 部分
  • 最终实现效果

需求背景

最近业务中遇到一个有意思的需求,是要在现有的表格中实现类似 Excel 中的数据条的效果,在数据比较多的时候单纯看表格里的数字会比较密集且不容易对比,加上数据条之后就比较明显的看出数据的对比情况,也让表格看起来生动了一些,这算是融合了表格和柱状图的优点。

先来看下 Excel 的效果

下面记录下实现过程和原理。

需求分析

通过图片可以看出共有几种情况:

  • 只有正值:数据条全部向右
  • 只有负值:数据条全部向左
  • 正负值都有:正负值会以一个轴线做分割分布在左右两侧,根据正负值的多少轴线的位置也会相应的偏左或偏右

实现逻辑

实现这个效果的前提,我们要知道每列数据的最大值max和最小值min,最大值的数据条宽度就是100%,下面先用伪代码梳理下逻辑。

全是正值和全是负值的情况,这种情况就比较简单了,就是计算单元格的值占最大值的比例,计算公式是这样:数据条宽度 = (当前值 / max) * 100

正负值都有的情况多了一个“轴线位置“的计算和”数据条偏移量“计算

轴线位置 = (Math.abs(min) / (max - min)) * 100
数据条宽度 = (Math.abs(当前值) / (max - min)) * 100
// 当前值 < 0 时数据条在轴线左边,改变 right 值
// 数据条的总长为100%
right = 100 - 轴线位置
// 当前值 > 0 时数据条在轴线右边,改变 left 值
left = 轴线位置

轴线位置逻辑其实是 "最小值到0的距离在总长度(max-min)之间的占比",我们知道数字与0之间的距离其实就是绝对值的计算,那么转换为公式来表示就是:

数据条的宽度就是 “当前值到0的距离在总长度(max-min)之间的占比”,公式表示:

  • 数据条的偏移量,这里需要知道是向左还是向右偏移(最终是通过改变元素CSS的 left、right 属性来实现偏移)

完整代码实现

代码使用 Vue + ElementUI

template 部分

<template>
  <el-table :data="tableData" border style="width: 100%">
    <el-table-column
      v-for="item in columns"
      sortable
      :key="item.prop"
      :prop="item.prop"
      :label="item.label"
    >
      <template slot-scope="scope">
        <!-- 数据条 -->
        <div class="data-bar" :style="renderDataBar(item, scope.row)"></div>
        <!-- 轴线 -->
        <div class="data-bar-axis" :style="renderAxis(item, scope.row)"></div>
        <!-- 当前值 -->
        <span class="cell-value">{{ scope.row[item.prop] }}</span>
      </template>
    </el-table-column>
  </el-table>
</template>

style 部分

先放 style 部分是为了让大家对基础样式有个感受,渲染函数中主要就是动态修改元素的 width、left、right 的值

<style>
    .el-table .cell-value {
      position: relative;
    }
    .data-bar {
      position: absolute;
      top: 0;
      bottom: 0;
      margin: 5px auto;
      transition: width 0.2s;
    }
    .data-bar-axis {
      position: absolute;
      top: -1px;
      bottom: 0;
      border-right: 1px dashed #303133;
    }
</style>

script 部分

<script>
export default {
  data() {
    return {
      columns: [
        {
          prop: 'positive',
          label: '正值',
          min: 1,
          max: 10
        },
        {
          prop: 'negative',
          label: '负值',
          min: -1,
          max: -12
        },
        {
          prop: 'mixed',
          label: '正负值',
          min: -6,
          max: 5
        }
      ],
      tableData: []
    }
  },
  created() {
    this.initData()
  },
  methods: {
    initData() {
      // mock数据过程,忽略 ...
      this.tableData.push({...})
    },
    renderDataBar(column, row) {
      const { min, max, prop } = column
      // 当前单元格值
      const cellVal = row[prop]
      if (cellVal === 0) return { display: 'none' };
      let style = {
        width: '0',
        background: '#409eff'
      }
      // 全是正值 或 全是负值
      if (min >= 0 || max <= 0) {
        const width = ((cellVal / max) * 100).toFixed(2);
        style.width = `${width}%`
        style = min >= 0 ? { ...style, left: '0' } : { ...style, right: '0' }
      }
      // 正负值都有
      if (min < 0 && max > 0) {
        const range = max - min;
        // 轴线位置
        const leftOffset = Math.abs((min / range) * 100)
        // 数据条宽度
        const width = ((Math.abs(cellVal / range) * 100)).toFixed(2)
        style = cellVal > 0 ? {
          width: `${width}%`,
          left: `${leftOffset.toFixed(2)}%`
        } : {
          width: `${width}%`,
          background: '#F56C6C', // 负值进行颜色区分
          right: `${(100 - leftOffset).toFixed(2)}%`
        }
      }
      return style;
    },
    renderAxis(column) {
      const { min, max } = column
      if (min < 0 && max > 0) {
        // 正负值都有的情况下,显示轴线
        const range = max - min;
        const leftOffset = (((0 - min) / range) * 100).toFixed(2)
        return {
          left: `${leftOffset}%`
        }
      } else {
        return {
          display: 'none'
        }
      }
    }
  }
}
</script>

最终实现效果

以上就是JS前端模拟Excel条件格式实现数据条效果的详细内容,更多关于JS模拟Excel数据条的资料请关注我们其它相关文章!

(0)

相关推荐

  • JavaScript实现导入导出excel的示例代码

    目录 Excel导入 html代码 js代码 Excel导出 html代码 js代码 Excel导入 html代码 <button style={{ color: '#1890ff', fontSize: '14px', cursor: 'pointer' }} onClick={() => { upFile(); }} > 导入 </button> <input id="upFile" type="file" style={{

  • 使用JS解析excel文件的完整实现步骤

    目录 前言 excel 表格文件到底是什么 JS 实现步骤 ZIP 解压 XML 解析 总结 前言 今天来聊一聊如何使用 JS 来解析 excel 文件,当然不是直接使用 exceljs.sheetjs 之类的库,那就没意思了,而是主要说一下 JS 解析 excel 表格是如何实现的. 注意本文主要讨论 xlsx 格式的 excel 表格,其它格式未探究并不清楚. excel 表格文件到底是什么 首先要解析 excel 文件,得先了解他是如何存储数据的,经过我百般搜索,终于在 GG 中找到了答案

  • JavaScript 中使用SpreadJS导入和导出 Excel 文件的方法

    目录 设置 JavaScript 电子表格项目 添加 Excel 导入代码 将数据添加到导入的 Excel 文件 添加迷你图 添加 Excel 导出代码 JavaScript在前端领域占据着绝对的统治地位,目前更是从浏览器到服务端,移动端,嵌入式,几乎所有的所有的应用领域都可以使用它.技术圈有一句很经典的话“凡是能用JavaScript实现的东西,最后都会用JavaScript实现”.Excel 电子表格自 1980 年代以来一直为各行业所广泛使用,至今已拥有超过3亿用户,大多数人都熟悉 Exc

  • js前端实现word excel pdf ppt mp4图片文本等文件预览

    目录 前言 实现方案 docx文件实现前端预览 代码实现 实现效果 pdf实现前端预览 代码实现 实现效果 excel实现前端预览 代码实现 实现效果 pptx的前端预览 实现效果 总结 前言 因为业务需要,很多文件需要在前端实现预览,今天就来了解一下吧. 可以点击下面地址体验喔 git仓库地址以及在线demo地址 实现方案 找了网上的实现方案,效果看起来不错,放在下面的表格里,里面有一些是可以直接通过npm在vue中引入使用. 文档格式 老的开源组件 替代开源组件 word(docx) mam

  • js使用xlsx读取excel文件的详细步骤

    目录 下载安装插件 文件基础 获取文件对象 读取文件数据 读取Excel 通过xlsx获取workbook WorkBook介绍 读取WorkBook 导出Excel 生成sheet 总结 下载安装插件 npm install xlsx or yarn add xlsx 此时,在项目的node_modules文件夹和package.json文件中可以找到xlsx依赖. 文件基础 获取文件对象 我比较推荐使用h5的原生文件上传项 <input type="file" id=&quo

  • javascript 实现纯前端将数据导出excel两种方式

    目录 前言 方法一 方法二 前言 修改之前项目代码的时候,发现前人导出excel是用纯javascript实现的.并没有调用后台接口. 之前从来没这么用过,记录一下.以备不时之需. 方法一 将table标签,包括tr.td等对json数据进行拼接,将table输出到表格上实现,这种方法的弊端在于输出的是伪excel,虽说生成xls为后缀的文件,但文件形式上还是html, 代码如下: <html> <head>     <p style="font-size: 20p

  • JS前端模拟Excel条件格式实现数据条效果

    目录 需求背景 需求分析 实现逻辑 完整代码实现 template 部分 style 部分 script 部分 最终实现效果 需求背景 最近业务中遇到一个有意思的需求,是要在现有的表格中实现类似 Excel 中的数据条的效果,在数据比较多的时候单纯看表格里的数字会比较密集且不容易对比,加上数据条之后就比较明显的看出数据的对比情况,也让表格看起来生动了一些,这算是融合了表格和柱状图的优点. 先来看下 Excel 的效果 下面记录下实现过程和原理. 需求分析 通过图片可以看出共有几种情况: 只有正值

  • Java 设置Excel条件格式示例代码(高亮条件值、应用单元格值/公式/数据条等类型)

    概述 在Excel中,应用条件格式功能可以在很大程度上改进表格的设计和可读性,用户可以指定单个或者多个单元格区域应用一种或者多种条件格式.本篇文章,将通过Java程序示例介绍条件格式的设置方法,设置条件格式时,因不同设置需要,本文分别从以下示例要点来介绍: 示例1: 1. 应用条件格式用于高亮重复.唯一数值 2. 应用条件格式用于高亮峰值(最高值.最低值) 3. 应用条件格式用于高亮低于或高于平均值的数值 示例2: 1. 应用单元格值类型的条件格式 2. 应用公式类型的条件格式 3. 应用数据条

  • React.js前端导出Excel的方式

    目录 前言 实现方式 csv 与 Excel 的区别 react-csv xlsx cdn 方式 在 react 中使用 json 转 excel 结语 前言 前段时间,项目上有个需求需要将数据报表导出为 excel 的需求,这本来是后端的工作,前端只需要一个 a 标签,就可以下载文件,但不巧的是,正好遇到后端请假,而且项目比较着急,那么前端是否可以实现呢? 实现方式 经过一顿搜索后,发现有这么几个 npm 库 react-csv 根据给定的数据生成 CSV 文件,数据可以是二维数组.对象数组或

  • js实现模拟计算器退格键删除文字效果的方法

    本文实例讲述了js实现模拟计算器退格键删除文字效果的方法.分享给大家供大家参考.具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> &

  • js前端导出Excel的方法

    需求: 要求把项目中的table表格导出Excel 需求分析及解决: 既然需要导出,是报表的可能性比较大,我的项目中就是这样,那既然是报表导出,可以是前端导出,也可以是后端导出(技术包括POI或者报表工具等),这篇文章主 要是网上找的前端导出,既然是前端导出又是报表就需要有数据,所以数据都需要你提前做好相应填充 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF

  • JS前端千万级弹幕数据循环优化示例

    目录 引言 1.如何删除数组中的元素 2.10000,000条消息如何优化? 场景 常规思路: 产生的问题 优化策略 代码实现 效果展示 小结 游标法代替splice 二分查找 完结 引言 最近做了直播相关的业务,然后对于大数据相关的优化做了一下复盘. 为了了解我是怎么做这个优化的,我们先从如何按照特定的条件删除一个数组说起. 1.如何删除数组中的元素 场景:有一个数组,需要删除满足条件的数组. 示例: const arr = [1,2,3,4,5,6,7,8] 删除小于5的元素,删除后的元素为

  • 如何使用vue实现前端导入excel数据

    目录 前言 一.主界面先引入导入组件 二.封装excel-import组件 1.首先是template代码(这里用的是ant vue desgin框架的组件) 2.引入接口 3.js代码methods 三.附加提示(后端也要写的小伙伴可以参考下边建议哈) 四.总结 前言 继前边的vue的导出功能后,自己又去在网上搜了vue导入excel一些文章,自己通过对代码的整理和调整,实现了vue导入excel的功能. 一.主界面先引入导入组件 1.这段主要是中间的那段excel-import标签的那部分代

  • js前端对于大量数据的展示方式及处理方法

    最近暂时脱离了演示项目,开始了公司内比较常见的以表单和列表为主的项目. 干一个,爱一个了.从开始的觉得自己都做了炫酷的演示项目了,这对我来说就是个小意思,慢慢也开始踩坑,有了些经验总结可谈. 现下不得不说是个数据的时代,有数据就必定有前端来展示. 杂乱的数据通过数据分析(未碰到的点,不讲请搜),提炼出业务相关的数据维度,而前端所做的就是把这些一个个数据通过不同维度(key-value)的描述来展示到页面上. 除去花哨的展示方式(图表等),展示普通的大量列表数据有两种常用方式,分页和触底加载(滚动

  • JS获取一个表单字段中多条数据并转化为json格式

    如图需要获取下面两个li标签里面的数据,然后传给后台:而后台接收的数据格式是json的,所以需要把两个li里面的信息转化为以下格式的. {recieverName:小红,recieverPhone:12341234,recieverAddress:中国湖南},{recieverName:小明,recieverPhone:12345678,recieverAddress:中国上海} 代码如下: var recieverArr = []; //全局变量 var recieverMsg = {}; /

随机推荐