forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			138 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			138 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								title: Canvas Datagrid
							 | 
						||
| 
								 | 
							
								pagination_prev: demos/frontend/index
							 | 
						||
| 
								 | 
							
								pagination_next: demos/net/index
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<head>
							 | 
						||
| 
								 | 
							
								  <script src="https://unpkg.com/canvas-datagrid/dist/canvas-datagrid.js"></script>
							 | 
						||
| 
								 | 
							
								</head>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								After extensive testing, `canvas-datagrid` stood out as a high-performance grid
							 | 
						||
| 
								 | 
							
								with a straightforward API.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[Click here for a live standalone integration demo.](pathname:///cdg/)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Live Demo
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:::note
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Due to CSS conflicts between the data grid and the documentation generator,
							 | 
						||
| 
								 | 
							
								features like scrolling may not work as expected.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[The linked demo uses a simple HTML page.](pathname:///cdg/)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:::
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```jsx live
							 | 
						||
| 
								 | 
							
								function SheetJSCDG() {
							 | 
						||
| 
								 | 
							
								  const [url, setUrl] = React.useState("https://sheetjs.com/pres.numbers");
							 | 
						||
| 
								 | 
							
								  const [done, setDone] = React.useState(false);
							 | 
						||
| 
								 | 
							
								  const ref = React.useRef(); // ref to DIV container
							 | 
						||
| 
								 | 
							
								  const set_url = React.useCallback((evt) => setUrl(evt.target.value));
							 | 
						||
| 
								 | 
							
								  const [cdg, setCdg] = React.useState(null); // reference to grid object
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return ( <>
							 | 
						||
| 
								 | 
							
								    <div height={300} width={300} ref={ref}/>
							 | 
						||
| 
								 | 
							
								    {!done && ( <>
							 | 
						||
| 
								 | 
							
								      <b>URL: </b><input type="text" value={url} onChange={set_url} size="50"/>
							 | 
						||
| 
								 | 
							
								      <br/><button onClick={async() => {
							 | 
						||
| 
								 | 
							
								        /* fetch and parse workbook */
							 | 
						||
| 
								 | 
							
								        const wb = XLSX.read(await (await fetch(url)).arrayBuffer());
							 | 
						||
| 
								 | 
							
								        const ws = wb.Sheets[wb.SheetNames[0]];
							 | 
						||
| 
								 | 
							
								        const data = XLSX.utils.sheet_to_json(ws, { header:1 });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /* set up grid and load data */
							 | 
						||
| 
								 | 
							
								        if(!cdg) setCdg(canvasDatagrid({ parentNode: ref.current, data }));
							 | 
						||
| 
								 | 
							
								        else cdg.data = data;
							 | 
						||
| 
								 | 
							
								        setDone(true);
							 | 
						||
| 
								 | 
							
								      }}><b>Fetch!</b></button>
							 | 
						||
| 
								 | 
							
								    </> )}
							 | 
						||
| 
								 | 
							
								  </> );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Integration Details
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#### 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 that work with [SheetJS Pro](https://sheetjs.com/pro).
							 |