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 相关文章推荐
根据分辨率不同,调用不同的css文件
Jul 07 Javascript
js控制框架刷新
Aug 01 Javascript
JavaScript 对象、函数和继承
Jul 07 Javascript
javascript中验证大写字母、数字和中文
Jan 15 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
JS 作用域与作用域链详解
Apr 07 Javascript
浅谈javascript中的数据类型转换
Dec 27 Javascript
js实现随机抽选效果、随机抽选红色球效果
Jan 13 Javascript
JavaScript实现的XML与JSON互转功能详解
Feb 16 Javascript
JavaScript中立即执行函数实例详解
Nov 04 Javascript
vue proxy 的优势与使用场景实现
Jun 15 Javascript
通过实例解析jQ Ajax操作相关原理
Sep 23 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/07 PHP
Java中final关键字详解
2015/08/10 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
浅析jquery的js图表组件highcharts
2014/03/06 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
浅谈mvvm-simple双向绑定简单实现
2018/04/18 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
原生js实现自定义消息提示框
2020/11/19 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
使用C++扩展Python的功能详解
2018/01/12 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
Python中dict和set的用法讲解
2019/03/28 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
详解利用canvas实现环形进度条的方法
2019/06/12 HTML / CSS
三星法国官方网站:Samsung法国
2019/10/31 全球购物
文艺晚会主持词
2014/03/24 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python