Canvas Datagrid
Canvas Datagrid is a high-performance grid with a straightforward API.
Click here for a live standalone integration demo.
This demo was last verified on 2024 April 25.
Live Demo
Due to CSS conflicts between the data grid and the documentation generator, features like scrolling may not work as expected.
function SheetJSCDG() { const [url, setUrl] = React.useState("https://docs.sheetjs.com/pres.numbers"); const [done, setDone] = React.useState(false); const ref = React.useRef(); // ref to DIV container const set_url = (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:
<script src="https://unpkg.com/canvas-datagrid/dist/canvas-datagrid.js"></script>
Previewing Data
The HTML document needs a container element:
<div id="gridctr"></div>
Grid initialization is a one-liner:
var grid = canvasDatagrid({
parentNode: document.getElementById('gridctr'),
data: []
});
For large data sets, it's necessary to constrain the size of the grid.
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:
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:
/* 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.