收藏
回答

用云函数将excel文件导入数据库,在数据量大时会出现数据丢失的现象?

遇到了好几个问题:

  1. 用云函数将excel文件导入数据库,数据量小的时候没有问题,在数据量大的时候,测试1000条的时候偶尔会出现数据丢失的现象。
  2. 小程序端在导入时会有一个弹窗提示正在解析,数据量小的时候在导入完成后可以正确地弹出“导入完成”,但数据量大的时候(1000条)就无法弹出,应该怎么解决?
  3. 怎么才能在导入前先清除集合的所有数据?想先清除所有数据之后再进行导入。
  4. 怎么才能将导入的excel的第一行作为所有导入数据库的数据的字段名?
  5. 另外想问一下有没有更好的excel数据导入到云数据库的方式

麻烦了!感谢!

//云函数
const cloud = require('wx-server-sdk')
cloud.init()
var xlsx = require('node-xlsx');
const db = cloud.database()

exports.main = async(event, context) => {
  
  //0,删除现有数据
  var aaa =await db.collection('tice').where({
    _id: db.command.exists(true)}).remove()
  //1,通过fileID下载云存储里的excel文件
  let {
    fileID
  } = event
  const res = await cloud.downloadFile({
    fileID: fileID,
  })
  const buffer = res.fileContent
  const tasks = [] 
  //2,解析excel文件里的数据
  var sheets = xlsx.parse(buffer);
  sheets.forEach(function(sheet{
    console.log(sheet['name']);
    for (var rowId in sheet['data']) {
      console.log(rowId);
      var row = sheet['data'][rowId];
      if (rowId > 0 && row) {
  //3,把解析到的数据存到excelList数据表里
   const promise = db.collection('tice')
     .add({
       data: {  
         "学籍号":row[0],
         "身份证号":row[1],
         "姓名":row[2],
            }
          })
        tasks.push(promise)
      }
    }
  });
  // 等待所有数据添加完成
  let result = await Promise.all(tasks).then(res => {
    return res
  }).catch(function(err{
    return err
  })
  return result
}


//小程序端
//onTap1是上传文件
onTap1function(){
    wx.showLoading({
      title'上传中',
    })
    let that = this;
    wx.chooseMessageFile({
      count1,
      type'all',
      success(res) {
        that.uploadFile(res.tempFiles[0]['path'])
      }
    })
  },

  uploadFilefunction(path){
    let ordernum = this.generate();
    let that = this;
    wx.cloud.uploadFile({
      cloudPath'tice/'+ordernum+'.xlsx',
      filePath: path,
    }).then(res => {
      that.setData({
        file: res.fileID
      },()=>{
        wx.hideLoading()
      })
      
    }).catch(error => {
    })
  },
  readFilefunction(fileID{
    wx.showLoading({
      title'解析中',
    })
    let that = this;
    wx.cloud.callFunction({
      name'scores',
      data: {
        fileID
      },
      successres => {
        wx.hideLoading()
        wx.showToast({
          title'导入成功',
          icon'success',
          duration2000
        })
        
      }
    })
  },
//onTap2是导入数据
  onTap2function(){
    let file =this.data.file;
    this.readFile(file)
  },
回答关注问题邀请回答
收藏

1 个回答

  • 今晚一定早睡
    今晚一定早睡
    2022-09-07

    楼主解决了吗?也遇到这样的问题了,怎么办。。。

    2022-09-07
    有用
    回复
登录 后发表内容