dense
This commit is contained in:
parent
71112700de
commit
3461ce7537
@ -20,6 +20,8 @@ Generic sheets are plain JavaScript objects. Each key that does not start with
|
||||
By default, the parsers and utility functions generate "sparse-mode" worksheet
|
||||
objects. `sheet[address]` returns the cell object for the specified address.
|
||||
|
||||
#### Dense Mode
|
||||
|
||||
When the option `dense: true` is passed, parsers will generate a "dense-mode"
|
||||
worksheet where cells are stored in an array of arrays. `sheet["!data"][R][C]`
|
||||
returns the cell object at row `R` and column `C` (zero-indexed values).
|
||||
@ -28,6 +30,46 @@ When processing small worksheets in older environments, sparse worksheets are
|
||||
more efficient than dense worksheets. In newer browsers, when dealing with very
|
||||
large worksheets, dense sheets use less memory and tend to be more efficient.
|
||||
|
||||
<details><summary><b>Migrating to Dense Mode</b> (click to show)</summary>
|
||||
|
||||
`read`, `readFile`, `write`, `writeFile`, and the various API functions support
|
||||
sparse and dense worksheets. Functions that accept worksheet or workbook objects
|
||||
(e.g. `writeFile` and `sheet_to_json`) will detect dense sheets.
|
||||
|
||||
The option `dense: true` should be used when creating worksheet or book objects:
|
||||
|
||||
```diff
|
||||
-var workbook = XLSX.read(data, {...opts});
|
||||
+var workbook = XLSX.read(data, {...opts, dense: true});
|
||||
|
||||
-var sheet = XLSX.utils.aoa_to_sheet([[1,2,3],[4,5,6]], {...opts});
|
||||
+var sheet = XLSX.utils.aoa_to_sheet([[1,2,3],[4,5,6]], {...opts, dense: true});
|
||||
|
||||
-var sheet = XLSX.utils.json_to_sheet([{x:1,y:2}], {...opts});
|
||||
+var sheet = XLSX.utils.json_to_sheet([{x:1,y:2}], {...opts, dense: true});
|
||||
```
|
||||
|
||||
Code that manually loops over worksheet objects should test for `"!data"` key:
|
||||
|
||||
```js
|
||||
const { decode_range, encode_cell } = XLSX.utils;
|
||||
|
||||
function log_all_cells(ws) {
|
||||
var range = decode_range(ws["!ref"]);
|
||||
// highlight-next-line
|
||||
var dense = ws["!data"] != null; // test if sheet is dense
|
||||
for(var R = 0; R <= range.e.r; ++R) {
|
||||
for(var C = 0; C <= range.e.c; ++C) {
|
||||
// highlight-next-line
|
||||
var cell = dense ? ws["!data"]?.[R]?.[C] : ws[encode_cell({r:R, c:C})];
|
||||
console.log(R, C, cell);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### Sheet Properties
|
||||
|
||||
Each key starts with `!`. The properties are accessible as `sheet[key]`.
|
||||
|
@ -29,6 +29,26 @@ workarounds and solutions!
|
||||
|
||||
Browsers have strict memory limits and large spreadsheets can exceed the limits.
|
||||
|
||||
<details><summary><b>Technical Limitations</b> (click to show)</summary>
|
||||
|
||||
V8 (Node/Chrome) have a maximum string length that has changed over the years.
|
||||
Node 16 and Chrome 106 enforce a limit of 536870888 characters. This issue will
|
||||
manifest with error messages such as `Invalid string length`.
|
||||
|
||||
There are memory bottlenecks associated with string addresses. A number of bugs
|
||||
have been reported to the V8 and Chromium projects on this subject. While those
|
||||
bugs are being resolved, for sheets containing >100K rows, dense mode worksheets
|
||||
should be used.
|
||||
|
||||
</details>
|
||||
|
||||
The API functions support [dense mode](../csf/sheet#dense-mode):
|
||||
|
||||
```js
|
||||
var wb = XLSX.read(data, {dense: true}); // creates a dense-mode sheet
|
||||
XLSX.writeFile(data, "large.xlsx"); // writeFile can handle dense-mode sheets
|
||||
```
|
||||
|
||||
When processing very large files is a must, consider running processes in the
|
||||
server with NodeJS or some other server-side technology.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user