1、选择本地文件
由于uni.chooseFile这个api在微信小程序端不适用,所以我们直接使用微信官方提供的wx.chooseMessageFile从微信聊天会话中选择文件
wx.chooseMessageFile({
count: 1,
type: 'file',
success: (res) => {
// 判断文件类型
let fileType = res.tempFiles[0].name.substring(res.tempFiles[0].name.lastIndexOf('.') + 1)
if (fileType !== 'xlsx' && fileType !== 'xls') {
uni.$showMsg('选择的文件不是excel文件,请重新选择!', 'none')
} else {
this.fileName = res.tempFiles[0].name
let path = res.tempFiles[0].path
this.uploadExcel(path, fileType)
}
},
fail: (err) => {
console.log(err);
}
});
由于参数中type只有这几个大类,所以我们先选取file值再来判断是否是excel文件
2、上传本地文件到云存储
上传成功后返回fileID,是文件的唯一ID,用来访问文件,建议存储起来
// 上传文件到云端
uploadExcel(filePath, fileType) {
uniCloud.uploadFile({
filePath: filePath,
cloudPath: new Date().getTime() + '.' + fileType,
success: (res) => {
this.parseFile(res.fileID)
},
fail: () => {
uni.$showMsg('文件上传失败', 'error')
}
});
}
3、从云存储下载文件到本地进行解析
这时候就需要用到上面的fileID了,在用uniCloud.downloadFile这个api之前,请检查你使用的是阿里云还是腾讯云(重点!!!),如果是阿里云使用不了这个api o(╥﹏╥)o,这是个大坑啊啊啊啊啊 如果是用阿里云的小伙伴想使用这个api的话就改改环境吧,这里插播一个快捷改环境的方法:在文件夹中找到uniCloud-aliyun,将横杠后面改成tcb,这样就成功切换啦~
另外我们需要引入node-xlsx这个三方包
npm install node-xlsx --save
var xlsx = require('node-xlsx'); //引用node-xlsx依赖
// 通过fileID下载云存储里的excel文件
let result = await uniCloud.downloadFile({
fileID: fileID
})
let buffer = result.fileContent
// 存储excel数据
let excel_data = []
// 解析excel文件里的数据
//获取到所有sheets,因为表格可能会有多张表
let sheets = xlsx.parse(buffer);
// 对每张表进行解析
try {
sheets.forEach((sheet) => {
for (let rowId in sheet['data']) {
// 获取到表格的每一行
let row = sheet['data'][rowId]
// 表格格式错误
if (rowId === '0' && (row.length !== 3 || row[0] !== '学校' || row[1] !== '学号' || row[2] !== '姓名')) {
// 抛出错误,退出循环
throw new Error("表格格式错误");
}
if (row.length && +rowId >= 1) {
excel_data.push({
school: row[0],
code: row[1],
name: row[2]
})
}
}
})
} catch (err) {
if (err.message === "表格格式错误")
return fail // 自己定义的错误对象
else
return err
}
这里使用forEach来遍历每张表并检查相应字段(根据实际情况),若格式不符合要求,则使用抛出错误的方式中断forEach循环
4、输出解析的数据,大功告成!!
(番外)可能有些小伙伴会问,为啥不直接上传到云函数然后直接解析呢,这个也是我的疑问哈哈哈哈,我曾经尝试使用FileReader对象想把file类型转换成buffer类型再进行解析,结果发现FileReader只适用于web端(我哭了┭┮﹏┭┮),所以如果大佬们有更好的解决方法麻烦告诉菜菜,感谢感谢ㄟ(≧◇≦)ㄏ