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