154 lines
4.3 KiB
Markdown
154 lines
4.3 KiB
Markdown
|
---
|
||
|
sidebar_position: 14
|
||
|
title: Data Grids and UI
|
||
|
---
|
||
|
|
||
|
Various JavaScript UI components provide a more interactive editing experience.
|
||
|
Most are able to interchange with arrays of arrays or arrays of data objects.
|
||
|
This demo focuses on a few open source data grids.
|
||
|
|
||
|
:::note
|
||
|
|
||
|
[SheetJS Pro](https://sheetjs.com/pro) offers additional features like styling
|
||
|
and images. The UI tools typically support many of these advanced features.
|
||
|
|
||
|
To eliminate any confusion, the live examples linked from this page demonstrate
|
||
|
SheetJS Community Edition data interchange.
|
||
|
|
||
|
:::
|
||
|
|
||
|
## Managed Lifecycle
|
||
|
|
||
|
Many UI components tend to manage the entire lifecycle, providing methods to
|
||
|
import and export data.
|
||
|
|
||
|
The `sheet_to_json` utility function generates arrays of objects, which is
|
||
|
suitable for a number of libraries. When more advanced shapes are needed,
|
||
|
it is easier to munge the output of an array of arrays.
|
||
|
|
||
|
|
||
|
### Canvas DataGrid
|
||
|
|
||
|
After extensive testing, [`canvas-datagrid`](https://canvas-datagrid.js.org/demo.html)
|
||
|
stood out as a very high-performance grid with an incredibly simple API.
|
||
|
|
||
|
[Click here for a live integration demo.](pathname:///cdg/index.html)
|
||
|
|
||
|
<details><summary><b>Full Exposition</b> (click to show)</summary>
|
||
|
|
||
|
**Obtaining the Library**
|
||
|
|
||
|
The `canvas-datagrid` NodeJS packages include a minified script that can be
|
||
|
directly inserted as a script tag. The unpkg CDN also serves this script:
|
||
|
|
||
|
```html
|
||
|
<script src="https://unpkg.com/canvas-datagrid/dist/canvas-datagrid.js"></script>
|
||
|
```
|
||
|
|
||
|
**Previewing Data**
|
||
|
|
||
|
The HTML document needs a container element:
|
||
|
|
||
|
```html
|
||
|
<div id="gridctr"></div>
|
||
|
```
|
||
|
|
||
|
Grid initialization is a one-liner:
|
||
|
|
||
|
```js
|
||
|
var grid = canvasDatagrid({
|
||
|
parentNode: document.getElementById('gridctr'),
|
||
|
data: []
|
||
|
});
|
||
|
```
|
||
|
|
||
|
For large data sets, it's necessary to constrain the size of the grid.
|
||
|
|
||
|
```js
|
||
|
grid.style.height = '100%';
|
||
|
grid.style.width = '100%';
|
||
|
```
|
||
|
|
||
|
Once the workbook is read and the worksheet is selected, assigning the data
|
||
|
variable automatically updates the view:
|
||
|
|
||
|
```js
|
||
|
grid.data = XLSX.utils.sheet_to_json(ws, {header:1});
|
||
|
```
|
||
|
|
||
|
This demo previews the first worksheet.
|
||
|
|
||
|
**Editing**
|
||
|
|
||
|
`canvas-datagrid` handles the entire edit cycle. No intervention is necessary.
|
||
|
|
||
|
**Saving Data**
|
||
|
|
||
|
`grid.data` is immediately readable and can be converted back to a worksheet.
|
||
|
Some versions return an array-like object without the length, so a little bit of
|
||
|
preparation may be needed:
|
||
|
|
||
|
```js
|
||
|
/* converts an array of array-like objects into an array of arrays */
|
||
|
function prep(arr) {
|
||
|
var out = [];
|
||
|
for(var i = 0; i < arr.length; ++i) {
|
||
|
if(!arr[i]) continue;
|
||
|
if(Array.isArray(arr[i])) { out[i] = arr[i]; continue };
|
||
|
var o = new Array();
|
||
|
Object.keys(arr[i]).forEach(function(k) { o[+k] = arr[i][k] });
|
||
|
out[i] = o;
|
||
|
}
|
||
|
return out;
|
||
|
}
|
||
|
|
||
|
/* build worksheet from the grid data */
|
||
|
var ws = XLSX.utils.aoa_to_sheet(prep(grid.data));
|
||
|
|
||
|
/* build up workbook */
|
||
|
var wb = XLSX.utils.book_new();
|
||
|
XLSX.utils.book_append_sheet(wb, ws, 'SheetJS');
|
||
|
|
||
|
/* generate download */
|
||
|
XLSX.writeFile(wb, "SheetJS.xlsx");
|
||
|
```
|
||
|
|
||
|
**Additional Features**
|
||
|
|
||
|
This demo barely scratches the surface. The underlying grid component includes
|
||
|
many additional features including massive data streaming, sorting and styling.
|
||
|
|
||
|
</details>
|
||
|
|
||
|
|
||
|
### Angular UI Grid
|
||
|
|
||
|
:::warning
|
||
|
|
||
|
This UI Grid is for AngularJS, not the modern Angular. New projects should not
|
||
|
use AngularJS. This demo is included for legacy applications.
|
||
|
|
||
|
The [AngularJS demo](./legacy#angularjs) covers more general strategies.
|
||
|
|
||
|
:::
|
||
|
|
||
|
[Click here for a live integration demo.](pathname:///angularjs/ui-grid.html)
|
||
|
|
||
|
<details><summary><b>Notes</b> (click to show)</summary>
|
||
|
|
||
|
The library does not provide any way to modify the import button, so the demo
|
||
|
includes a simple directive for a HTML File Input control. It also includes a
|
||
|
sample service for export which adds an item to the export menu.
|
||
|
|
||
|
The demo `SheetJSImportDirective` follows the prescription from the README for
|
||
|
File input controls using `readAsArrayBuffer`, converting to a suitable
|
||
|
representation and updating the scope.
|
||
|
|
||
|
`SheetJSExportService` exposes export functions for `XLSB` and `XLSX`. Other
|
||
|
file formats can be exported by changing the `bookType` variable. It grabs
|
||
|
values from the grid, builds an array of arrays, generates a workbook and forces
|
||
|
a download. By setting the `filename` and `sheetname` options in the `ui-grid`
|
||
|
options, the output can be controlled.
|
||
|
|
||
|
</details>
|