uniapp微信小程序(云开发)上传excel文件并解析文件内容

1,140 阅读2分钟

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文件

image.png

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,这样就成功切换啦~

image.png

另外我们需要引入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、输出解析的数据,大功告成!!

image.png

image.png

(番外)可能有些小伙伴会问,为啥不直接上传到云函数然后直接解析呢,这个也是我的疑问哈哈哈哈,我曾经尝试使用FileReader对象想把file类型转换成buffer类型再进行解析,结果发现FileReader只适用于web端(我哭了┭┮﹏┭┮),所以如果大佬们有更好的解决方法麻烦告诉菜菜,感谢感谢ㄟ(≧◇≦)ㄏ