【程序之坑】小程序云开发导出数据到excel表 您所在的位置:网站首页 小程序电子书开发 【程序之坑】小程序云开发导出数据到excel表

【程序之坑】小程序云开发导出数据到excel表

#【程序之坑】小程序云开发导出数据到excel表| 来源: 网络整理| 查看: 265

本文解决了小程序云开发导出数据到excel的bug,并给出了分析的过程,同时简化了程序为一个云函数,一个本地函数,逻辑更简单文章结尾给出了完整源代码

小程序云开发为没有服务器的小程序开发者提供了便利性。其中的数据库提供导入和导出数据的功能。然而导出功能只有json和csv两种格式。而且选择csv格式的话必须要手动改输入导出字段。想象一下如果数据库里面有几十个字段的用户,肯定是要口吐莲花的。所以我的小程序需要数据库导出功能时,不得不试着自己撸一个导出excel的功能。

好在已经有前人栽树,节省了不少头发。原指导文章如下,作者编程小石头。感谢编程的小石头原创和分享

https://developers.weixin.qq.com/community/develop/article/doc/00026877070bd0b4f31940a5551c13

编程界有个迷思:网上找到的代码在自己电脑上一般都跑不通。

不出意外,果不其然,复制粘贴调用,并没有出现想要的结果。不调bug的程序员只是打字员。所以咱们来看看到底问题出在哪了。

数据读取,导出excel并存储到云存储

首先看看云数据库的值是不是获取了。

let {userdata} = event console.log(userdata)

不出意外没有数值。因为文章中是用了两个云函数(为什么呢?),而我自己的是用了一个云函数

修改为

let userdata= await cloud.database().collection('你的数据库').get(); console.log(userdata)

userdata正常输出了!bingo!然而打开excel显示为空。纳尼?我们再往下看,程序要对获取的数据进行遍历,然后推送给excel

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) }

在这段程序之后用

console.log(alldata)

输出为空。看来问题出在了数据遍历。

console.log(userdata[1])

输出

undefined

仔细看下console.log(userdata) 的结果,里面还有一层data的嘛。

修改代码为

let getdata = await cloud.database().collection('info').get(); let userdata = getdata.data;

程序完美执行,数据成功导入到了excel。

excel下载

完成数据导出到excel并且存储到云存储后,咱们需要给前端用户一个下载界面。

原文中的逻辑略显复杂,是需要

4,把云数据库里读取到的数据存到excel里5,把excel存到云存储里并返回对应的云文件地址6,通过云文件地址下载excel文件

实际上不是很有必要。我的办法是

云函数读取数据存储到excel,存到云存储一个按钮绑定本地函数来调用云函数,并且把下载地址反馈到页面上完整源代码

云函数的代码:云函数名称export

const cloud = require('wx-server-sdk') //这里最好也初始化一下你的云开发环境 cloud.init({ env: "test-vsbkm" }) //操作excel用的类库 const xlsx = require('node-xlsx'); // 云函数入口函数 exports.main = async(event, context) => { try { let getdata = await cloud.database().collection('info').get(); let userdata = getdata.data; //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 } }

本地函数程序如下:

wxml:

导出数据 复制地址 {{fileUrl}}

js

Page({ data: { fileUrl: '' }, buttonClick() { let that = this; //读取users表数据 wx.cloud.callFunction({ name: "export", success(res) { console.log("读取成功", res.result.fileID) that.getFileUrl(res.result.fileID); // that.copyFileUrl() }, fail(res) { console.log("读取失败", res) } }) // 刷新当前页面 that.onLoad(); console.log("页面重载") }, //获取云存储文件下载地址,这个地址有效期一天 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 } }) } }) } })

学小程序开发还是最好买书系统的学一下。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有