在nodejs中使用multer上传xlsx文件时添加自定义字段

时间:2017-08-31 04:50:29

标签: node.js excel

我想在excel表格的第一栏中添加自定义列数据,例如col1,col2,col3 ....等,同时上传到multer

这是我的app.js文件:

//store excel files into one folder
var storage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, __dirname + '/uploads/')
    },
    filename: function(req, file, cb) {
        cb(null, file.originalname + '-' + Date.now() + '.xlsx')
    }
});
var upload = multer({
    storage: storage
});

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

    var XLSX = require('xlsx');
    var workbook = XLSX.readFile('./uploads/' + req.file.filename);
    var sheet_name_list = workbook.SheetNames;
    var data = XLSX.utils.sheet_to_json(workbook.Sheets[sheet_name_list[0]]);
    console.log(data);
    return res.status(200).send(data);
});

我想在第一列中添加其他自定义字段,例如xlsx文件中的col1,col2 ...

这是普通的xlsx文件:

This is Normal xlsx file:

我想在上传到multer时获得这样的输出

我需要这样:

I need like this

1 个答案:

答案 0 :(得分:0)

我这样做是先将xlsx文件转换为csv,然后附加列键,然后再将该csv转换为json。

这是我完整的代码:

//excel upload
app.post('/upload', uploadmulter, api.Upload);


// store excel files into one folder
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, __dirname + '/uploads/')
    },
    filename: function (req, file, cb) {
        cb(null, Date.now() + '-' + file.originalname)
    }
});
var upload = multer({
    storage: storage
});
var uploadmulter = upload.single('file');

现在我的api代码:

// showing multer data api
exports.Upload = (req, res) => {

    //To convert xlsx to csv
    var obj = xlsx.parse('./uploads/' + req.file.filename); // parses a file
    var rows = [];
    var writeStr = "";

    //looping through all sheets
    for (var i = 0; i < obj.length; i++) {
        var sheet = obj[i];
        //loop through all rows in the sheet
        for (var j = 0; j < sheet['data'].length; j++) {
            //add the row to the rows array
            rows.push(sheet['data'][j]);
        }
    }
    //creates the csv string to write it to a file
    for (var i = 0; i < rows.length; i++) {
        writeStr += rows[i].join(",") + "\n";
    }
    //writes to a file, but you will presumably send the csv as a
    //response instead
    fs.writeFile('./uploads/' + req.file.filename, writeStr, function (err) {
        if (err) {
            return console.log(err);
        }
        console.log("csv was saved in the current directory!");





        // To add headers in CSV
        var fd = fs.openSync('./uploads/' + req.file.filename, 'a+');
        var data = fs.readFileSync('./uploads/' + req.file.filename); //read existing contents
        var fd = fs.openSync('./uploads/' + req.file.filename, 'w+');
        var buffer = new Buffer('field1\n');

        fs.writeSync(fd, buffer, 0, buffer.length, 0); //write new data
        fs.writeSync(fd, data, 0, data.length, buffer.length); //append old data
        // or fs.appendFile(fd, data);
        fs.close(fd);



        // convert csv into Json
        var Converter = require("csvtojson").Converter;
        var converter = new Converter({});
        converter.fromFile('./uploads/' + req.file.filename, function (err,
            result) {
            if (err) {
                console.log("An Error Has Occured");
                console.log(err);
            }
            var data = result;
            console.log('data=>>>>>>', data);
            return res.status(200).send(data);
        });
    });
}

我添加了像field1,field2 .....这样的列,而不是col1,col2,col3。