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 寻址,闭包,对象模型和相关问题
Apr 27 Javascript
层序遍历在ExtJs的TreePanel中的应用
Oct 16 Javascript
IE的fireEvent方法概述及应用
Feb 22 Javascript
javascript获取鼠标点击元素对象(示例代码)
Dec 20 Javascript
js动态修改整个页面样式达到换肤效果
May 23 Javascript
JavaScript iframe数据共享接口实现方法
Jan 06 Javascript
JQuery日期插件datepicker的使用方法
Mar 03 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
Mar 15 Javascript
jQuery tip提示插件(实例分享)
Apr 28 jQuery
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
Jul 13 Javascript
Vue.js学习笔记之常用模板语法详解
Jul 25 Javascript
bootstrap Table实现合并相同行
Jul 19 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脚本的10个技巧(4)
2006/10/09 PHP
PHP编写简单的App接口
2016/08/28 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
详解vue-cli项目中用json-sever搭建mock服务器
2017/11/02 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
简述vue-cli中chainWebpack的使用方法
2019/07/30 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
JS绘图Flot如何实现动态可刷新曲线图
2020/10/16 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
jQuery实现电梯导航模块
2020/12/22 jQuery
Python标准库之sqlite3使用实例
2014/11/25 Python
python+django快速实现文件上传
2016/10/24 Python
Python操作csv文件实例详解
2017/07/31 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
研究生求职推荐信范文
2013/11/30 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
养成教育工作总结
2015/08/13 职场文书
庭外和解协议书
2016/03/23 职场文书
Redis 常见使用场景
2021/08/30 Redis