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解决图片缩放及其优化的代码
May 23 Javascript
jquery 模板的应用示例
Nov 12 Javascript
javascript实现的一个随机点名功能
Aug 26 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
Feb 13 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
JS实现日期时间动态显示的方法
Dec 07 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
使用JS实现导航切换时高亮显示的示例讲解
Aug 22 Javascript
js html实现计算器功能
Nov 13 Javascript
JavaScript动态创建二维数组的方法示例
Feb 01 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
Aug 01 Javascript
微信小程序实现吸顶效果
Jan 08 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
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
JavaScript中的Document文档对象
2008/01/16 Javascript
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
2015/05/28 Javascript
再谈JavaScript线程
2015/07/10 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
es6学习笔记之Async函数基本教程
2017/05/11 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
Python赋值语句后逗号的作用分析
2015/06/08 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
Python3之字节串bytes与字节数组bytearray的使用详解
2019/08/27 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
前台文员我鉴定
2014/01/12 职场文书
采购意向书范本
2014/03/31 职场文书
中学生演讲稿
2014/04/26 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis
python脚本框架webpy的url映射详解
2021/11/20 Python
Vue如何清空对象
2022/03/03 Vue.js
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS