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指向问题呢?
你的报错提示,
this
上并没有isNumber的方法
,你可以打印一下this
,看看属性是否有isNumber