EDIT by @SheetJSDev: the recommended ArrayBuffer approach is summarized in the wiki h/t @Aymkdn
Hi Everyone,
Currently I use xlsx to read content file excel, but I have problem when I read file, The image description error bellow, now I use IE 11

Please help me. Tks you so much.
@jindovu can you share a code sample that shows this? If I had to guess, you are passing a non-string object (like a Uint8Array) but the reader is expecting a binary string.
Hi reviewher
This is my code, I write directive to read content from Excel file and browser chrome and Fifox still working fine but IE not working, Please take a look the code bellow
`.directive("fileread", [
function () {
return {
scope: {
opts: '='
},
link: function ($scope, $elm, $attrs) {
$elm.on('change', function (changeEvent) {
var reader = new FileReader();
reader.onload = function (evt) {
$scope.$apply(function () {
var filePath = $elm.val();
if (filePath.indexOf("csv") >= 0 || filePath.indexOf("xls") >= 0 || filePath.indexOf("xlsx") >= 0) {
var data = evt.target.result;
var workbook = XLSX.read(data, { type: 'binary' });
var dataJson = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
$scope.opts.data = dataJson;
}
});
};
var isVersionIe = false || !!document.documentMode;
if (isVersionIe) {
reader.readAsArrayBuffer(changeEvent.target.files[0]);
} else {
reader.readAsBinaryString(changeEvent.target.files[0]);
}
});
}
}`
@jindovu as I suspected, the problem is that you aren't always passing a binary string.
readAsBinaryString will set the result evt.target.result to a binary string, suitable for the binary type. readAsArrayBuffer will return an array buffer and you have to process it. In the demo, the array buffer is converted to a base64 string: https://github.com/SheetJS/js-xlsx/blob/master/index.html#L226-L233 You need something similar.
Do you think it's worth adding an example using angular?
Hi,
I'm not sure your problem is the same, but I guess it's related.
When we try to read a file using readAsArrayBuffer (https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsArrayBuffer) and pass it to XLSX.read with option type:"buffer", then we receive a JavaScript error: Unsupported file undefined (from readSync).
If we pass it to XLSX.read with option type:"binary", then we receive another JavaScript error: TypeError: f.charCodeAt is not a function from firstbyte().
The typical code to read a file would be:
document.getElementById('file-object').addEventListener("change", function(e) {
var files = e.target.files,file;
if (!files || files.length == 0) return;
file = files[0];
var fileReader = new FileReader();
fileReader.onload = function (e) {
var filename = file.name;
// call 'xlsx' to read the file
var oFile = XLSX.read(e.target.result, {type: 'binary', cellDates:true, cellStyles:true});
};
fileReader.readAsArrayBuffer(file);
});
Example of the problem: http://codepen.io/Aymkdn/pen/YZqdqE
To fix this issue I used http://stackoverflow.com/questions/18582643/alternative-to-readasbinarystring-for-ie10 so I pre-process my file before sending it to XLSX.read:
document.getElementById('file-object').addEventListener("change", function(e) {
var files = e.target.files,file;
if (!files || files.length == 0) return;
file = files[0];
var fileReader = new FileReader();
fileReader.onload = function (e) {
var filename = file.name;
// pre-process data
var binary = "";
var bytes = new Uint8Array(e.target.result);
var length = bytes.byteLength;
for (var i = 0; i < length; i++) {
binary += String.fromCharCode(bytes[i]);
}
// call 'xlsx' to read the file
var oFile = XLSX.read(binary, {type: 'binary', cellDates:true, cellStyles:true});
};
fileReader.readAsArrayBuffer(file);
});
Codepen of the fix: http://codepen.io/Aymkdn/pen/aJNPMV
I hope it will help
@Aymkdn the web demo actually does this conversion. Should this logic be lifted into the read function?
@SheetJSDev yes, it could be into read, but I guess it's also OK to have it as an example into this issue, for later reference for someone else. So it's up to you :-) If you want to add it, let me know and I'll create a pull request.
@Aymkdn If you have a moment can you add the body of the comment to a page in the project wiki? That way if things change we can modify the recommendation.
@SheetJSDev here you go: https://github.com/SheetJS/js-xlsx/wiki/Reading-XLSX-from-FileReader.readAsArrayBuffer()
@Aymkdn
Thank you for resolving my problem at the beginning, but do you know if this pre-processing would affect the date format shown in the spreadsheet? Can you tell if it is possible? Because I am finding divergence with the date displayed on the spreadsheet with the date parsed
@VictorLessa > honestly, I don't know… Sorry.