forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# Knockout 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `xlsx.core.min.js` and `xlsx.full.min.js` scripts are designed to be dropped
							 | 
						||
| 
								 | 
							
								into web pages with script tags:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```html
							 | 
						||
| 
								 | 
							
								<script src="xlsx.full.min.js"></script>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Strictly speaking, there should be no need for a Knockout demo!  You can proceed
							 | 
						||
| 
								 | 
							
								as you would with any other browser-friendly library.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Array of Arrays
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A common data table is often stored as an array of arrays:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var aoa = [ [1,2], [3,4] ];
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This neatly maps to a table with `data-bind="foreach: ..."`:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```html
							 | 
						||
| 
								 | 
							
								<table data-bind="foreach: aoa">
							 | 
						||
| 
								 | 
							
								  <tr data-bind="foreach: $data">
							 | 
						||
| 
								 | 
							
								    <td><span data-bind="text: $data"></span></td>
							 | 
						||
| 
								 | 
							
								  </tr>
							 | 
						||
| 
								 | 
							
								</table>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `sheet_to_json` utility function can generate array of arrays for model use:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```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);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Demo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The easiest observable representation is an `observableArray`:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								var ViewModel = function() { this.aoa = ko.observableArray([[1,2],[3,4]]); };
							 | 
						||
| 
								 | 
							
								var model = new ViewModel();
							 | 
						||
| 
								 | 
							
								ko.applyBindings(model);
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The demo shows reading worksheets into a view model and writing models to XLSX.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](https://github.com/SheetJS/js-xlsx)
							 |