Geno Diaz
Geno Diaz

Reputation: 510

Parsing Excel sheet with js-xlsx

I am trying to parse all the excel files in a directory specified by the user but the js-xlsx library I am using seems to need manual navigation.

var url = "/test-files/test.xlsx"; <-------- Located in the project directory
var oReq = new XMLHttpRequest();
oReq.open("GET", url, true);
oReq.responseType = "arraybuffer";

oReq.onload = function(e) {
    var arraybuffer = oReq.response;

    var data = new Uint8Array(arraybuffer);
    var arr = new Array();
    for (var i = 0; i != data.length; i++) arr[i] = String.fromCharCode(data[i]);
    var bstr = arr.join("");

    var workbook = XLSX.read(bstr, {
        type: "binary"
    });
}

oReq.send();

The code needs to be dynamic in that it can open an excel file anywhere.

Is there any way that I can use a fileentry object with js-xlsx library to parse an excel file?

Upvotes: 4

Views: 5097

Answers (1)

Geno Diaz
Geno Diaz

Reputation: 510

For those who may be curious I figured out a solution.

In order to dynamically create a path to a given fileEntry object you must first convert it into a Blob:

fileEntryObject.file(function(file) {});

Then convert it to a window.URL that way your project may have access to a readable path to the desired file:

var newPath = window.URL.createObjectURL(file);

Thus you may use it like a regular path in your functions even if you don't know how to navigate from your project to the file:

fileEntryObject.file(function(file) {
        var newPath = window.URL.createObjectURL(file);
        var oReq = new XMLHttpRequest();
        oReq.open("GET", newPath, true);
        oReq.responseType = "arraybuffer";
            oReq.onError = function(e) {
            console.log('Error in reading excel file');
        };
            oReq.onload = function(e) {
            var arraybuffer = oReq.response;
            var data = new Uint8Array(arraybuffer);
            var arr = new Array();
            for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
            var bstr = arr.join("");
                var workbook = XLSX.read(bstr, {
                type: "binary"
            });

            var sheet_name = workbook.SheetNames[1];
            var worksheet = workbook.Sheets[sheet_name];
                self.parseReceive(worksheet, callback);
            // self.parseReceive(worksheet);
        };
    oReq.send();
});

Upvotes: 4

Related Questions