欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

koa上传excel文件并解析的实现方法

程序员文章站 2022-06-05 21:34:02
1.中间键使用 koa-body npm install koa-body --save const koabody = require('koa-...

1.中间键使用 koa-body

npm install koa-body --save
const koabody = require('koa-body');

app.use(koabody({
 multipart: true,
 formidable: {
  maxfilesize: 200 * 1024 * 1024 // 设置上传文件大小最大限制,默认2m
 }
}));

2.书写路由,croller书写方法

uploaddata.js

const errorresult = require('../utils/errorresult.js');
const uploadexcelsrv = require('../service/uploadexcelsrv');

const savedata = async function (ctx, next) {

 const getres = await uploadexcelsrv.getexcelobjs(ctx);
 if (getres.status) {
  if (getres.datas.length > 1) {
   errorresult.errorres(ctx, '暂时不支持多个sheet存在');
  } else { //得到的是数组
   const objs = getres.datas[0];
   ctx.body = {
    status: true,
    msg: '上传数据成功'
   };
  }
 } else {
  errorresult.errorres(ctx, getres.msg);
 }
 await next();
};
module.exports = {
 savedata
};

3.处理excel存储,解析,处理excel用的库是 xlsx

npm install xlsx --save

uploadexcelsrv.js

//接收上传的excel文件,保存解析返回objects
const xlsx = require('xlsx');
const fs = require('fs');
const path = require('path');
const downpath = path.resolve(__dirname, '../../fileupload');

async function getexcelobjs (ctx) {
 const file = ctx.request.files.file; // 获取上传文件
 const reader = fs.createreadstream(file.path); // 创建可读流
 const ext = file.name.split('.').pop(); // 获取上传文件扩展名
 const filepath = `${downpath}/${math.random().tostring()}.${ext}`;

 const upstream = fs.createwritestream(filepath); // 创建可写流
 const getres = await getfile(reader, upstream); //等待数据存储完成

 const datas = []; //可能存在多个sheet的情况
 if (!getres) { //没有问题
  const workbook = xlsx.readfile(filepath);
  const sheetnames = workbook.sheetnames; // 返回 ['sheet1', ...]
  for (const sheetname of sheetnames) {
   const worksheet = workbook.sheets[sheetname];
   const data = xlsx.utils.sheet_to_json(worksheet);
   datas.push(data);
  }
  return {
   status: true,
   datas
  };
 } else {
  return {
   status: false,
   msg: '上传文件错误'
  };
 }
}

function getfile (reader, upstream) {
 return new promise(function (result) {
  let stream = reader.pipe(upstream); // 可读流通过管道写入可写流
  stream.on('finish', function (err) {
   result(err);
  });
 });
}
module.exports = {
 getexcelobjs
};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。