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 Base类 包含基本的方法
Jul 22 Javascript
Firefox下提示illegal character并出现乱码的原因
Mar 25 Javascript
js实现jquery的offset()方法实例
Jan 10 Javascript
Javascript中arguments用法实例分析
Jun 13 Javascript
JavaScript多图片上传案例
Sep 28 Javascript
基于javascript实现listbox左右移动
Jan 29 Javascript
Jquery和JS获取ul中li标签的实现方法
Jun 02 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
Jul 15 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
Nov 03 Javascript
vue使用 better-scroll的参数和方法详解
Jan 25 Javascript
vant 时间选择器--开始时间和结束时间实例
Nov 04 Javascript
如何在vue 中引入使用jquery
Nov 10 jQuery
使用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/03/03 冲泡冲煮
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
PHP中使用CURL获取页面title例子
2015/01/07 PHP
php读取csc文件并输出
2015/05/21 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
Vue.extend 编程式插入组件的实现
2019/11/18 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
对于Python中线程问题的简单讲解
2015/04/03 Python
window下eclipse安装python插件教程
2017/04/24 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
对python 合并 累加两个dict的实例详解
2019/01/21 Python
使用Python实现分别输出每个数组
2019/12/06 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
韩国现代百货官网:Hmall
2018/03/21 全球购物
HelloFresh澳大利亚:订购你的美味食品盒、健康餐食
2018/03/28 全球购物
交通事故赔偿协议书范本
2014/04/15 职场文书
护校行动方案
2014/05/31 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server