vk-unicloud实现上传excel并解析为json格式
uniclouduniappvk-unicloud上传excel
自从开始使用uniapp生态一把梭之后,我的后端就一直是使用vk开发的vk-unicloud框架进行云函数和后台管理的二次开发,其后台基于elementUI、非常适合做各种管理后台。
前几年在做某个教育项目的时候,遇到了需要批量上传题库的需求,大致就是把上传的excel解析为json后再入库,但vk没有给出导入的轮子,我在使用一个插件之后实现了这个需求,如果你也有类似需求,可以尝试一下,整体还是非常简单的。
首先你需要导入这个公共模块:EXCEL转JSON函数
然后,在router云函数上右击,选择管理公共模块,然后在ml-excel-to-json上打钩,确定后记得上传一下公共模块。
最后,在你需要导入excel的页面增加如下代码:
javascript
// 这是把array buffer转成base64
uni.request({
url: url,
method: 'GET',
responseType: 'arraybuffer',
success: res => {
let base64 = uni.arrayBufferToBase64(res.data);
callback(base64);
}
});
javascript
importExcel() {
uni.chooseFile({
count: 1,
extension: ['.xls', '.xlsx'],
success: res => {
// 这就是上边那个方法
vk.myfn.urlTobase64(res.tempFilePaths[0], base64 => {
vk.callFunction({
url: '.../importExcel',
needAlert: false,
data: {
rows: that.importExcelRows - 1, // 你需要写个框让用户输入表格末尾的行号
base64: base64
},
success: (data) => {
this.refresh();
}
});
});
}
});
},
javascript
// 在这个页面对应的云函数中引用公共模块
// 也就是上一段代码里的importExcel
'use strict';
const {
excelTojson
} = require('ml-excel-to-json'); // 引用公共模块的方法
module.exports = {
// 正常部分略过
// 自定义的表头
let sheetList = [{
index: 0,
keys: ['key1','key2','...'], // 按顺序对应表格每一列
keysIndex: 0,
startIndex: 1,
endIndex: data.rows ? data.rows : 9
}]
let json = await excelTojson(data.base64, sheetList);
// 正常部分略过
最终实现的效果就是,用户点击上传,先弹出输入框让用户输入末尾行号(不输入的话,如果表格里有一些空白,可能会解析错误)
输入后自动调起文件上传,然后解析为base64后交给云函数,
云函数通过公共模块把excel解析为json
你自己写json入库这部分内容的逻辑即可。