1. 程式人生 > >使用nodejs實現對瀏覽器上傳excel並解析資料的實現

使用nodejs實現對瀏覽器上傳excel並解析資料的實現

由於畢業設計的需要,需要實現一個上傳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模組的方法呼叫,比較簡單,希望可以幫到你們。