forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			101 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# x-spreadsheet
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The `sheet_to_json` utility function generates output arrays suitable for use
							 | 
						||
| 
								 | 
							
								with other JS libraries such as data grids for previewing data.  With a familiar
							 | 
						||
| 
								 | 
							
								UI, [`x-spreadsheet`](https://myliang.github.io/x-spreadsheet/) is an excellent
							 | 
						||
| 
								 | 
							
								choice for developers looking for a modern editor.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This demo is available at <https://oss.sheetjs.com/sheetjs/x-spreadsheet.html>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Obtaining the Library
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The [`x-data-spreadsheet` module](http://npm.im/x-data-spreadsheet) includes a
							 | 
						||
| 
								 | 
							
								minified script `dist/xspreadsheet.js` that can be directly inserted as a script
							 | 
						||
| 
								 | 
							
								tag.  The unpkg CDN also exposes the latest version:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```html
							 | 
						||
| 
								 | 
							
								<script src="https://unpkg.com/x-data-spreadsheet/dist/xspreadsheet.js"></script>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Previewing Data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The HTML document needs a container element:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```html
							 | 
						||
| 
								 | 
							
								<div id="gridctr"></div>
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Grid initialization is a one-liner:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								/* note that the browser build exposes the variable `x` */
							 | 
						||
| 
								 | 
							
								var grid = x.spreadsheet(document.getElementById("gridctr"));
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The following function converts data from SheetJS to x-spreadsheet:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								function stox(wb) {
							 | 
						||
| 
								 | 
							
								  var out = [];
							 | 
						||
| 
								 | 
							
								  wb.SheetNames.forEach(function(name) {
							 | 
						||
| 
								 | 
							
								    var o = {name:name, rows:{}};
							 | 
						||
| 
								 | 
							
								    var ws = wb.Sheets[name];
							 | 
						||
| 
								 | 
							
								    var aoa = XLSX.utils.sheet_to_json(ws, {raw: false, header:1});
							 | 
						||
| 
								 | 
							
								    aoa.forEach(function(r, i) {
							 | 
						||
| 
								 | 
							
								      var cells = {};
							 | 
						||
| 
								 | 
							
								      r.forEach(function(c, j) { cells[j] = ({ text: c }); });
							 | 
						||
| 
								 | 
							
								      o.rows[i] = { cells: cells };
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								    out.push(o);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  return out;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* load data */
							 | 
						||
| 
								 | 
							
								grid.loadData(stox(workbook_object));
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Editing
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`x-spreadsheet` handles the entire edit cycle.  No intervention is necessary.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Saving Data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`grid.getData()` returns an object that can be converted back to a worksheet:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```js
							 | 
						||
| 
								 | 
							
								function xtos(sdata) {
							 | 
						||
| 
								 | 
							
								  var out = XLSX.utils.book_new();
							 | 
						||
| 
								 | 
							
								  sdata.forEach(function(xws) {
							 | 
						||
| 
								 | 
							
								    var aoa = [[]];
							 | 
						||
| 
								 | 
							
								    var rowobj = xws.rows;
							 | 
						||
| 
								 | 
							
								    for(var ri = 0; ri < rowobj.len; ++ri) {
							 | 
						||
| 
								 | 
							
								      var row = rowobj[ri];
							 | 
						||
| 
								 | 
							
								      if(!row) continue;
							 | 
						||
| 
								 | 
							
								      aoa[ri] = [];
							 | 
						||
| 
								 | 
							
								      Object.keys(row.cells).forEach(function(k) {
							 | 
						||
| 
								 | 
							
								        var idx = +k;
							 | 
						||
| 
								 | 
							
								        if(isNaN(idx)) return;
							 | 
						||
| 
								 | 
							
								        aoa[ri][idx] = row.cells[k].text;
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    var ws = XLSX.utils.aoa_to_sheet(aoa);
							 | 
						||
| 
								 | 
							
								    XLSX.utils.book_append_sheet(out, ws, xws.name);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  return out;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* build workbook from the grid data */
							 | 
						||
| 
								 | 
							
								var new_wb = xtos(xspr.getData());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* generate download */
							 | 
						||
| 
								 | 
							
								XLSX.writeFile(new_wb, "SheetJS.xlsx");
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Additional Features
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This demo barely scratches the surface.  The underlying grid component includes
							 | 
						||
| 
								 | 
							
								many additional features that work with [SheetJS Pro](https://sheetjs.com/pro).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](https://github.com/SheetJS/js-xlsx)
							 |