sheetjs/js-xlsx

参考

  • 一个很值得看的博客

学习

对Excel内容进行判断

最终的方法

$(function () {
  //读取Excel
  $("#file").on("change", function (e) {
    fileChange3(e);

  })
})
//获取Excel方法3(最终的方法)
function fileChange3(e) {
  var files = e.target.files;
  var fileReader = new FileReader();
  fileReader.onload = (ev) => {
    try {
      var data = ev.target.result,
        workbook = XLSX.read(data, {
          type: 'binary'
        }), // 以二进制流方式读取得到整份excel表格对象
        persons = []; // 存储获取到的数据
    } catch (e) {
      console.log('文件类型不正确');
      return;
    }

    //所有表名
    var sheetNames = workbook.SheetNames; // 返回 ['sheet1', 'sheet2']
    //根据表名获取对应某张表
    var worksheet = workbook.Sheets[sheetNames[0]];
    //得到数据所在的范围。起始坐标对象s,结束坐标对象e
    var range = XLSX.utils.decode_range(worksheet['!ref']);

    //列的开始
    var cs = range.s.c;
    //列的结束
    var ce = range.e.c;
    //行的开始
    var rs = range.s.r;
    //行的结束
    var re = range.e.r;



    for (let j = cs; j <= ce; j++) {
      for (let i = rs + 1; i <= re; i++) {
        //判断是不是中文
        let regZH = new RegExp("^[\u4e00-\u9fa5]+$", "g");
        //判断是不是英文字母和数字
        let regLetter_Num = RegExp("^[a-z0-9A-Z]+$", "g");
        //判断是不是只是数字
        let regNum = new RegExp("^[0-9]+$", "g");

        //获取当前坐标
        var addr = XLSX.utils.encode_cell({ r: i, c: j });  //输出格式:H8

        //得到当前行的 单元格
        var cel = worksheet[addr];

        //Excel内容判断
        if (cel && j == 0) {  //姓名
          let celv = cel.v;//单元格的内容
          if (!regZH.test(celv)) {
            console.log("error:" + celv + "==只能输入中文==坐标:" + addr);
            return;
          }
        }
        if (cel && j == 1) {  //身份证号
          let celv = cel.v;//单元格的内容
          if (!regLetter_Num.test(celv)) {
            console.log("error:" + celv + "==只能输入英文字母和数字==坐标:" + addr);
            return;
          }
        }
        if (cel && j == 2) {  //工资
          let celv = cel.v;//单元格的内容
          if (!regNum.test(celv)) {
            console.log("error:" + celv + "==只能输入数字==坐标:" + addr);
            return;
          }
        }
      }
    }
    //我成功了!!
    success();



  }
  // 以二进制方式打开文件
  fileReader.readAsBinaryString(files[0]);
}

其他的笔记

  • 读取单元格

    在 sheet 中读单元格是通过索引下标的形式,像这样:sheet[“A1”] 表示读取第一个单元格(下文用 A1 泛指这种表示方法)。这种方式保持了 excel 软件里面的用法,很好理解,但是不利于程序编码。通常处理二维数据,最容易想到的就是通过行列索引直接定位一个单元格,但是 sheet 并不支持这种方式,好在 xlsx 提供了几个函数,方便在行列索引和“A1”索引相互转换:

    • xlsx.utils.encode_row(row_index) 将基于 0 的索引转换为基于 1 的索引,之所以有这个方法是因为,程序里面下标都是从 0 开始计算,而 excel 软件却是从 1 开始计算
    • xlsx.utils.decode_row(row) 与上个方法相反,将基于 1 的索引转换为基于 0 的索引
    • xlsx.utils.encode_col(col_index) 将基于 0 的索引转换为 ABCD 这种列;excel 表格软件中,- 列的表示是A, B, C, D,这个函数将 A, B, C, D 对应到 0, 1, 2, 3
    • xlsx.utils.decode_col(col) 与上个方法相反,将 ABCD 这种列索引转换为基于 0 的索引
    • xlsx.utils.encode_cell(object) 将一个行列对象转换为 A1 这种字符串
    • xlsx.utils.decode_cell(addr) 与上个方法相反,将 A1 这种字符串转换为一个行列对象
    • xlsx.utils.encode_range(obj) 将一个范围对象转换为 A1:G8 这种字符串
    • xlsx.utils.decode_range(addr) 与上个方法相反,将 A1:G8 这种字符串转换为行列对象
  • 获得某个表的 json对象

XLSX.utils.sheet_to_json(worksheet)
  • 获得表头信息
//获得表头信息
function get_header_row(sheet) {
  console.log("run get_header_row");
  const headers = []
  const range = XLSX.utils.decode_range(sheet['!ref'])
  let C
  const R = range.s.r /* start in the first row */
  for (C = range.s.c; C <= range.e.c; ++C) { /* walk every column in the range */
    var cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })] /* find the cell in the first row */
    var hdr = 'UNKNOWN ' + C // <-- replace with your desired default
    if (cell && cell.t) hdr = XLSX.utils.format_cell(cell)
    headers.push(hdr)
  }

  return headers
}

你可能感兴趣的:(xlsx,JavaScript)