Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
340 views
in Technique[技术] by (71.8m points)

xlsx中this指向问题

let that = this;
      let file = e.file // 文件信息
      if (!file) {
        // 没有文件
        return false
      } else if (!/.(xls|xlsx)$/.test(file.name.toLowerCase())) {
        // 判断是否excel格式
        that.$message.error('上传格式不正确,请上传xls或者xlsx格式');
        return false;
      }
      const loading = this.$loading({
        lock: true,
        text: '正在读取Excel文件',
        spinner: 'el-icon-loading',
        background: 'rgba(0, 0, 0, 0.7)'
      });
      try {
        const fileReader = new FileReader();
        fileReader.onload = (ev) => {
          loading.text = '正在解析Excel数据'
          try {
          const data = ev.target.result;
          const workbook = XLSX.read(data, {
            type: 'binary' // 以字符编码的方式解析
          })
          const exlname = workbook.SheetNames[0] // sheet name
          const workSheet = workbook.Sheets[exlname]; // sheet obj
          const exl = XLSX.utils.sheet_to_json(workSheet) // 生成json表格内容

          const sheetRef = workSheet['!ref'] // A1:D3
          const range = XLSX.utils.decode_range(sheetRef) // {s: { r:0, c:0 }, e: {r:3, c:3}}
          let originHeadArr = []
          try {
            for (let c = range.s.c; c <= range.e.c; c++) {
              const header = XLSX.utils.encode_col(c) + '1' // A1, B1, C1, D1
              if (workSheet[header] && (workSheet[header].v || workSheet[header].v === 0)) {
                const columName = workSheet[header].v; //原始表头
                originHeadArr.push(columName)
              }
            }
          } catch (err) {
            loading.close();
            that.$message.error('解析原始表头出错');
            return false
          }
          const tableHeadArr = [];
          that.table_header.forEach(item => {
            tableHeadArr.push(item.prop);
          })
          if (exl.length > 1) {
            // 添加源文件数据
            exl.forEach(item => {
              let tableItem = {};
              const tableHintItem = {};
              for (let i = 0; i < tableHeadArr.length; i++) {
                const key = tableHeadArr[i];
                const fieldType = that.table_header[i].fieldType;
                tableHintItem[key] = ''; // 单元格类型错误提示对象
                if (originHeadArr.length >= i + 1) { // 在原始表格 数据范围内
                  if (item[originHeadArr[i]] || item[originHeadArr[i]] === 0) {
                    // 单元格不为空, 判断类型是否匹配
                    const value = item[originHeadArr[i]];
                    if (fieldType === 1) { // 必须number类型
                      if (that.isNumber(value)) { // 类型正常
                        tableItem[key] = value;
                      } else { // 类型错误
                        tableHintItem[key] = '数据类型不正确(须为数字),已使用默认值';
                        tableItem[key] = 0;
                      }
                    } else { // string类型
                      tableItem[key] = value + '';
                    }
                  } else {
                    // 单元格为空
                    tableHintItem[key] = '数据缺失,已使用默认值';
                    tableItem = that.setDefaultColum(tableItem, key, fieldType);
                  }
                } else { // 超出原始表格数据范围
                  tableItem = that.setDefaultColum(tableItem, key, fieldType);
                }
              }
              that.tableData.push(tableItem);
              that.tableHintData.push(tableHintItem);
            })
          }
          loading.close();
          } catch (err) {
            loading.close();
            that.$message.error('解析表格出错');
            return false
          }
        }
        fileReader.readAsBinaryString(file);
      } catch (e) {
        that.$message.error('解析表格出错');
        loading.close();
        return false
      }

这是上传excel解析内容的代码,约定好fieldType为1即为数字类型,问题出在判断是不是数字类型这里,当代码走到if(fieldType== ==1)时,判断字段应为数字类型,这时继续判断value是否为数字时,if(that.isNumber(value))这步报了that.isNumber is not function的错误,在这个方法最开始已经重定义了this,为什么在这里还会出this指向问题呢?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

你的报错提示,this上并没有isNumber的方法,你可以打印一下this,看看属性是否有isNumber


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...