我们在做小程序开发的过程中,可能会有这样的需求,就是把我们云数据库里的数据批量导出到excel表里。如果直接在小程序里写是实现不了的,所以我们要借助小程序的云开发功能了。这里需要用到云函数,云存储和云数据库。可以说通过这一个例子,把我们微信小程序云开发相关的知识都用到了。
老规矩,先看效果图
上图就是我们保存用户数据到excel生成的excel文件。
实现思路
- 1,创建云函数
- 2,在云函数里读取云数据库里的数据
- 3,安装node-xlsx类库(node类库)
- 4,把云数据库里读取到的数据存到excel里
- 5,把excel存到云存储里并返回对应的云文件地址
- 6,通过云文件地址下载excel文件
一,创建excel云函数
关于云函数的创建,我这里不多说了。如果你连云函数的创建都不知道,建议你去小程序云开发官方文档去看看。或者看下我录制的云开发入门的视频:https://edu.csdn.net/course/detail/9604
创建云函数时有两点需要注意的,给大家说下
- 1,一定要把app.js里的环境id换成你自己的
- 2,你的云函数目录要选择你对应的云开发环境(通常这里默认选中的)
不过你这里的云开发环境要和你app.js里的保持一致
二,读取云数据库里的数据
我们第一步创建好云函数以后,可以先在云函数里读取我们的云数据库里的数据。
- 1,先看下我们云数据库里的数据
- 2,编写云函数,读取云数据库里的数据(一定要记得部署云函数)
- 3,成功读取到数据
把读取user数据表的完整代码给大家贴出来。
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init({
env: "test-vsbkm"
})
// 云函数入口函数
exports.main = async(event, context) => {
return await cloud.database().collection('users').get();
}
三,安装生成excel文件的类库 node-xlsx
通过上面第二步可以看到我们已经成功的拿到需要保存到excel的源数据,我们接下来要做的就是把数据保存到excel
- 1,安装node-xlsx类库
这一步需要我们事先安装node,因为我们要用到npm命令,通过命令行
npm install node-xlsx
可以看出我们安装完成以后,多了一个package-lock.json的文件
四,编写把数据保存到excel的代码,
下图是我们的核心代码
这里的数据是我们查询的users表的数据,然后通过下面代码遍历数组,然后存入excel。这里需要注意我们的id,name,weixin要和users表里的对应。
for (let key in userdata) {
let arr = [];
arr.push(userdata[key].id);
arr.push(userdata[key].name);
arr.push(userdata[key].weixin);
alldata.push(arr)
}
还有下面这段代码,是把excel保存到云存储用的
//4,把excel文件保存到云存储里
return await cloud.uploadFile({
cloudPath: dataCVS,
fileContent: buffer, //excel二进制文件
})
下面把完整的excel里的index.js代码贴给大家,记得把云开发环境id换成你自己的。
const cloud = require('wx-server-sdk')
//这里最好也初始化一下你的云开发环境
cloud.init({
env: "test-vsbkm"
})
//操作excel用的类库
const xlsx = require('node-xlsx');
// 云函数入口函数
exports.main = async(event, context) => {
try {
let {userdata} = event
//1,定义excel表格名
let dataCVS = 'test.xlsx'
//2,定义存储数据的
let alldata = [];
let row = ['id', '姓名', '微信号']; //表属性
alldata.push(row);
for (let key in userdata) {
let arr = [];
arr.push(userdata[key].id);
arr.push(userdata[key].name);
arr.push(userdata[key].weixin);
alldata.push(arr)
}
//3,把数据保存到excel里
var buffer = await xlsx.build([{
name: "mySheetName",
data: alldata
}]);
//4,把excel文件保存到云存储里
return await cloud.uploadFile({
cloudPath: dataCVS,
fileContent: buffer, //excel二进制文件
})
} catch (e) {
console.error(e)
return e
}
}
五,把excel存到云存储里并返回对应的云文件地址
我们上面已经成功的把数据存到excel里,并把excel文件存到云存储里。可以看下效果。
我们这个时候,就可以通过上图的下载地址下载excel文件了。
我们打开下载的excel
其实到这里就差不多实现了基本的把数据保存到excel里的功能了,但是我们要下载excel,总不能每次都去云开发后台吧。所以我们接下来要动态的获取这个下载地址。
六,获取云文件地址下载excel文件
通过上图我们可以看出,我们获取下载链接需要用到一个fileID,而这个fileID在我们保存excel到云存储时,有返回,如下图。我们把fileID传给我们获取下载链接的方法即可。
- 1,我们获取到了下载链接,接下来就要把下载链接显示到页面
- 2,代码显示到页面以后,我们就要复制这个链接,方便用户粘贴到浏览器或者微信去下载
下面把我这个页面的完整代码贴给大家
Page({
onLoad: function(options) {
let that = this;
//读取users表数据
wx.cloud.callFunction({
name: "getUsers",
success(res) {
console.log("读取成功", res.result.data)
that.savaExcel(res.result.data)
},
fail(res) {
console.log("读取失败", res)
}
})
},
//把数据保存到excel里,并把excel保存到云存储
savaExcel(userdata) {
let that = this
wx.cloud.callFunction({
name: "excel",
data: {
userdata: userdata
},
success(res) {
console.log("保存成功", res)
that.getFileUrl(res.result.fileID)
},
fail(res) {
console.log("保存失败", res)
}
})
},
//获取云存储文件下载地址,这个地址有效期一天
getFileUrl(fileID) {
let that = this;
wx.cloud.getTempFileURL({
fileList: [fileID],
success: res => {
// get temp file URL
console.log("文件下载链接", res.fileList[0].tempFileURL)
that.setData({
fileUrl: res.fileList[0].tempFileURL
})
},
fail: err => {
// handle error
}
})
},
//复制excel文件下载链接
copyFileUrl() {
let that=this
wx.setClipboardData({
data: that.data.fileUrl,
success(res) {
wx.getClipboardData({
success(res) {
console.log("复制成功",res.data) // data
}
})
}
})
}
})
给大家说下上面代码的步骤。
- 1,下通过getUsers云函数去云数据库获取数据
- 2,把获取到的数据通过excel云函数把数据保存到excel,然后把excel保存的云存储。
- 3,获取云存储里的文件下载链接
- 4,复制下载链接,到浏览器里下载excel文件。
到这里我们就完整的实现了把数据保存到excel的功能了。
大佬,导出一次后,有缓存吗这是,我第二遍导出不一样的内容,结果打开一看还是上一次的内容,我debug看得,内容不一样,我手动清除了缓存,再导出才显示这一边的内容
你好,想请问一下,我下载了node-xlsx为什么运行时候还会报Cannot find module 'node-xlsx'; at cloud.callFunction api这个错误,我云函数下载后有再次上传部署
可以用云开发开发一个管理系统,直接导出excel 就好了
微信开发者工具中,导出600多条数据时,可以正常导出,但是用真机调试时,就到处失败,这是什么原因呢
今天开始在看老师在b站的cms内容管理课程,这个课程建议目前看吗,视频时间挺早的,求建议
谢谢石头老师分享。
以下代码我根据自己的项目做了数据库字段属性的调整,为何执行后下载的集合还是石头老师的原程序的集合,且下载的集合只有表头而没有数据?疑惑,其他的显示成功,很奇怪。恳请高手答疑解惑。
exports.main = async(event, context) => {
try {
let {userdata} = event
//1,定义excel表格名
let dataCVS = 'test.xlsx'
//2,定义存储数据的
let alldata = [];
let row = ['Date','SlotTime', 'cbmNo','orderNo','selectedwhs','soNo','submitDate','truckPlateNoToBe']; //表属性
alldata.push(row);
for (let key in userdata) {
let arr = [];
arr.push(userdata[key].Date);
arr.push(userdata[key].SlotTime);
arr.push(userdata[key].cbmNo);
arr.push(userdata[key].orderNo);
arr.push(userdata[key].selectedwhs);
arr.push(userdata[key].soNo);
arr.push(userdata[key].submitDate);
arr.push(userdata[key].truckPlateNoToBe);
alldata.push(arr)
}
//3,把数据保存到excel里
var buffer = await xlsx.build([{
name: "mySheetName",
data: alldata
}]);
//4,把excel文件保存到云存储里
return await cloud.uploadFile({
cloudPath: dataCVS,
fileContent: buffer, //excel二进制文件
})
问一下,npm install node-xlsx的时候一直卡着不动咋回事啊?win7系统,谢谢
生成的文件怎么自动销毁·
https://developers.weixin.qq.com/community/develop/doc/000ca2805fccf061dfa9c5eb656800?fromCreate=0
小石头我遇到了数据量大执行错误,请问具体是什么问题能帮我看下吗?如上帖子