---
sidebar_position: 2
title: Troubleshooting
hide_table_of_contents: true
---
Here are some common errors and their resolutions.  This is not comprehensive.
The [issue tracker](https://github.com/SheetJS/sheetjs/issues) has a wealth of
information and user-contributed examples.
If issues are not covered in the docs or the issue tracker, or if a solution is
not discussed in the documentation, we would appreciate a bug report.
:::info Special Thanks
Special thanks to the early adopters and users for discovering and sharing many
workarounds and solutions!
:::
## Errors
#### SCRIPT5022: DataCloneError
IE10 does not properly support `Transferable`.
#### Object doesn't support property or method 'slice'
IE does not implement `Uint8Array#slice`. An implementation is included in the
shim script.  Check [the "Standalone" Installation note](../getting-started/installation/standalone#internet-explorer-and-older-browsers)
#### TypeError: f.substr is not a function
Some Google systems use the `base64url` encoding. `base64url` and `base64` are
different encodings.  A simple regular expression can translate the data:
```js
var wb = XLSX.read(b64.replace(/_/g, "/").replace(/-/g, "+"), {type:'base64'});
```
#### Error: Cannot read property '0' of undefined
`FileReader#readAsText` will corrupt binary data including XLSX, XLSB, XLS, and
other binary spreadsheet files.
Applications should use `FileReader#readAsArrayBuffer` or `Blob#arrayBuffer`.
Examples are included [in "User Submissions"](../06-solutions/01-input.md#example-user-submissions)
Applications specifically targeting legacy browsers like IE10 should use
`FileReader#readAsBinaryString` to read the data and call `XLSX.read` using the
`binary` type.
#### `Unsupported file undefined` when reading ArrayBuffer objects
Old versions of the library did not automatically detect `ArrayBuffer` objects.
Workaround (click to show)
:::warning Legacy workaround
This solution is not recommended for production deployments.  Native support
for `ArrayBuffer` was added in library version `0.9.9`.
:::
After reading data with `FileReader#readAsArrayBuffer`, manually translate to
binary string and call `XLSX.read` with type `"binary"`
```js
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);
});
```
More Code Snippets (click to show) 
`set_sheet_range` changes a sheet's range given a general target spec that can include only the start or end cell:
```js
/* given the old range and a new range spec, produce the new range */
function change_range(old, range) {
  var oldrng = XLSX.utils.decode_range(old), newrng;
  if(typeof range == "string") {
    if(range.charAt(0) == ":") newrng = {e:XLSX.utils.decode_cell(range.substr(1))};
    else if(range.charAt(range.length - 1) == ":") newrng = {s:XLSX.utils.decode_cell(range.substr(0, range.length - 1))};
    else newrng = XLSX.utils.decode_range(range);
  } else newrng = range;
  if(newrng.s) {
    if(newrng.s.c != null) oldrng.s.c = newrng.s.c;
    if(newrng.s.r != null) oldrng.s.r = newrng.s.r;
  }
  if(newrng.e) {
    if(newrng.e.c != null) oldrng.e.c = newrng.e.c;
    if(newrng.e.r != null) oldrng.e.r = newrng.e.r;
  }
  return XLSX.utils.encode_range(oldrng);
}
/* call change_sheet and modify worksheet */
function set_sheet_range(sheet, range) {
  sheet['!ref'] = change_range(sheet['!ref'], range);
}
```
_Adding a cell to a range_
```js
function range_add_cell(range, cell) {
  var rng = XLSX.utils.decode_range(range);
  var c = typeof cell == 'string' ? XLSX.utils.decode_cell(cell) : cell;
  console.log(rng, c);
  if(rng.s.r > c.r) rng.s.r = c.r;
  if(rng.s.c > c.c) rng.s.c = c.c;
  if(rng.e.r < c.r) rng.e.r = c.r;
  if(rng.e.c < c.c) rng.e.c = c.c;
  return XLSX.utils.encode_range(rng);
}
range_add_cell("A1:C3","B2")
function add_to_sheet(sheet, cell) {
  sheet['!ref'] = range_add_cell(sheet['!ref'], cell);
}
```