小程序云开发 云数据库获取集合写入excel进行邮件发送
给别人(友好的兄弟部门)写了一个投票小程序,全程使用云开发平台,也就是说不需要自己再挂服务器了,投票数据需要最后进行统计,之前是使用csv进行导出,发送邮件到指定邮箱,由相关人员对
csv
文件进行处理(倒入excel
,另存为)进行数据统计,但是实际操作发现太麻烦了,于是乎想到用云开发的云储存进行excel表的写入,让统计数据的同学下载这个文件就行了,说干就干
坑
这个坑是我自己一步一个脚印踩出来的,记下来便于以后使用
-
云数据库一次服务器端查询最多支持一百条数据,如果数据超过
100条(如本项目)
得进行多次查询 -
云储存的文件名不能有特殊字符,否则无法下载,如时间日期
2019-11-12 12:30.xls
有短横杠有空格,腾讯会拒绝访问 -
云储存得到的链接是
cloud://xxx
,需要在服务端或小程序端解析成真正地址才能在外部下载。
坑的解析
坑1
超过100条数据的查询,看似很复杂,要先读有多少数据,判断需要读多少次,然后读取这个次数,加入一个数组,最后全部输出。
但其实官方给了个demo,改就行了,反正我不会写hhh,我会用就行。
因为有默认 limit
100 条的限制,因此很可能一个请求无法取出所有数据,需要分批次取:
这里我就给自己改的了,如果数据很少,可以用下面注释的方法
//取集合所有数据,突破一次100条的限制
const countResult = await db.collection('eventVote').count()
const total = countResult.total
// 计算需分几次取
const batchTimes = Math.ceil(total / 100)
// 承载所有读操作的 promise 的数组
const tasks = []
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection('eventVote').skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
tasks.push(promise)
}
// 等待所有
var myData = (await Promise.all(tasks)).reduce((acc, cur) => {
return {
data: acc.data.concat(cur.data),
errMsg: acc.errMsg,
}
})
// 一次只能取100条数据,对于更多的数据集合需要用上面的方法
// try {
// var myData = await db
// .collection('eventVote')
// .orderBy('datetime', 'desc')
// .orderBy('event_id', 'desc')
// .orderBy('school', 'desc')
// .orderBy('title', 'desc')
// .get()
// //console.log(JSON.stringify(myData))
// } catch (err) {
// console.error(err)
// }
坑2
坑2 比较简单解决,我这里文件命名是按照时间的顺序来命名的
把2019-11-24 10:30:30 这种去掉输出符号和空格就行,最后变成
let d = new Date().Format("yyyyMMddhhmmss")
//1,定义excel表格名
let dataCVS = 'excel/result' + d + '.xlsx'
这样的话输出的文件就是没有空格和特殊符号的了,可以正常下载了
坑3
传入文件的cloud链接即可获得真实下载的地址,贴入发送的邮件即可。
//获取真实的下载地址