微信小程序使用node-xlsx解析excel文件的云函数

1、右键新建node.js云函数

2、在该云函数右键:在外部终端窗口打开

3、输入npm install node-xlsx,回车

4、引入并写程序,如下

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

const xlsx = require('node-xlsx');

// 云函数入口函数
const db = cloud.database()

// 云函数入口函数
exports.main = async (event, context) => {

  const dx = event.dx
  const database = event.database

  //1、通过fileID下载云存储里的excel文件
  const res = await cloud.downloadFile({
    fileID: event.fileID,
  })
  const buffer = res.fileContent
  //2,解析excel文件里的数据
  var sheets = xlsx.parse(buffer); //获取到所有sheets
  const sheet = sheets[0]['data']; //获取到第一个表格的数据:格式:[[],[],[]]

  //将数据进行转换:[{},{},{}]
  //1.首先,用户上传的表格不知道是怎么样标题,所以标题 (sheet数据的第一行) 进行转换,作为对象的属性

  let key = []  //存放转换后的对象属性
  for (let i = 0; i < sheet[0].length; i++) {
      if(sheet[0][i] && sheet[0][i] == '年级'){key[i] = 'nj'}
      if(sheet[0][i] && sheet[0][i] == '班级'){key[i] = 'bj'}
      if(sheet[0][i] && (sheet[0][i] == '考号' || sheet[0][i] == '考生号')){key[i] = 'kh'}
      if(sheet[0][i] && (sheet[0][i] == '姓名' || sheet[0][i] == '学生姓名')){key[i] = 'xm'}
      if(sheet[0][i] && sheet[0][i] == '座号'){key[i] = 'zh'}

      // 如果上传的是学生信息
      if(dx == 'studentsInfo' && sheet[0][i]){
         if(sheet[0][i] == '性别'){key[i] = 'xb'}
         if(sheet[0][i] == '宿舍' || sheet[0][i] == '宿舍号'){key[i] = 'ssh'}
         if(sheet[0][i] == '学生手机' || sheet[0][i] == '学生电话'){key[i] = 'myphone'}
         if(sheet[0][i] == '家长姓名' || sheet[0][i] == '家长'){key[i] = 'parent'}
         if(sheet[0][i] == '家长手机' || sheet[0][i] == '家长电话' || sheet[0][i] == '联系电话'){key[i] = 'paphone'}
         if(sheet[0][i] == '家庭地址' || sheet[0][i] == '家庭住址' || sheet[0][i] == '联系地址' || sheet[0][i] == '家庭详细地址'){key[i] = 'address'}
      }

      // 如果上传的是成绩
      if(dx == 'studentsScore'){
        if(sheet[0][i] == '语文' && sheet[0][i]){key[i] = 'yw'}
        if(sheet[0][i] == '数学' && sheet[0][i]){key[i] = 'sx'}
        if(sheet[0][i] == '外语' || sheet[0][i] == '英语'){key[i] = 'wy'}
        if(sheet[0][i] == '物理'){key[i] = 'wl'}
        if(sheet[0][i] == '历史'){key[i] = 'ls'}

        if(sheet[0][i] == '化学原始分' || sheet[0][i] == '化学'){key[i] = 'hx'}
        if(sheet[0][i] == '化学赋分'){key[i] = 'hxff'}
        if(sheet[0][i] == '生物原始分' || sheet[0][i] == '生物'){key[i] = 'sw'}
        if(sheet[0][i] == '生物赋分'){key[i] = 'swff'}
        if(sheet[0][i] == '地理原始分' || sheet[0][i] == '地理'){key[i] = 'dl'}
        if(sheet[0][i] == '地理赋分'){key[i] = 'dlff'}
        if(sheet[0][i] == '政治原始分' || sheet[0][i] == '政治'){key[i] = 'zz'}
        if(sheet[0][i] == '政治赋分'){key[i] = 'zzff'}

        if(sheet[0][i] == '总分' || sheet[0][i] == '原始总分'){key[i] = 'yszf'}
        if(sheet[0][i] == '赋分总分'){key[i] = 'ffzf'}

        if(sheet[0][i] == '级排名' || sheet[0][i] == '全级排名' || sheet[0][i] == '级名次' || sheet[0][i] == '全级名次'){key[i] = 'jpm'}
        if(sheet[0][i] == '班排名' || sheet[0][i] == '全班排名' || sheet[0][i] == '班名次' || sheet[0][i] == '全班名次'){key[i] = 'bpm'}
      }
    }
    // 以上作为数组的对象属性

    //2、将sheet 下的其他行转换为对象
    let sheetData = []
    for (let j = 1; j < sheet.length; j++) {
      //j = 1,表示从sheet数组的第二行开始,因为第一行是标题
      let obj = {} //存放循环每一行的对象
      for (let k = 0; k < key.length; k++) {
          obj[key[k]] = sheet[j][k]
      } 

      obj.bj = Number(obj.bj) //每个学生的班级是数字
      obj.kh = Number(obj.kh) //每个学生的考号是数字
      obj.zh = Number(obj.zh) //每个学生的座号是数字

      if(dx == 'studentsInfo'){
        obj.status = 1  //每个用户添加状态
        obj.mm = 123456 //每个用户添加登录密码
      }
      if(dx == 'studentsScore'){
        obj.title = event.item //每个考生的展示的考试项目如:期中考
        obj.ksbh = Number(event.ksbh)//每次的考试编号
        obj.yszf = Number(obj.yszf)
        obj.jpm = Number(obj.jpm)
        obj.bpm = Number(obj.bpm)
      }
      sheetData.push(obj) //把所有循环出来的对象,全部放在sheetData中
    }

    return await db.collection(database).add({
      data: sheetData
    }).then(res=>{
        return res
    })
}

在小程序端虽然能使用,但是出现一些问题:
1、excel文件编码必修为UTF-8;
2、偶尔用记事本修改为UTF-8后还是报错!

报错内容如下:
Error: cloud.callFunction:fail Error: errCode: -504002 functions execute fail | errMsg: Error: collection.add:fail -501007 invalid parameters. [InvalidParameterValue.InvalidDoc] Document entered in the request is illegal. Please check your request, but if the problem persists, contact us.

在这里插入图片描述
在这里插入图片描述
这两个问题一直没办法解决!!

2022.02.20

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值