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 相关文章推荐
用javascript getComputedStyle获取和设置style的原理
Oct 10 Javascript
javascript实现的网页局布刷新效果
Dec 01 Javascript
javascript 一段左右两边随屏滚动的代码
Jun 18 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
May 02 Javascript
JavaScript怎么判断图片是否加载完成以便获取其尺寸
May 08 Javascript
使用AngularJS对路由进行安全性处理的方法
Jun 18 Javascript
Bootstrap布局组件应用实例讲解
Feb 17 Javascript
JavaScript上传文件时不用刷新页面方法总结(推荐)
Aug 15 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
Mar 07 Javascript
老生常谈JS中的继承及实现代码
Jul 06 Javascript
Angular 实现输入框中显示文章标签的实例代码
Nov 07 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 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
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
jquery根据锚点offset值实现动画切换
2014/09/11 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
浅入深出Vue之自动化路由
2019/08/06 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
2019/08/12 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
Python抓取Discuz!用户名脚本代码
2013/12/30 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
使用python接入微信聊天机器人
2020/03/31 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
竞聘书模板
2014/03/31 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
2014保险公司个人工作总结
2014/12/09 职场文书
护士求职简历自我评价
2015/03/10 职场文书
2015年征兵工作总结
2015/07/23 职场文书
2015年教师节感言
2015/08/03 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
学生检讨书范文
2019/06/24 职场文书
Python 可迭代对象 iterable的具体使用
2021/08/07 Python