评论

云函数利用npm exceljs导出excel 1000个SKU带高清图片

云函数利用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
收藏
评论

3 个评论

  • 萧萧
    萧萧
    2022-03-24

    来自踩了天坑的小白分享

    2022-03-24
    赞同 2
    回复
  • 萧萧
    萧萧
    2022-03-26

    把这段代码放到循环里

        //设置所有导出的数据文字居中
        worksheet.getRow(rowIndex-1+3).alignment = {
          vertical: 'middle',
          horizontal: 'center'
        };
    


    2022-03-26
    赞同
    回复
  • 林三
    林三
    2022-03-24

    您已经是大佬了

    2022-03-24
    赞同
    回复
登录 后发表内容