基于xlsx excel 导入功能

本文介绍了一种使用XLSX库导入Excel数据到JavaScript的方法,并实现了对姓名、年龄、生日等字段的数据验证。通过正则表达式检查数据格式,确保导入数据的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import XLSX from 'xlsx';
const DIGIT_REGEX = /^[0-9]*$/;
const NAME_REGEX = /^[\u4e00-\u9fa5]{0,}$/;
const DATE_REGEX = /^\d{4}-\d{1,2}-\d{1,2}$/;
const PHONE_REGEX = /^1[3|4|5|7|8][0-9]{9}$/;
const EMAIL_REGEX = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;

/**
 * xlsx 方式导入
 * @param e 所选文件
 * @param headerMap [key => value| 中文 => pojo属性]
 * @param handleResCallback 处理结果集[验证数据合法性]
 * @param errorCallback 处理异常
 */
function importExcel(e, headerMap, handleResCallback, errorCallback){
  const { files } = e.target;
  if (!files) return;
  const file = files[0];
  const fileReader = new FileReader();
  fileReader.readAsBinaryString(file);
  fileReader.onload = event => {
    try {
      const { result } = event.target;
      const wb = XLSX.read(result, { type: 'binary' });
      let res = [];
      for (const sheet in wb.Sheets) {
        if (wb.Sheets.hasOwnProperty(sheet)) {
          const data = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
          data.forEach(function (item, index) {
            for (let key in item) {
              if (headerMap.has(key)) {
                let columnName = headerMap.get(key);
                data[index][columnName] = data[index][key];
                delete data[index][key];
              }
            }
          });
          res = res.concat(data);
        }
      }
      handleResCallback(res);
    } catch (e) {
      console.log('文件类型不正确');
      errorCallback();
    }
  };
}

/**
 * 数字校验
 * @param value
 * @returns {boolean}
 */
function digitValitor(value) {
  if (!DIGIT_REGEX.test(value)) {
    return false;
  }
  return true;
}

/**
 * 名称校验
 * @param value
 * @returns {boolean}
 */
function nameValitor(value) {
  if (!NAME_REGEX.test(value)) {
    return false;
  }
  return true;
}

/**
 * 日期格式校验
 * @param value
 * @returns {boolean}
 */
function dateValitor(value) {
  if (!DATE_REGEX.test(value)) {
    return false;
  }
  return true;
}

/**
 * 电话号码校验
 * @param value
 * @returns {boolean}
 */
function phoneValitor(value) {
  if (!PHONE_REGEX.test(value)) {
    return false;
  }
  return true;
}

/**
 * 邮箱校验
 * @param value
 * @returns {boolean}
 */
function emailValitor(value) {
  if (!EMAIL_REGEX.test(value)) {
    return false;
  }
  return true;
}

export default {importExcel, digitValitor, nameValitor, dateValitor, phoneValitor, emailValitor};

 

import React, {Component} from 'react';
import ExcelUtil from './ExcelUtil';

class Users extends Component{
    state = {
       headerMap:{}
    }
    
   componentDidMount() {
    const map = new Map();
    map.set("姓名","name");
    map.set("年龄","age");
    map.set("性别","sex");
    map.set("出生日期","birthday");
    this.state.headerMap = map;
   }    

    callback = (res) => {
        console.log("正在开始导入...");
        res.forEach(function (item, index) {
            for (let key in item) {
                let value = item[key];
                if (key == 'name') {
                    if (!ExcelUtil.nameValitor(value)) {
                        console.log("name -----非法");
                        break;
                    }
                }
                if (key == 'age') {
                    if (!ExcelUtil.digitValitor(value)) {
                        console.log("age -----非法");
                        break;
                    }
                }
                if (key == 'birthday') {
                    if (!ExcelUtil.dateValitor(value)) {
                        console.log("birthday -----非法");
                        break;
                    }
                }
            }
        });
        console.log("导入成功...");
        //TODO validate json
        //TODO json TO list<object> insert db
        //TODO refresh table list
    }

    error() {
        console.log("导入失败");
    }
    
    render() {
        
        return (
            <span style={{display:this.state.btnAddDisplay,marginRight:10}}>
               <input type='file' accept='.xlsx, .xls' onChange={(e)=>                               
                {ExcelUtil.importExcel(e, this.state.headerMap, this.callback, this.error)}}/>
            </span>
        )
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值