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 相关文章推荐
JQuery设置获取下拉菜单某个选项的值(比较全)
Aug 05 Javascript
js实现select跳转功能代码
Oct 22 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
Aug 25 Javascript
Bootstrap 实现查询的完美方法
Oct 26 Javascript
基于jquery实现二级联动效果
Mar 30 jQuery
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
Apr 26 Javascript
利用CDN加速react webpack打包后的文件详解
Feb 22 Javascript
微信小程序实现跳转的几种方式总结(推荐)
Apr 24 Javascript
原生js实现trigger方法示例代码
May 22 Javascript
详解vue 命名视图
Aug 14 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 Javascript
js回溯法计算最佳旅行线路代码实例
Sep 11 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
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
yii2 url重写并隐藏index.php方法
2018/12/10 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
jQuery Ajax 全解析
2009/02/08 Javascript
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
php与js的区别是什么
2013/08/05 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
js图片加载效果实例代码(延迟加载+瀑布流加载)
2017/05/12 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Python素数检测的方法
2015/05/11 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
乡文化站暑期培训方案
2014/08/28 职场文书
组织生活会发言材料
2014/12/15 职场文书
催款通知书范文
2015/04/17 职场文书
毕业赠语大全
2015/06/23 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python