前言
前阶段用后端云(知晓云 bmob云之类,不需要后台开发接口只需要用后端云api操作云上的数据库)接到了个需求,就是导出excle文件。
导出excle在有后端开发的时候是很简单的一个接口,但是在使用后端云的时候就麻烦了,没有现成的api方法。
因此研究了下云函数,使用nodejs开发。
大概思路是:
- 前端发送需要导出excle的数组
- 云函数接口参数,并生成excle文件,上传到后端云,返回excle文件的url
- 在小程序通过下载文件api下载需要导出的excle文件
git地址
知晓云介绍
知晓云是个好用、顺手的小程序开发工具。它免去了小程序开发中服务器搭建、域名备案、数据接口实现等繁琐流程。让您专注于业务逻辑的实现,使用知晓云开发小程序,门槛更低,效率更高。
开发步骤
前期准备
-
nodejs
-
小程序
-
知晓云账号,绑定小程序 balabala的 注册后按照提示操作即可
-
安装命令行工具
npm install -g mincloud
-
进入工作目录(自己创建一个目录即可)
cd /Users/ifanr/demo
-
登录
mincloud login d2****************83 6a************************************22
请到 知晓云控制台 查看 client_id 和 client_secret;如果登录失败,请检查 client_id 和 client_secret 是否已经改变。
-
创建云函数
mincloud new exportExcle cd exportExcle
-
初始化 package,生成 package.json 文件
npm init
-
在第七步创建的目录exportExcle,新建 src 文件夹,用来存放源码(第13步的index.js)。 接下来会使用 webpack 将 src 里的代码,打包并保存到 exportExcle 目录下的 index.js
-
在exportExcle目录新建 webpack.config.js 文件(先放空,内容在12步)。
-
安装 webpack
npm install -D webpack webpack-cli
-
修改webpack.config.js和package.json script 配置
module.exports = { output: { path: __dirname, filename: 'index.js', library: 'exports.main', libraryTarget: 'assign', }, target: 'node', }
"scripts": { "build": "webpack --mode production", "deploy": "mincloud deploy xxxxx ../" },
-
创建文件src/index.js
var Excel = require('exceljs'); module.exports = function (event, callback) { //cell style var fills = { solid: {type: "pattern", pattern:"solid", fgColor:{argb:"FFFFAAAA"}} }; //create a workbook var workbook = new Excel.Workbook(); //add header var ws1 = workbook.addWorksheet("测试一"); ws1.addRow(["地址","地面"]); ws1.addRow(["总人口", "不可计数"]); ws1.addRow(["类型", "动物", "非动物"]); ws1.addRow(["统计日期", "1111-11-11 11:11:11"]); ws1.addRow(); //A6:E6 ws1.addRow(["你", "在", "说些", "神马", "呢?"]); ws1.getCell("A6").fill = fills.solid; ws1.getCell("B6").fill = fills.solid; ws1.getCell("C6").fill = fills.solid; ws1.getCell("D6").fill = fills.solid; ws1.getCell("E6").fill = fills.solid; //7 - 13(A7:A13) - 7 ws1.addRow(["什么跟神马", 10, 1, "凡人修仙传", 7]); ws1.addRow(["","","","一号遗迹", 2]); ws1.addRow(["","","","六号遗迹", 0]); ws1.addRow(["","","","古国一号", 0]); ws1.addRow(["","","","锻体期", 0]); ws1.addRow(["","","","合体期", 0]); ws1.addRow(["","","","没资质", 1]); ws1.mergeCells("A7:A13") ws1.mergeCells("B7:B13") ws1.mergeCells("C7:C13") //a6-e13 a b c d e //ws1.getCell('A7').alignment = { vertical: 'middle', horizontal: 'center' }; rowCenter(ws1, 6, 13); colWidth(ws1, [1,2,3,4,5], 20); var ws2 = workbook.addWorksheet("测试二"); var ws3 = workbook.addWorksheet("测试三"); //设置 start-end 行单元格水平垂直居中/添加边框 function rowCenter(arg_ws, arg_start, arg_end) { for(i = arg_start; i <= arg_end; i++) { arg_ws.findRow(i).alignment = { vertical: 'middle', horizontal: 'center' }; //循环 row 中的 cell,给每个 cell添加边框 arg_ws.findRow(i).eachCell(function (cell, index) { cell.border = { top: {style:'thin'}, left: {style:'thin'}, bottom: {style:'thin'}, right: {style:'thin'} }; }) } } //设置 start-end 列的宽度 function colWidth(arg_ws, arg_cols, arg_width) { for(i in arg_cols) { arg_ws.getColumn(arg_cols[i]).width = arg_width; } } workbook.xlsx.writeFile('/var/log/test2.xlsx') .then(function(){ //生成excle文件后,通过知晓云api上传到知晓云 let MyFile = new BaaS.File() MyFile.upload('/var/log/test2.xlsx').then(function(a, b, c) { console.log(a,b,c); console.log('生成 xlsx'); callback(null, "生成 xlsx") }) }); }
-
安装exceljs
npm install exceljs
-
打包
在项目根目录下执行npm run build,即可启动 webpack 进行代码打包。npm run build
-
部署
在项目根目录下运行:npm run deploy
-
回到上级目录,并部署到云函数
cd .. mincloud deploy exportExcle
-
测试云函数
https://cloud-minapp-24278.cloud.ifanrusercontent.com/1gt1FlTKm39G6dug.xlsx
-
使用小程序下载excle文件
wx.downloadFile({ url: 'https://cloud-minapp-24278.cloud.ifanrusercontent.com/1gt1FlTKm39G6dug.xlsx', // 仅为示例,并非真实的资源 success(res) { // 只要服务器有响应数据,就会把响应内容写入文件并进入 success 回调,业务需要自行判断是否下载到了想要的内容 if (res.statusCode === 200) { // res.tempFilePath } } })