用NODEJS處理EXCEL文件導入導出,文件上傳

 

參考文章

http://librajt.github.io/2013/08/04/handle-excel-file-with-nodejs/

 

對比了 ExcelJS , https://github.com/guyonroche/exceljs#create-a-workbook

node-xlsxhttps://github.com/mgcrea/node-xlsx

等 nodejs 等現有組件,決定使用node-xlsx。

 

node-xlsx 基於現有前端強大組件 js-xlsx, https://github.com/SheetJS/js-xlsx

簡單使用例子:

 

var express = require('express');
var router = express.Router();
var xlsx = require('node-xlsx');
var fs = require('fs');

/* GET import excel test. */
router.get('/importExcel', function(req, res, next) {
 var filename='./public/test.xlsx';
 console.error(filename);
 // read from a file
var obj = xlsx.parse(filename);
console.log(JSON.stringify(obj));
 
res.send('import successfully!');
});
/* GET export excel test. */
router.get('/exportExcel', function(req, res, next) {
// write
var data = [[1,2,3],[true, false, null, 'sheetjs'],['foo','bar',new Date('2014-02-19T14:30Z'), '0.3'], ['baz', null, 'qux']];
var buffer = xlsx.build([{name: "mySheetName", data: data}]);
fs.writeFileSync('b.xlsx', buffer, 'binary');
res.send('export successfully!');

});

 

 

補充:

文件上傳操作可以選擇以下兩種

fs                           https://github.com/jprichardson/node-fs-extra

formidable   https://github.com/felixge/node-formidable

上傳參考代碼1: http://www.tuicool.com/articles/F7JrMjj 

              https://cnodejs.org/topic/4f40a4dc0feaaa4424081758

 

 

上傳文件  (記得創建上傳文件的目錄,例如public/upload )

routes/test.js

 

var formidable = require('formidable');
var http = require('http');
var util = require('util');
var express = require('express');
var fs = require('fs');
var path = require('path');
var favicon = require('serve-favicon');
var bodyParser = require('body-parser');

var app = express();
var server = http.createServer(app);

server.listen(3000);

app.set('views', '/views');
//app.use(favicon('/public/favicon.ico'));
app.use(bodyParser());
app.use('/public',express.static(path.join(__dirname, 'public')));


app.get('/',function(req, res) {

res.writeHead(200, {'content-type': 'text/html'});
res.end(
'<form action="/upload" enctype="multipart/form-data" method="post">'+
'<input type="text" name="title"><br>'+
'<input type="file" name="upload" multiple="multiple"><br>'+
'<input type="submit" value="Upload">'+
'</form>'
);
});

app.post('/upload', function(req,res) {

 console.log(" ########## POST /upload ####### ");
    var fileTypeError = false;
    var target_path = __dirname+"/upload";
    var form = new formidable.IncomingForm();
    form.encoding = 'utf-8';
    form.keepExtensions = true;
    form.maxFieldsSize = 10 * 1024 * 1024;
    form.uploadDir = target_path;

    var fields = [];
    var files = [];

    form.on('field', function (field, value) {
        fields.push([field, value]);
    });
    form.on('file', function (field, file) {
        console.log('upload file: ' + file.name);
       //判斷文件類型是否是xlsx
        if (file.type != 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
            fileTypeError = true;
        }
        files.push([field, file]);
    });

    form.on('end', function () {

        //遍歷上傳文件
        var fileName = '';
        var obj = '';
        var folder_exists = fs.existsSync(target_path);
        if (folder_exists) {
            var dirList = fs.readdirSync(target_path);
            dirList.forEach(function (item) {
                if (!fs.statSync(target_path + '/' + item).isDirectory()) {
                    console.log('parse item:' + target_path + '/' + item);
                    fileName = target_path + '/' + item;
                    if (!fileTypeError) {
                        //解析excel
                        obj = xlsx.parse(fileName);
                        console.log(JSON.stringify(obj));
                        //insert into DB
                        //todo
                        res.send({"rtnCode": "0", "rtnInfo": "成功導入數據"});
                    } else {
                        res.send({"rtnCode": "1", "rtnInfo": "文件格式不正確"});
                    }
                    //delete file
                    fs.unlinkSync(fileName);

                }
            });
        }else{
            res.send({"rtnCode": "1", "rtnInfo": "系統錯誤"});
        }

    });
    form.on('error', function(err) {
        res.send({"rtnCode": "1", "rtnInfo": "上傳出錯"});
    });
    form.on('aborted', function() {
        res.send({"rtnCode": "1", "rtnInfo": "放棄上傳"});
    });
    form.parse(req);
	
	
});



 

 

 

 

 

其他參考://返回上傳進度

 

form.on('progress', function(bytesReceived, bytesExpected) {
  var progress = {
    type: 'progress',
    bytesReceived: bytesReceived,
    bytesExpected: bytesExpected
  };

  socket.broadcast(JSON.stringify(progress));
});

 

歡迎關注我的微信公衆號-搜索 “前端琅琊閣“ 即可

 

如果還有問題,可以向我提問:

向我提問

 

發佈了38 篇原創文章 · 獲贊 39 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章