(代码在最后)
首先说一下结果,网上到处都在用的那个博主编程小石头的代码是真的可以用的,之所以大家用了之后会出现千奇百怪的错误是因为可能根本就不会使用云函数。
奇葩1:云函数中的console一直出不来,后来经过师兄的点拨才知道云函数的console根本就不是在调试器械中打印出来的,而是在他的日志中打印出来的。
奇葩2:你之所以怀疑你的云函数是不是根本就没运行是因为你只是创建了云函数,而你却遗漏了一个重要的一步!!!!!!!!!!
!!!!!!!!!!!!!!每次修改云函数都要鼠标右键上传并部署!!!!!!!!!!!
就是这个丑奇葩,害得我自闭了几天!!今天终于茅塞顿开。
好想吐槽,云函数也太不高级了吧,每次修改都还要上传一番。啊啊啊啊啊啊啊但是自己也很菜,可能别人就觉得是个很正常的事情。
bug1:我要上传的excel文件中共有473条数据,然后报错说我超过环境配额。唉,总之就是不能让你一直白嫖。后来我改为了只上传三条数据就成功了。
总之就是,如果你没长传成功,要么就是没有没有更次代码后重新还部署一下云函数,要么就是你的数据太多了。不过,编程小石头的代码是真的能用的。
在这里把我成功的代码也贴出来,供大家参考。
1.文件结构
2.upload.wxml
<button bindtap="chooseExcel">导入课表</button>
3.upload.js
const db = wx.cloud.database();
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
},
// 1.选择excle表格
chooseExcel(){
console.log("点击导入excel了")
let that=this
wx.chooseMessageFile({
count: 1,
type:'file',
success(res){
let path=res.tempFiles[0].path;
console.log("选择excel成功",path)
that.uploadExcel(path);
}
})
},
// 2.上传excel
uploadExcel(path){
let that=this
wx.cloud.uploadFile({
cloudPath: new Date().getTime()+ 'whjUpload.xlsx',
filePath:path,
success:res=>{
//上传成功返回res,包括fileID
console.log("上传成功:",res);
console.log(res.fileID)
that.analysis(res.fileID);
},
fail:err=>{
console.log("上传失败:",err);
}
})
},
// 3.解析excel并存储到数据库
analysis(fileID){
console.log('成功得到fileID'+fileID)
//调用云函数
wx.cloud.callFunction({
name:"excel",
data:{
fileID : fileID
},
success(res){
console.log('测试成功',res)
},
fail(res){
console.log('测试失败',res)
}
})
}
})
3.excel云函数中的index.js,
const cloud = require('wx-server-sdk')
cloud.init({
env:'whj-2zta2'
})
var xlsx = require('node-xlsx');
const db = cloud.database()
exports.main = async(event, context) => {
console.log(context);
let {
fileID
} = event
//1,通过fileID下载云存储里的excel文件
const res = await cloud.downloadFile({
fileID: fileID,
})
const buffer = res.fileContent
console.log(buffer)
const tasks = [] //用来存储所有的添加数据操作
//2,解析excel文件里的数据
var sheets = xlsx.parse(buffer); //获取到所有sheets
sheets.forEach(function(sheet) {
// console.log(sheet['name']);
for (var rowId in sheet['data']) {
// console.log(rowId);
var row = sheet['data'][rowId]; //第几行数据
if (rowId > 0 && row) { //第一行是表格标题,所有我们要从第2行开始读
//3,把解析到的数据存到你自己的数据表里,我的是test,你的随意。
// 然后下面的data是key:value的形式,也就是你要往数据库插进去的东西
const promise = db.collection('test')
.add({
data: {
course_id: row[0], //课程编码
cousre_name: row[1], //课程名称
class: row[2], //教学班
total_class_hours: row[3], //总学时
credit:row[4],//学分
course_character: row[5], //课程性质
cousre_major: row[6], //上课专业
teacher_name: row[7], //任课教师
teacher_id: row[8], //教师工号
tasks_week_orgin:row[9],//任务计划周次
tasks_week_personal: row[10], //排课周次
people: row[11], //选课人数
when_where: row[12], //上课时间地点
schools: row[13], //开课学院
}
})
tasks.push(promise)
}
}
});
// 等待所有数据添加完成
let result = await Promise.all(tasks).then(res => {
return res
}).catch(function(err) {
return err
})
return result
}
最后,我再由衷的表达一下我对编程小石头这种原创代码人的欣赏!因为我不管是java中使用poi导入excel还是小程序中使用云开发导入,我自己都是不会写的,都是靠的百度来的代码,但是总有人就是这么牛逼,总有人就是能够自己写出来,所以我真的很佩服也很羡慕他们,希望自己有一天也能这么牛逼!!!!!!!!!!!!!!!!
thats allllllllllllllllllllllllll
over