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脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
Nov 21 Javascript
IE8下String的Trim()方法失效的解决方法
Nov 08 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
Dec 27 Javascript
jquery获得同源iframe内body下标签的值的方法
Sep 25 Javascript
JavaScript中string转换成number介绍
Dec 31 Javascript
js兼容火狐显示上传图片预览效果的方法
May 21 Javascript
javascript中的正则表达式使用详解
Aug 30 Javascript
整理JavaScript创建对象的八种方法
Nov 03 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
js时间戳格式化成日期格式的多种方法介绍
Feb 16 Javascript
微信小程序仿微信运动步数排行(交互)
Jul 13 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自动跳转中英文页面
2008/07/29 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
PHP实现的常规正则验证helper公共类完整实例
2017/04/27 PHP
javascript cookies操作集合
2010/04/12 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
AngularJS中指令的四种基本形式实例分析
2016/11/22 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
原生javascript AJAX 三级联动的实现代码
2018/05/04 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
详解Vue基于vue-quill-editor富文本编辑器使用心得
2019/01/03 Javascript
使用微信SDK自定义分享的方法
2019/07/03 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
vuex的使用步骤
2021/01/06 Vue.js
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python实现石头剪刀布程序
2021/01/20 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
上海期货面试题
2014/01/31 面试题
职业技术学校毕业生推荐信
2013/12/03 职场文书
市级文明单位申报材料
2014/05/07 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
博士生专家推荐信
2015/03/25 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
python基础之函数的定义和调用
2021/10/24 Python