forked from sheetjs/docs.sheetjs.com
95 lines
2.3 KiB
Markdown
95 lines
2.3 KiB
Markdown
|
---
|
||
|
sidebar_position: 12
|
||
|
title: Legacy Frameworks
|
||
|
---
|
||
|
|
||
|
import current from '/version.js';
|
||
|
|
||
|
Over the years, many frameworks have been released. Some were popular years ago
|
||
|
but have waned in recent years. There are still many deployments using these
|
||
|
frameworks and it is oftentimes esasier to continue maintenance than to rewrite
|
||
|
using modern web techniques.
|
||
|
|
||
|
SheetJS libraries strive to maintain broad browser and JS engine compatibility.
|
||
|
|
||
|
## Integration
|
||
|
|
||
|
The ["Standalone Browser Scripts"](../../installation/standalone) section has
|
||
|
instructions for obtaining or referencing the standalone scripts. These are
|
||
|
designed to be referenced with `<script>` tags.
|
||
|
|
||
|
## Frameworks
|
||
|
|
||
|
### KnockoutJS
|
||
|
|
||
|
[KnockoutJS](https://en.wikipedia.org/wiki/Knockout_(web_framework)) was a
|
||
|
popular MVVM framework.
|
||
|
|
||
|
The [Live demo](pathname:///knockout/knockout.html) shows a view model that is
|
||
|
updated with file data and exported to spreadsheets.
|
||
|
|
||
|
|
||
|
#### State
|
||
|
|
||
|
Arrays of arrays are the simplest data structure for representing worksheets.
|
||
|
|
||
|
```js
|
||
|
var aoa = [
|
||
|
[1, 2], // A1 = 1, B1 = 2
|
||
|
[3, 4] // A1 = 3, B1 = 4
|
||
|
];
|
||
|
```
|
||
|
|
||
|
`ko.observableArray` should be used to create the view model:
|
||
|
|
||
|
```js
|
||
|
function ViewModel() {
|
||
|
/* use an array of arrays */
|
||
|
this.aoa = ko.observableArray([ [1,2], [3,4] ]);
|
||
|
}
|
||
|
/* create model */
|
||
|
var model = new ViewModel();
|
||
|
ko.applyBindings(model);
|
||
|
```
|
||
|
|
||
|
`XLSX.utils.sheet_to_json` with `header: 1` generates data for the model:
|
||
|
|
||
|
```js
|
||
|
/* starting from a `wb` workbook object, pull first worksheet */
|
||
|
var ws = wb.Sheets[wb.SheetNames[0]];
|
||
|
/* convert the worksheet to an array of arrays */
|
||
|
var aoa = XLSX.utils.sheet_to_json(ws, {header:1});
|
||
|
/* update model */
|
||
|
model.aoa(aoa);
|
||
|
```
|
||
|
|
||
|
`XLSX.utils.aoa_to_sheet` generates worksheets from the model:
|
||
|
|
||
|
```js
|
||
|
var aoa = model.aoa();
|
||
|
var ws = XLSX.utils.aoa_to_sheet(aoa);
|
||
|
```
|
||
|
|
||
|
#### Data Binding
|
||
|
|
||
|
`data-bind="foreach: ..."` provides a simple approach for binding to `TABLE`:
|
||
|
|
||
|
```html
|
||
|
<table data-bind="foreach: aoa">
|
||
|
<tr data-bind="foreach: $data">
|
||
|
<td><span data-bind="text: $data"></span></td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
```
|
||
|
|
||
|
Unfortunately the nested `"foreach: $data"` binding is read-only. A two-way
|
||
|
binding is possible using the `$parent` and `$index` binding context properties:
|
||
|
|
||
|
```html
|
||
|
<table data-bind="foreach: aoa">
|
||
|
<tr data-bind="foreach: $data">
|
||
|
<td><input data-bind="value: $parent[$index()]" /></td>
|
||
|
</tr>
|
||
|
</table>
|
||
|
```
|