表格数字变成e+17怎么办(表格数字变成e+18)

前端通过 xlsx 库直接读取 excel 表格内容,可以拿到单独的表头 header 和表格行数据 results,然后再根据规则来自定义校验每一个单元格数据。

利用模块来单独拆分校验规则,import 进来的方法里是可以直接修改当前页的数据的,如下面的 errors 就是定义在页面里,但是我们可直接把 errors 作为参数传进去,errors 作为引用数据在模块里修改了页面上也是可以同步的。

表格数字变成e+17怎么办(表格数字变成e+18)

test.js

import * as validate from './validate.mjs'

// xlsx 前端直接读取 excel 表格内容
// 可以拿到单独的表头 header 和表格行数据 results
// header:包括所有表头名数组,空格表头会显示 UNKNOWN 17,表头名可重复
// results:所有表格行对象数组数据,键为表头名,值为空的单元格不会出现在对象中,如表头名重复的项,对象中的键会直接在后面拼上 _1 这种序号保证唯一

let header = ['*订单号', '*中文名', '*英文名', '*数量', '*姓名', '*电话', '*邮箱', '地址']
let list = [
  {
    '*订单号': 'KF6677858004',
    '*中文名': '拖鞋',
    '*英文名': 'shoe',
    '*数量': 2,
    '*姓名': 'Burning',
    '*电话': 1345102704,
    '*邮箱': '232323@12.com',
  },
  {
    '*订单号': 'KF6677858005',
    '*中文名': '裤子',
    '*英文名': 'pants',
    '*数量': 2,
    '*姓名': 'cafehaus',
    '*电话': 1345102704,
    '*邮箱': '232323@163.222@333',
  },
  {
    '*订单号': 'AC6677858005',
    '*英文名': '未知',
    '*数量': 2,
    '地址': '深圳市南山区'
  },
]

// 校验规则,key 直接用序号去对应,否则表头名字修改了容易导致对应不上,表头加一个字段,这里就要对应加一条
let rules = {
    0: { required: true, validator: validate.orderId },
    1: { required: true, validator: validate.name },
    2: { required: true, validator: validate.englishName },
    3: { required: true, validator: validate.quantity },
    4: { required: true, validator: validate.userName },
    5: { required: true, validator: validate.phone },
    6: { required: true, validator: validate.email },
    7: { required: false },
}

let errors = {}
list.map((row, i) => {
    let keys = Object.keys(rules)
    keys.map(m => {
        // row, m, i, errors 这四个是通用参数,如果根据业务逻辑还需其他参数传入校验,建议放到下面的 other 对象里传入
        let other = {}

        // 示例其他参数:如需求需要校验不通过定位到具体的单元格,额外传入每个单元格的坐标
        // 单元格 X 和 Y 轴坐标,Y轴一般第一行是表头,第二行就是数据
        other.x = covertToAlphabet(+m + 1) // 注意:这里的 m 是 rules 对象的 key,实际是 string
        other.y = i + 2

        if (rules[m].required && rules[m].validator) {
            rules[m].validator(row, header[m], i, errors, other)
        }
    })
})
console.log(errors)

// 数字序号转英文字母:1-A 26-Z 29-AC
function covertToAlphabet(n) {
    // charCodeAt:返回字符串第一个字符的 Unicode 编码
    // 参数 index 必需:表示字符串中某个位置的数字,即字符在字符串中的下标
    let codeA = 'A'.charCodeAt(0) // 65
    let codeZ = 'Z'.charCodeAt(0) // 90
    let len = codeZ - codeA + 1 // 26 字母表的字母个数

    let res = ''
    while(n) {
        n -= 1

        // fromCharCode:将 Unicode 编码转为一个字符
        res = String.fromCharCode(n % len + codeA) + res
        n = parseInt(n / 26)
    }
    return res
}

