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


Posted in Javascript onAugust 09, 2018

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
};

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

Javascript 相关文章推荐
JObj预览一个JS的框架
Mar 13 Javascript
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
Sep 08 Javascript
JavaScript实现多维数组的方法
Nov 20 Javascript
js每隔5分钟执行一次ajax请求的实现方法
Nov 27 Javascript
基于jQuery的JavaScript模版引擎JsRender使用指南
Dec 29 Javascript
jquery表单对象属性过滤选择器实例分析
May 18 Javascript
js省市县三级联动效果实例
Apr 15 Javascript
jquery实现图片平滑滚动详解
Mar 22 jQuery
小程序视频列表中视频的播放与停止的示例代码
Jul 20 Javascript
jquery实现下载图片功能
Jul 18 jQuery
微信小程序实现拖拽功能
Sep 26 Javascript
微信小程序实现星级评价
Nov 20 Javascript
使用layer弹窗和layui表单实现新增功能
Aug 09 #Javascript
vue-cli初始化项目中使用less的方法
Aug 09 #Javascript
video.js 实现视频只能后退不能快进的思路详解
Aug 09 #Javascript
JavaScript面向对象继承原理与实现方法分析
Aug 09 #Javascript
vue使用ajax获取后台数据进行显示的示例
Aug 09 #Javascript
vue中Axios的封装与API接口的管理详解
Aug 09 #Javascript
JavaScript引用类型RegExp基本用法详解
Aug 09 #Javascript
You might like
短波问题解答
2021/02/28 无线电
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
Laravel实现搜索的时候分页并携带参数
2019/10/15 PHP
JavaScrip常见的一些算法总结
2015/12/28 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
利用n工具轻松管理Node.js的版本
2017/04/21 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
对Vue beforeRouteEnter 的next执行时机详解
2018/08/25 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
es6 filter() 数组过滤方法总结
2019/04/03 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
2019/09/12 Javascript
微信小程序点击保存图片到本机功能
2019/12/13 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[01:04:22]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 IG vs EG
2018/04/01 DOTA
python3.3实现乘法表示例
2014/02/07 Python
Python中使用PIPE操作Linux管道
2015/02/04 Python
Python脚本处理空格的方法
2016/08/08 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
python批量创建指定名称的文件夹
2019/03/21 Python
Python Collatz序列实现过程解析
2019/10/12 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
python实现简单贪吃蛇游戏
2020/09/29 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
某公司面试题
2012/03/05 面试题
婚前协议书范本
2014/04/15 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
Python爬虫数据的分类及json数据使用小结
2021/03/29 Python
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL
python 安全地删除列表元素的方法
2022/03/16 Python