javascriptangularjsnode.jsimport-from-excel

Reading Excel file using node.js


Okay so i am using the FileUploader module to upload my file from angular to my REST API:

var uploader = $scope.uploader = new FileUploader({
    url: api.getUrl('uploadCompetence',null)
});

This is sent to the following POST function:

        router.route('/api/uploadCompetence')
        .post(function (req, res) {

        // This is where i want to read the file

            var competence = Competence.build(req.body.location);
            competence.add(function (success) {
                    res.json({message: 'quote created!'});
                },
                function (err) {
                    res.status(err).send(err);
                });
        })

Now my goal is to read the excel file and then add each row to my database.

However im not quite sure how i can read the file from Node.js i have debugged my server and couldnt find the file anywhere but the the api is being called from my Angular application

Can anyone push me in the right direction? :)


Solution

  • There are a few different libraries doing parsing of Excel files (.xlsx). I will list two projects I find interesting and worth looking into.

    Node-xlsx

    Excel parser and builder. It's kind of a wrapper for a popular project JS-XLSX, which is a pure javascript implementation from the Office Open XML spec.

    node-xlsx project page

    Example for parsing file

    var xlsx = require('node-xlsx');
    
    var obj = xlsx.parse(__dirname + '/myFile.xlsx'); // parses a file
    
    var obj = xlsx.parse(fs.readFileSync(__dirname + '/myFile.xlsx')); // parses a buffer
    

    ExcelJS

    Read, manipulate and write spreadsheet data and styles to XLSX and JSON. It's an active project. At the time of writing the latest commit was 9 hours ago. I haven't tested this myself, but the api looks extensive with a lot of possibilites.

    exceljs project page

    Code example:

    // read from a file
    var workbook = new Excel.Workbook();
    workbook.xlsx.readFile(filename)
        .then(function() {
            // use workbook
        });
    
    // pipe from stream
    var workbook = new Excel.Workbook();
    stream.pipe(workbook.xlsx.createInputStream());