node.js实现上传excel/读取excel/批量导入mysql
时间:2019-08-22
本文章向大家介绍node.js实现上传excel/读取excel/批量导入mysql,主要包括node.js实现上传excel/读取excel/批量导入mysql使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
项目基于egg.js
// controller层代码
async uploadSimCardFile() {
const {ctx} = this;
const file = ctx.request.files[0]; //获取上传文件
if (!file) return ctx.throw(404);
const source = fs.createReadStream(file.filepath); //创建可读流
const filename = encodeURIComponent(ctx.request.body.name) + path.extname(file.filename)
.toLowerCase();
const distPath = path.join(this.config.baseDir, 'app/temp');
const stat = fs.statSync(distPath);
if (!stat.isDirectory()) {
fs.mkdirSync(distPath);
}
const targetPath = path.join(this.config.baseDir, 'app/temp', filename);
const target = fs.createWriteStream(targetPath);
try {
await pump(source, target);
ctx.logger.warn('SimCard will be save %s', targetPath);
} finally {
// delete those request tmp files
await ctx.cleanupRequestFiles();
}
// 读取内容
const workbook = xlsx.readFile(targetPath);
const sheetNames = workbook.SheetNames; //获取表名
const sheet = workbook.Sheets[sheetNames[0]]; //通过表名得到表对象
const thead = [sheet.A1.v, sheet.B1.v, sheet.C1.v, sheet.D1.v, sheet.E1.v, sheet.F1.v, sheet.G1.v, sheet.H1.v, sheet.I1.v];
const data = xlsx.utils.sheet_to_json(sheet); //通过工具将表对象的数据读出来并转成json
const theadRule = ['SIM卡CCID', '手机号', '号码归属地', '品牌', '数据套餐', '办卡日期', '备注1', '所属公司', '设备ID'];
const isValid = thead.every((value, index) => value === theadRule[index]);
if(!isValid) {
ctx.failure('上传的excel格式错误');
return false;
}
const result = [];
for (let i = 0; i < data.length; i++) {
result.push({
iccid: data[i][thead[0]],
sn: data[i][thead[8]] || '',
phone_number: data[i][thead[1]],
location: data[i][thead[2]],
brand: data[i][thead[3]],
remark: data[i][thead[6]],
owner: data[i][thead[7]],
price: data[i][thead[4]],
available: (data[i][thead[6]] && data[i][thead[6]].indexOf('销') > -1) ? 0 : 1,
create_time: new Date(),
transact_time: data[i][thead[5]] || '',
capacity: (data[i][thead[4]] && data[i][thead[4]].indexOf('M') > -1) ? data[i][thead[4]].split('元')[1].split('M')[0] * 1024 : 0
});
}
await ctx.service.device.basic.addSimCard(result);
ctx.success();
}
// service层
async addSimCard(result) {
// 将获取到结果包装成数组格式类似 [[],[],[],[]]
const values = [];
result.forEach(function(n) {
const _arr = [];
for(const m in n) {
_arr.push(n[m]);
}
values.push(_arr);
});
// 重点sql语句
const addSql = 'INSERT INTO sys_simcard (iccid,sn,phone_number,location,brand,capacity,price, owner, remark,available, create_time,transact_time) VALUES ?';
const _result = await this.app.mysql.query(addSql, [values]);
return _result.affectedRows === 1;
}
原文地址:https://www.cnblogs.com/Lewiskycc/p/11393886.html
- Google宣布TensorFlow Lite 可支持 Core ML!
- 开源软件十位贡献者,PHP之父只能排第十,第一名当之无愧!
- DataTable排序结果的纠正
- web框架
- java:利用xpath删除xml中的空节点
- java array to list
- Python之Dijango的“坑” hostname, aliases, ipaddrs = gethostbyaddr(name) UnicodeDecodeError: 'utf-8' cod
- nGrinder 简易使用教程
- UI设计高效学习网站&工具,来自学长的收藏夹哦
- 安装git出现templates not found的问题
- 时间戳 时间
- jenkins 设置 gitlab web hooks
- 测试流程?项目管理流程?
- 学web前端开发写给新手的建议,超实用!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7下部署开源网络流量回溯分析系统Moloch
- spring源码(八)
- 通过源码理解rarp协议(基于linux1.2.13)
- 详解Im2Col+Pack+Sgemm策略更好的优化卷积运算
- Kubernetes 使用 ceph-csi 消费 RBD 作为持久化存储
- 聊聊调试的那些事,超实用!!!
- [不定时一题]LeetCode无重复字符的最长子串
- 整理了小程序云开发实战,你看懂了吗?
- Reactive-MongoDB异步Java Driver解读
- 解密Go协程的栈内存管理
- 深入浅出mongodb之实战
- 想成为可视化高手?这篇合集就够了 | Vue
- 谈谈Vue开发过程中用到的插件
- 快速入门使用tikz绘制深度学习网络图
- why哥被一道基础面试题给干懵了,一气之下写出万字长文。