// 英文字母序号转数字:A-1 AC-29
function covertToNumber(str) {
    // charCodeAt:返回字符串第一个字符的 Unicode 编码
    // 参数 index 必需:表示字符串中某个位置的数字,即字符在字符串中的下标
    let codeA = 'A'.charCodeAt(0) // 65
    let codeZ = 'Z'.charCodeAt(0) // 90
    let len = codeZ - codeA + 1 // 26 字母表的字母个数

    let num = 0
    for (let x of str) {
        num *= len
        num += x.charCodeAt(0) - (codeA - 1)
    }

    return num
}

validate.js

/**
*  公共参数
*
*  @param {object} row 当前行数据
*  @param {string} key 当前单元格表头 key
*  @param {number} i 数据行序号
*  @param {array} errors 错误数据
*  @param {object} other 可选,其他额外的参数
*/

export function orderId(row, key, i, errors, other) {
    let val = row[key]

    if (!val) {
        errCallback(key + '不能为空', { row, key, i, errors, other })
    } else if ((val + '').length > 10) {
        errCallback(key + '不能大于10个字符', { row, key, i, errors, other })
    }
}

export function name(row, key, i, errors, other) {
    let val = row[key]

    if (!val) {
        errCallback(key + '不能为空', { row, key, i, errors, other })
    }
}

export function englishName(row, key, i, errors, other) {
    let val = row[key]
    let reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/

    if (!val) {
        errCallback(key + '不能为空', { row, key, i, errors, other })
    } else if (reg.test(val)) {
        errCallback(key + '不能包含中文', { row, key, i, errors, other })
    }
}

export function quantity(row, key, i, errors, other) {
    let val = row[key]

    if (!val) {
        errCallback(key + '不能为空', { row, key, i, errors, other })
    }
}

export function userName(row, key, i, errors, other) {
    let val = row[key]

    if (!val) {
        errCallback(key + '不能为空', { row, key, i, errors, other })
    }
}

export function phone(row, key, i, errors, other) {
    let val = row[key]
    let reg = /^1[3-9]\d{9}$/

    if (!val) {
        errCallback(key + '不能为空', { row, key, i, errors, other })
    } else if (!reg.test(val)) {
        errCallback(key + '格式错误', { row, key, i, errors, other })
    }
}

export function email(row, key, i, errors, other) {
    let val = row[key]
    let reg = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

    if (!val) {
        errCallback(key + '不能为空', { row, key, i, errors, other })
    } else if (!reg.test(val)) {
        errCallback(key + '格式错误', { row, key, i, errors, other })
    }
}

// 统一错误处理
function errCallback(msg, arg = {}) {
    let idx = arg.i
    if (!arg.errors[idx]) arg.errors[idx] = []

    arg.errors[idx].push({
        msg,
        key: arg.key,
        index: arg.i,
        y: arg.other.y,
        x: arg.other.x,
    })
}

最终可以拿到像下面这样的 errors 所有校验的错误结果,然后可以再自定义来给用户展示

{
  '0': [
    { msg: '*订单号不能大于10个字符', key: '*订单号', index: 0, y: 2, x: 'A' },
    { msg: '*电话格式错误', key: '*电话', index: 0, y: 2, x: 'F' }
  ],
  '1': [
    { msg: '*订单号不能大于10个字符', key: '*订单号', index: 1, y: 3, x: 'A' },
    { msg: '*电话格式错误', key: '*电话', index: 1, y: 3, x: 'F' },
    { msg: '*邮箱格式错误', key: '*邮箱', index: 1, y: 3, x: 'G' }
  ],
  '2': [
    { msg: '*订单号不能大于10个字符', key: '*订单号', index: 2, y: 4, x: 'A' },
    { msg: '*中文名不能为空', key: '*中文名', index: 2, y: 4, x: 'B' },
    { msg: '*英文名不能包含中文', key: '*英文名', index: 2, y: 4, x: 'C' },
    { msg: '*姓名不能为空', key: '*姓名', index: 2, y: 4, x: 'E' },
    { msg: '*电话不能为空', key: '*电话', index: 2, y: 4, x: 'F' },
    { msg: '*邮箱不能为空', key: '*邮箱', index: 2, y: 4, x: 'G' }
  ]
}

免责声明: 文章源于会员发布,不作为任何投资建议

如有侵权请联系我们删除,本文链接:https://www.sws100.com/%e8%a1%8c%e4%b8%9a%e5%8a%a8%e6%80%81/362554.html

(0)
句子百科句子百科
上一篇 2023年 4月 19日
下一篇 2023年 4月 19日

相关推荐

  • 三头六臂的人物是谁(三头六臂的人物是谁神话故事写一段话)

    三头六臂,即拥有三个脑袋,六条胳膊,形容神通广大。在神魔小说《封神演义》中,不仅存在三头六臂,还存在三头八臂,甚至是二十四头十八臂的神通。本集,我们就一起来细数一下拥有多头多臂法相的八位神通者。 第一位,商朝太子-殷郊。广成子让殷郊去西岐辅助姜子牙,殷郊临行前吃了狮子崖上的六七枚豆子,长出三头六臂的法身 第二位,焰中仙-罗宣,罗宣擅长火系法术。当他被西岐众将…

    2023年 4月 12日
  • 一级和三级空调的区别(一级和三级空调耗电差多少)

    最近看到格力美的空调大战,连带产品价格不断下跌,评价君和很多朋友都很开心。当然,格力美的心可能并不悲伤,因为两场战争最终可能会受益,而失败者是其他空调品牌,这就是所谓的仙女战斗。 但是问题也来了,就是面对很多型号,我们不妨分析一下是选择一级能效产品还是三级能效产品。 首先看关系,就是“制冷量” =压缩机功率 x 能耗比”,如果我们让同一个房间冷却几个小时,制…

    2023年 4月 27日
  • 上海特色美食小吃(上海特色美食小吃排名)

    来到上海,首先要去的是东方明珠,登上最高点领略上海的壮丽与魅力。 欣赏完上海的标志性建筑,也要填满饥饿的肚子,可供选择的上海美食数不胜数。 除了种类繁多,上海美食也享有四海飘香的美誉。下面我就带大家看看六道“最正宗”的上海本帮菜,好吃又好吃,没吃过:怕是假上海人。 1、油爆河虾 油炸河虾作为上海的名菜,刚刚到达上海人的口味。炸河虾的主要原料是河虾,去买河虾的…

    2023年 4月 25日
  • 该能组什么词(刻能组什么词)

    【序跋】 作者:鲍尔吉原野 说到“童年”这个词,我觉得应该洗手。好像这个词是金子做的,我要用手拿起来。 小时候用的洗脸盆都很大,是搪瓷盆,盆底有一条大金鱼图案。把清水倒进盆里,鱼的尾巴仿佛在晃动,仿佛在游泳。我会在这样的水里洗很长时间,说是洗脸,洗手,而不是把水倒在鱼身上。 现在我60多岁了,身边的一切都和童年完全不一样。但说到“童年”这个词,我经常关掉房间…

    行业动态 2023年 4月 29日
  • 汽车喷水器喷不出水怎么办(汽车喷水器喷不出水怎么办,雨刮可以用)

    玻璃水喷冻住却喷不出来一般有这几种原因:玻璃水耗尽、喷水嘴堵住、系统配件损坏、玻璃水上冻。 玻璃水耗尽:玻璃水是需要定期添加的,可以根据实际使用情况进行添加,如果玻璃水喷不出来了,可能就是玻璃水用完了,只需要加玻璃水就可以,打开引擎盖,一般是一个蓝色的盖子,上面有前挡风玻璃的标志,打开加进去就可以,玻璃水价格也不高,可以多备两瓶放在车里。 喷水嘴堵住:这也是…

    2023年 4月 19日

联系我们

在线咨询: QQ交谈

邮件:k37759@foxmail.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信