2022-08-29 06:40:12 +00:00
|
|
|
---
|
|
|
|
sidebar_position: 2
|
|
|
|
title: Troubleshooting
|
|
|
|
hide_table_of_contents: true
|
|
|
|
---
|
|
|
|
|
|
|
|
Here are some common errors and their resolutions. This is not comprehensive.
|
2022-10-04 20:37:38 +00:00
|
|
|
The [issue tracker](https://git.sheetjs.com/SheetJS/sheetjs/issues) has a
|
|
|
|
wealth of information and user-contributed examples.
|
2022-08-29 06:40:12 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2022-08-29 20:34:30 +00:00
|
|
|
IE10 does not properly support `Transferable`.
|
2022-08-29 06:40:12 +00:00
|
|
|
|
|
|
|
#### 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.
|
|
|
|
|
|
|
|
<details><summary><b>Workaround</b> (click to show)</summary>
|
|
|
|
|
|
|
|
:::warning Legacy workaround
|
|
|
|
|
2022-08-29 20:34:30 +00:00
|
|
|
This solution is not recommended for production deployments. Native support
|
2022-08-29 06:40:12 +00:00
|
|
|
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);
|
|
|
|
});
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
|
|
## Data Issues
|
|
|
|
|
2022-10-11 04:46:01 +00:00
|
|
|
#### Generated XLSX files are very large!
|
|
|
|
|
|
|
|
By default, compression is disabled. Set the option `compression: true` in the
|
|
|
|
`write` or `writeFile` options object. For example:
|
|
|
|
|
|
|
|
```js
|
|
|
|
XLSX.writeFile(workbook, "export.xlsx", { compression: true });
|
|
|
|
```
|
|
|
|
|
2022-08-29 06:40:12 +00:00
|
|
|
#### CSV and XLS files with Chinese or Japanese characters look garbled
|
|
|
|
|
|
|
|
The ESM build, used in tools like Webpack and in Deno, does not include the
|
|
|
|
codepage tables by default. The ["Frameworks and Bundlers"](../02-getting-started/01-installation/02-frameworks.md#encoding-support)
|
|
|
|
section explains how to load support.
|
|
|
|
|
2022-09-09 23:44:12 +00:00
|
|
|
#### DBF files with Chinese or Japanese characters have underscores
|
|
|
|
|
|
|
|
As mentioned in the previous answer, codepage tables must be loaded.
|
|
|
|
|
|
|
|
When reading legacy files that do not include character set metadata, the
|
|
|
|
`codepage` option controls the codepage. Common values:
|
|
|
|
|
|
|
|
| `codepage` | Description |
|
|
|
|
|-----------:|:-------------------------|
|
|
|
|
| 874 | Windows Thai |
|
|
|
|
| 932 | Japanese Shift-JIS |
|
|
|
|
| 936 | Simplified Chinese GBK |
|
|
|
|
| 950 | Traditional Chinese Big5 |
|
|
|
|
| 1200 | UTF-16 Little Endian |
|
|
|
|
| 1252 | Windows Latin 1 |
|
|
|
|
|
|
|
|
When writing files in legacy formats like DBF, the default codepage 1252 will
|
|
|
|
be used. The codepage option will override the setting. Any characters missing
|
|
|
|
from the character set will be replaced with underscores.
|
|
|
|
|
2022-08-29 06:40:12 +00:00
|
|
|
#### Worksheet only includes one row of data
|
|
|
|
|
|
|
|
Some third-party writer tools will not update the dimensions records in XLSX or
|
|
|
|
XLS or XLSB exports. SheetJS utility functions will skip values not in range.
|
|
|
|
|
|
|
|
The following helper function will recalculate the range:
|
|
|
|
|
|
|
|
```js
|
|
|
|
function update_sheet_range(ws) {
|
|
|
|
var range = {s:{r:Infinity, c:Infinity},e:{r:0,c:0}};
|
|
|
|
Object.keys(ws).filter(function(x) { return x.charAt(0) != "!"; }).map(XLSX.utils.decode_cell).forEach(function(x) {
|
|
|
|
range.s.c = Math.min(range.s.c, x.c); range.s.r = Math.min(range.s.r, x.r);
|
|
|
|
range.e.c = Math.max(range.e.c, x.c); range.e.r = Math.max(range.e.r, x.r);
|
|
|
|
});
|
|
|
|
ws['!ref'] = XLSX.utils.encode_range(range);
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
<details><summary><b>More Code Snippets</b> (click to show) </summary>
|
|
|
|
|
|
|
|
|
|
|
|
`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;
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|