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 相关文章推荐
js隐藏与显示回到顶部按钮及window.onscroll事件应用
Jan 25 Javascript
Javascript 实现的数独解题算法网页实例
Oct 15 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
Jan 26 Javascript
javascript实现rgb颜色转换成16进制格式
Jul 10 Javascript
jQuery实现平滑滚动页面到指定锚点链接的方法
Jul 15 Javascript
浅谈JavaScript超时调用和间歇调用
Aug 30 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
Apr 01 Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 Javascript
jquery文字填写自动高度的实现方法
Nov 07 Javascript
JS 实现百度搜索功能
Feb 01 Javascript
微信小程序实现上传图片功能
May 28 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
Aug 01 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文件操作的详解
2013/06/05 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
php遍历类中包含的所有元素的方法
2015/05/12 PHP
PHP实现登录注册之BootStrap表单功能
2017/09/03 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
仅一个form表单 js实现注册信息依次填写提交功能
2016/06/12 Javascript
BootStrap 动态添加验证项和取消验证项的实现方法
2016/09/28 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
微信小程序 UI与容器组件总结
2017/02/21 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
Python使用while循环花式打印乘法表
2019/01/28 Python
Python3中函数参数传递方式实例详解
2019/05/05 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
股东合作协议书
2014/09/12 职场文书
门面房租房协议书
2014/12/01 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
Win10 和 Win11可以共存吗? win10/11产品生命周期/服务更新介绍
2021/11/21 数码科技