- 云函数利用npm exceljs导出excel 1000个SKU带高清图片
[图片] 想要导出大量数据就得从腾讯云登录你得小程序云开发 CloudBase可以修改900秒得超时时间,也就是可以执行15分钟;这次导出1000个SKU用了10分钟; [图片] [图片] 执行了10分钟,导出了24m的文件 [图片] [图片] 不多说,熬了俩个通宵,以及各位大佬的指点总结出来的 直接上源码 // 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init({ // API 调用都保持和云函数当前所在环境一致 env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database() //exceljs 安装:npm i exceljs const ExcelJS = require('exceljs'); //引入superagent 安装 :npm i superagent const superagent = require('superagent'); // 云函数入口函数 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() //查询要生成表格的数据 集合名记得改 const dataList = await db.collection("user").where({ jsxj:true //自己改改 //突破100条数据限制 }).limit(1000).get() //获取查询到的数据 const data = dataList.data //新建一个工作簿 const workbook = new ExcelJS.Workbook(); //创建一个工作表 const worksheet = workbook.addWorksheet('Sheet 1'); //设置第一行的行高 worksheet.properties.defaultRowHeight = 152.1; //设置第一行的列宽 worksheet.properties.defaultColWidth = 24.95; //设置第一行的文字垂直居中 worksheet.getRow(1).alignment = { vertical: 'middle', horizontal: 'center' }; //设置第一行的文字大小加粗 worksheet.getRow(1).font = {size: 16, bold: true}; //创建表头信息 worksheet.columns = [{header:'图片',key:'id'},{header:'产品标题',key:'url'}]; //循环往工作表里加数据 for (let rowIndex in data) { const rowcontent = [] //获取图片链接 var urls = encodeURI(data[rowIndex].cpimg[0]+'/sf200') //获取urls的图片链接转化成Base64 const img2Base64 = await new Promise(async function (resolve, reject) { const url = urls; await superagent.get(url).buffer(true).parse((res) => { let buffer = []; res.on('data', (chunk) => { buffer.push(chunk); }); res.on('end', () => { const data = Buffer.concat(buffer); const base64Img = data.toString('base64'); resolve('data:image/png;base64,'+base64Img) } ); }); }) //把img2Base64的数据生成imageId2,并添加图片到工作表 const imageId2 = workbook.addImage({ base64: img2Base64, extension: 'png', }); //获取imageId2,修改上面工作表里的图片大小位置 worksheet.addImage(imageId2, { tl: { col: 0, row: rowIndex-1+2}, ext: { width:200, height:200 }, editAs: 'undefined' }); //因为第一行是图片,所以这里传一个第一行的空值 rowcontent.push("") rowcontent.push(data[rowIndex].cpname) //更新表格 worksheet.addRow(rowcontent); } //生成表格 const buffer = await workbook.xlsx.writeBuffer(); //上传到云存储 return await cloud.uploadFile({ cloudPath: 'nhb/' + Date.now() + '.xlsx', fileContent: buffer, }) }
2022-03-24 - 优秀开源小程序推荐系列6
优秀开源小程序推荐锡类6 ~ [图片]~ ~' [图片]~ ~ [图片] ~ [图片] ~ [图片] ~ 仓库地址 https://github.com/jasongao97/natianyue README.md 哪天约 - 微信小程序 在这里,快速简单的发现群里的共同空闲时间,解决哪天约的千古难题,让群约更简单。 intro 哪天约是一个帮助群约计划时间的微信小程序,用户可以指定范围建立群约并分享,参与者各自选择自己合适的时间,最终选出最好的时间点。本小程序首个版本上线于 2017 年,经过 3 年时间迭代更新,已积累 8 万用户。2020 年 8 月,团队围绕「小程序云开发挑战赛」进行重大功能迭代,其中后端完全迁移至小程序云开发,具体项目特性说明如下。 特性 原生微信小程序开发 + 云开发 transition 与 animation 实现自然的 加载/警告/转场 动画 云开发数据库实现报名结果实时推送 云存储持久化用户头像、小程序码、Excel 表格 微信开放接口实现文字安全检测、订阅消息推送 仓库结构 /couldfunctions 云函数 (13个) archivePlan - 归档群约 closePlan - 结束报名 createPlan - 新建群约 editParticipation - 编辑报名 editPlan - 编辑群约 editPlanLock - 编辑锁定选项 getPlanCode - 获取群约小程序码 getPlanXLSX - 获取群约导出 Excel 表格 login - 登录 register - 注册 reopenPlan - 重新开启报名 subscribePlan - 订阅群约通知 updateUser - 更新用户信息 /miniprogram 小程序 /components 组件 avatar - 头像 btn - 按钮 calendar-picker - 日期选择器 container - 容器 drag-list - 拖拽列表 footer - 页脚 half-modal - 半屏模态弹框 navigation-bar - 导航栏 plan-list - 群约列表 (支持滑动删除) section - 段落 /icons 图标 /images 图片/插画 /pages 页面 createPlan - 创建群约 editParticipation - 编辑报名 editPlan - 编辑群约 index - 首页 plan - 群约详情 qrShare - 群约分享码 setting - 设置 setting/about - 关于 setting/deletedPlan - 已删除的群约 setting/segmentSetting - 选项模板管理 setting/segmentSetting/publicSetting - 公共模板库 /style 公共样式 /util 工具函数 date - 日期处理 option - 选项处理 tools.wxs - wxs 工具模块 数据库集合设计 users - 用户 _id: string _openid: string - OPENID _registeredAt: date - 注册时间 info: object - 用户信息 savedPlans: array - 保存的群约 deletedPlans: array - 删除的群约 segmentSettings: array - 时间选项模板 plans - 群约 _id: string _createAt: date - 创建时间 _creator: string - 发起人 _updatedAt: date - 更新时间 code: string - 分享码ID option: object - 选项配置 participation: array - 参与者ID及报名信息 remark: string - 备注 subscribers: array - 订阅者ID title: string - 标题 segment_settings - 公共时间选项模板 _id: string draft: boolean - 是否为草稿 name: string - 标题 segments: array - 时间选项 部署 克隆或下载本仓库并导入微信开发者工具 注册小程序并修改 project.config.json 中的 appid 使用云开发控制台建立 3 个数据库集合: users, plans, segment_settings(数据权限均为: 所有用户可读, 仅创建者可读写) 上传并部署 /cloudfunctions 中全部 13 个 云函数 预览/上传 后即可使用 (可选)打开订阅消息功能 进入微信公众平台小程序管理,选择功能-订阅消息-添加模板(标题: 报名结果提醒, 关键词: 活动名称、报名结果、活动人数) 修改 /cloudfunctions/closePlan/config.js 和 /miniprogram/config.js 中的 templateId 为上一步中建立的模板ID (可选)编辑 /miniprogram/config.js 中的 env 修改运行环境 Languages JavaScript 100.0% © 2021 GitHub, Inc. Terms Priva
2021-11-16 - 小程序导出数据到excel表,借助云开发后台实现excel数据的保存
我们在做小程序开发的过程中,可能会有这样的需求,就是把我们云数据库里的数据批量导出到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的功能了。 文章有点长,知识点有点多,但是大家把这个搞会以后,就可以完整的学习小程序云开发的:云函数,云数据库,云存储了。可以说这是一个综合的案例。 有什么不懂的地方,或者有疑问的地方,请在文章底部留言,我看到都会及时解答的。后面我还会出一系列关于云开发的文章,敬请关注。
2019-09-07 - 小程序搜索功能,云开发搜索,小程序云开发模糊搜索,同时搜索多个字段
今天来给大家讲讲小程序的搜索功能。我这里后台数据库用的是小程序云开发的云数据库。所以我们搜索的时候就要借助云开发来实现。 一,需求 比如我这里有如下的一些数据 [图片] 我们想实现如下搜索需求 1,搜索标题(title)包含‘小石头’的数据 2,搜索标题(title)或者描述(desc)包含‘小石头’的数据 3,搜索标题(title)描述(desc)都包含‘小石头’的数据 我们知道数据库查询的时候有个where语句,但是where语句是查询某个字段全部包含你输入的内容时才可以,所以单纯用where语句来做搜索的话,结果太单一。所以我们今天就来学习下模糊搜索功能的实现。我们以上面三个需求为例,来一个个讲解。 二,实现原理 我们做模糊搜索的时候,其实就是查询某个字段里是否包含我们的搜索词。而模糊搜索需要借助RegExp,来看看RegExp是什么。 [图片] 官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/Database.RegExp.html 再来看看官方示例 [图片] 可能看官方示例会有点糊涂,那么我们接下来就结合具体代码来给大家做下讲解。 三,模糊搜索的代码实现 3-1,模糊搜索单个字段 需求:搜索标题(title)包含‘小石头’的数据 代码如下 [图片] 查询结果如下: [图片] 可以看到我们成功的查询到了标题里包含‘小石头的数据’ 3-2,模糊搜索多个字段(满足一个即可) 需求:搜索标题(title)或者描述(desc)包含‘小石头’的数据 由于我们要查询多个字段,所以我们这里用到了command高级操作符里的or [图片] 代码如下: [图片] 查询结果: [图片] 我们来分析下这两条数据 1,标题和描述都包含‘小石头’,符合 2,虽然标题里没有‘小石头’,但是描述里有,所以也符合。 3,title和desc里都没有‘小石头’,所以不符合。 [图片] 3-3,模糊搜索多个字段(要同时满足) 需求:搜索标题(title)描述(desc)都包含‘小石头’的数据 由于我们要查询多个字段,所以我们这里用到了command高级操作符里的and [图片] 代码如下: [图片] 查询结果: [图片] 我们来分析下这两条数据 1,标题和描述都包含‘小石头’,符合 2,虽然desc里没有‘小石头’,但是title里没有,所以也不符合。 3,title和desc里都没有‘小石头’,所以也不符合。 [图片] 四,源码 为例方便大家使用,我把完整的代码贴到这里,后面大家使用时,直接复制这里的代码,略微改造下就可以了。 [代码] //我这里简单起见就把搜索词写死,正常应该用户输入的 let searchKey = '小石头' let db = wx.cloud.database() let _ = db.command db.collection('news') .where(_.or([ {//标题 title: db.RegExp({ //使用正则查询,实现对搜索的模糊查询 regexp: searchKey, options: 'i', //大小写不区分 }), }, {//描述 desc: db.RegExp({ regexp: searchKey, options: 'i', }), } ])).get() .then(res => { console.log('查询成功', res) }) .catch(res => { console.log('查询失败', res) }) [代码] 到这里就讲完了,我后面会专门在云开发入门的课程里作为实战案例录制视频给到大家的: 《小程序云开发入门视频》
2021-02-08 - 【已解决】云函数内request第三方access_token并存入集合中咋整?
[图片] //这个是返回的字符串 小程序云开发云的函数中用request-promise请求了一个access_token,这个access_token的时效性的俩天,所以我想让他请求完后直接更新到集合中去,前端只需要读取这个集合里的access_token就可以了,让后用定时触发器每一天更新一次,求大佬显神通 const cloud = require('wx-server-sdk') cloud.init() var rp = require('request-promise'); var options = { method: 'POST', uri: 'https://www.bigiot.net/oauth/token?client_id=901&client_secret=35e0e688c1&username=12841&password=11b945045d&grant_type=password',//id、password等数据不加引号 body: { }, json: true }; // 云函数入口函数 exports.main = async (event, context) => { return rp(options) .then(function (res) { console.log(res) return res }) .catch(function (err) { console.log(err) }); } //下面的是返回到前端的数据
2020-06-02