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.Encode手动解码技巧
Jul 14 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
May 07 Javascript
JS根据年月获得当月天数的实现代码
Jul 03 Javascript
基于javascript简单实现对身份证校验
Jan 25 Javascript
JS实现重新加载当前页面
Nov 29 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
Jul 11 Javascript
vue2.0 elementUI制作面包屑导航栏
Feb 22 Javascript
Vue入门之animate过渡动画效果
Apr 08 Javascript
react 国际化的实现代码示例
Sep 14 Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 Javascript
JS常用排序方法实例代码解析
Mar 03 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
使用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 switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
php生成随机数的三种方法
2014/09/10 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
JScript分割字符串示例代码
2013/09/04 Javascript
当json键为数字时的取值方法解析
2013/11/15 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
js实现筛选功能
2020/11/24 Javascript
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
django允许外部访问的实例讲解
2018/05/14 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Python 改变数组类型为uint8的实现
2020/04/09 Python
Python自动化操作实现图例绘制
2020/07/09 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
详解CSS3中border-image的使用
2015/07/18 HTML / CSS
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
彩色的非洲教学反思
2014/02/18 职场文书
成语的广告词
2014/03/19 职场文书
竞赛口号大全
2014/06/16 职场文书
2015年新教师工作总结
2015/04/28 职场文书
寒假致家长的一封信
2015/10/10 职场文书
高三英语教学反思
2016/03/03 职场文书
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js