使用nodejs實現對瀏覽器上傳excel並解析資料的實現
阿新 • • 發佈:2019-02-02
由於畢業設計的需要,需要實現一個上傳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模組的方法呼叫,比較簡單,希望可以幫到你們。