您的位置:首页 > Web前端 > Node.js

使用nodejs实现对浏览器上传excel并解析数据的实现

2017-03-31 15:10 344 查看
由于毕业设计的需要,需要实现一个上传excel 文件并且对excel 文件的数据解析存进数据库,所以在网上找了几天,自己写了一个方法来实现这一个功能,比较简单,主要是对nodejs的formidable和node-xlsx这两个模块的应用

首先,在网上查到文件的上传是不能用ajax的,所以我一开始就没打算用ajax来实现文件上传,但是后来又在网上看到有人使用formdata这种方式来实现ajax文件上传,但是本文没有采用这种方式,采用的是form表单来提交文件。具体的form参数应为

<form action="/student/fileupload" method="post" enctype='multipart/form-data'>
<h4>上传学生信息excel:</h4>
<input type="file">
<button type="submit">上传学生信息excel表</button>
</form>


这里最主要的地方就是enctype的参数要改成“multipart/form-data”,另外 input输入框的type类型要改为 file,前端页面的主要配置就是上面代码所示。

对于后台nodejs来说,我们要用到两个nodejs的插件,一个是formidable,另外一个是node-xlsx。

先用npm下载这两个包之后,在文件中引入这两个模块。

//引入formidable来读取文件
var formidable = require('formidable');

//引入node-xlsx解析excel模块
var node_xlsx = require('node-xlsx');


我们写一个对excel数据解析的方法。它的API地址为点击打开链接,里面对方法的介绍不是很多,在这里我只解释文章出现的方法。

node_xlsx.parse(file)可以对buffer流或者excel文件解析,生成一个数组对象,excelObj[0]代表第excel中第一个表的数据,一次类型,如果excel中有多个表,可以依次拿取每个表的数据;在这里我们只拿第一个表的数据。

//对excel文件进行解析,读取数据
var ExcelParse = function(newPath){
var obj = node_xlsx.parse(newPath);
var excelObj = obj[0].data;//取得第一个excel表的数据
//统计上传多少个学生信息
var num = 0;

//定义student实体类数组
var stuArray = new Array('stuName','pid','sid','birth','sex','college','major','phone','address','cid');

//循环遍历表每一行的数据
for(var i=1;i<excelObj.length;i++){
var rdata = excelObj[i];
//将每一行的数据存进数据库中
var stu = new Student();
for(var j=0;j<rdata.length;j++){
stu.set(stuArray[j],rdata[j]);
}
var pwd = pwdMade(rdata[1]);
stu.set('password',pwd);
stu.save(function(err){
num++;
if(err){
console.log("第"+num+"个学生信息出现错误!");
}
});
}
console.log("成功解析excel 数据并且存进相应数据库!");
};


当我们页面实现文件的上传后,在后台直接实例化一个formidable对象,使用该对象的方法即可取得对文件的信息。

var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.uploadDir = path.join(__dirname,'../public/upload/stuUpload/');
form.keepExtensions = true;//保留后缀
form.maxFieldsSize = 2*1024*1024;
form.parse(req,function(err,fields,files){
if(err){
console.log('文件上传错误!');
return ;
}
var filename = files.stu.name;

// 对文件名进行处理,以应对上传同名文件的情况
var nameArray = filename.split('.');
var type = nameArray[nameArray.length-1];
var name = '';
for(var i=0; i<nameArray.length-1; i++){
name = name + nameArray[i];
}

var date = new Date();
var time = '_' + date.getFullYear()+"_"+date.getMonth()+"_" +date.getDay()+"_" + date.getHours() +"_"+ date.getMinutes();

var avatarName = name + time +  '.' + type;

var newPath = form.uploadDir + avatarName ;
console.log(newPath);
fs.renameSync(files.stu.path, newPath);  //重命名
console.log('重命名成功!');
//对excel文件进行解析读取数据
ExcelParse(newPath);

res.render('student/studentInfoLoadDown');
});


这样子就可以实现对excel文件的上传和数据处理了,只是对两个node模块的方法调用,比较简单,希望可以帮到你们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息