【笔记】在线答题小程序开发中,使用node-xlsx读取云存储的Excel文件,批量导入题库
发布于 4 年前 作者 duming 2473 次浏览 来自 分享

在微信答题小程序开发过程中,Excel是存储数据(题库)比较常见的格式,也是很多非技术人士常用于录题出题自定义题库的一个方式,使用非常频繁。这里使用开发者工具新建一个云函数比如node-excel,在package.json里添加latest最新版的node-xlsx,并右键云函数目录选择在终端中打开输入命令npm install安装依赖:

"dependencies": {
  "wx-server-sdk": "latest",
  "node-xlsx": "latest"
}

然后再在index.js里输入以下代码,这里有几点需要注意:

  • 使用云函数处理的Excel文件的来源是你的云存储,所以你需要事先将题库数据csv文件上传到云存储,在下面的代码里换成你的云存储csv地址;当然这个fileID也可以是你在答题小程序端上传Excel文件返回的云文件地址;
  • 云函数会先从云存储里下载csv文件,然后使用node-xlsx解析Exce文件,然后再将每行每行的写入数据库,这个Excel文件用的是前面介绍过的党建知识答题小程序题库数据,这里只是写入了部分字段;
  • 由于下面是读取数据的每一行,并将读取的数据循环写入数据库,也就是把数据库的add请求放在循环里面,一般情况下我们非常不推荐大家这么做,如果要这么做,主要要把云函数的超时时间设置为更长,比如20s~60s之间,保证云函数执行成功,不然会出现只成功了一部分的情况;
const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
const xlsx = require('node-xlsx');
const db = cloud.database()
exports.main = async (event, context) => {
  const fileID = 'cloud://avn-dcvsz.241v-nvc-vcxsa-1323215654/question.csv' //你需要将该csv的地址替换成你的云存储的csv地址
  const res = await cloud.downloadFile({
    fileID: fileID,
  })
  const buffer = await res.fileContent
  const sheets = await xlsx.parse(buffer);  //解析下载后的Excel Buffer文件,sheets是一个对象,而sheets['data']是数组,Excel有多少行数据,这个数组里就有多少个数组;
  const sheet = sheets[0].data  //取出第一张表里的数组,注意这里的sheet为数组
  const tasks = [] 
  for (let rowIndex in sheet) { //如果你的Excel第一行为字段名的话,从第2行开始
    let row = sheet[rowIndex];
    const task = await db.collection('question')
    .add({
      data: {
        type: row[0], 
        question: row[1], 
        options: row[2], 
        correct: row[3]
      }
    })
    tasks.push(task) //task是数据库add请求返回的值,包含数据添加之后的_id,以及是否添加成功
  }
  return tasks
}

使用xlsx.parse解析Excel文件得到的数据是一个数组,也就是上面所说的sheets,数组里的值都是Excel的每张表,而sheets[0].data 则是第一张表里面的数据,sheets[0].data仍然是一个数组,数组里的值是Excel表的每一行数据。 在解析返回的对象里,每个数组都是Excel的一行数据。

总结

我们除了可以在云开发控制台里导入导出csv文件外,还可以在云函数使用Nodejs的一些模块来处理Excel文档,进行业务知识或党建知识等题库数据格式的处理与批量导入,极大地提升了工作效率与质量。

回到顶部