forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			205 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			205 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | --- | ||
|  | title: Sheets in Dojo Sites | ||
|  | sidebar_label: Dojo Toolkit | ||
|  | description: Build interactive websites with Dojo. Seamlessly integrate spreadsheets into your app using SheetJS. Bring Excel-powered workflows and data to the modern web. | ||
|  | pagination_prev: demos/index | ||
|  | pagination_next: demos/grid/index | ||
|  | sidebar_position: 8 | ||
|  | --- | ||
|  | 
 | ||
|  | import current from '/version.js'; | ||
|  | import CodeBlock from '@theme/CodeBlock'; | ||
|  | 
 | ||
|  | [Dojo Toolkit](https://dojotoolkit.org/) is a JavaScript toolkit for building | ||
|  | user interfaces. It includes solutions for code loading and DOM manipulation. | ||
|  | 
 | ||
|  | [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||
|  | data from spreadsheets. | ||
|  | 
 | ||
|  | This demo uses Dojo Toolkit and SheetJS to process and generate spreadsheets. | ||
|  | We'll explore how to load SheetJS using Dojo loader and perform common tasks. | ||
|  | 
 | ||
|  | ## Installation
 | ||
|  | 
 | ||
|  | The ["AMD" instructions](/docs/getting-started/installation/amd#dojo-toolkit) | ||
|  | includes details for using SheetJS with `require`. | ||
|  | 
 | ||
|  | The demos in this section use the async loading strategy with the SheetJS CDN: | ||
|  | 
 | ||
|  | <CodeBlock language="html">{`\ | ||
|  | <script> | ||
|  | /* configure package paths */ | ||
|  | dojoConfig = { | ||
|  |   packages: [ | ||
|  |     { | ||
|  |       /* Dojo only supports the name "xlsx" for the script */ | ||
|  |       name: "xlsx", | ||
|  |       /* \`location\` omits trailing slash */ | ||
|  |       location: "https://cdn.sheetjs.com/xlsx-${current}/package/dist", | ||
|  |       /* \`main\` omits the ".js" extension */ | ||
|  |       main: "xlsx.full.min" | ||
|  |     } | ||
|  |   ] | ||
|  | } | ||
|  | </script> | ||
|  | <!-- load dojo.js --> | ||
|  | <script src="dojo.js" data-dojo-config="isDebug:1, async:1"></script> | ||
|  | <script> | ||
|  | require( | ||
|  |   /* specify "xlsx" in the module array */ | ||
|  |   ["dojo/request/xhr", "xlsx"], | ||
|  |   /* the name of the variable should not be _XLSX ! */ | ||
|  |   function(xhr, _XLSX) { | ||
|  |     /* XLSX-related operations happen in the callback. Use the global \`XLSX\` */ | ||
|  |     console.log(XLSX.version); | ||
|  |   } | ||
|  | ); | ||
|  | </script>`} | ||
|  | </CodeBlock> | ||
|  | 
 | ||
|  | :::warning pass | ||
|  | 
 | ||
|  | The official Google CDN does not have the newest releases of Dojo Toolkit | ||
|  | 
 | ||
|  | **This is a known Google CDN bug.** | ||
|  | 
 | ||
|  | The script <https://docs.sheetjs.com/dojo/dojo.js> was fetched from the official | ||
|  | `1.17.3` uncompressed release artifact[^1]. | ||
|  | 
 | ||
|  | ::: | ||
|  | 
 | ||
|  | ## Live Demos
 | ||
|  | 
 | ||
|  | :::note Tested Deployments | ||
|  | 
 | ||
|  | The demos were last tested on 2023-11-27. | ||
|  | 
 | ||
|  | Demos exclusively using Dojo Core were tested using Dojo Toolkit `1.17.3`. | ||
|  | 
 | ||
|  | Demos using `dijit` or `dojox` were tested using Dojo Toolkit `1.14.1`. This | ||
|  | was the latest version available on the Google CDN. | ||
|  | 
 | ||
|  | ::: | ||
|  | 
 | ||
|  | - [Download and display data](pathname:///dojo/read.html) | ||
|  | - [Fetch JSON and generate a workbook](pathname:///dojo/write.html) | ||
|  | - [Parse file and create a data store](pathname:///dojo/combo.html) | ||
|  | - [Export data from a store to XLSX](pathname:///dojo/export.html) | ||
|  | 
 | ||
|  | ## Operations
 | ||
|  | 
 | ||
|  | ### Parsing Remote Files
 | ||
|  | 
 | ||
|  | When fetching spreadsheets with XHR, `handleAs: "arraybuffer"` yields an | ||
|  | `ArrayBuffer` which can be passed to the SheetJS `read` method. | ||
|  | 
 | ||
|  | The following example generates a HTML table from the first worksheet: | ||
|  | 
 | ||
|  | ```html | ||
|  | <div id="tbl"></div> | ||
|  | <script> | ||
|  | require(["dojo/request/xhr", "xlsx"], function(xhr, _XLSX) { | ||
|  |   xhr("https://sheetjs.com/pres.numbers", { | ||
|  |     headers: { "X-Requested-With": null }, | ||
|  | // highlight-next-line | ||
|  |     handleAs: "arraybuffer" | ||
|  |   }).then(function(ab) { | ||
|  |     /* read ArrayBuffer */ | ||
|  | // highlight-next-line | ||
|  |     var wb = XLSX.read(ab); | ||
|  |     /* display first worksheet data */ | ||
|  |     var ws = wb.Sheets[wb.SheetNames[0]]; | ||
|  |     document.getElementById("tbl").innerHTML = XLSX.utils.sheet_to_html(ws); | ||
|  |   }); | ||
|  | }); | ||
|  | </script> | ||
|  | ``` | ||
|  | 
 | ||
|  | :::note pass | ||
|  | 
 | ||
|  | The `X-Requested-With` header setting resolves some issues related to CORS. | ||
|  | 
 | ||
|  | ::: | ||
|  | 
 | ||
|  | ### Writing Local Files
 | ||
|  | 
 | ||
|  | The SheetJS `writeFile` method attempts to create and download a file: | ||
|  | 
 | ||
|  | ```js | ||
|  | require(["xlsx"], function(_XLSX) { | ||
|  |   /* create a sample workbook */ | ||
|  |   var ws = XLSX.utils.aoa_to_sheet(["SheetJS".split(""), [5,4,3,3,7,9,5]]); | ||
|  |   var wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, "Sheet1"); | ||
|  |   /* create an XLSX file and try to save to SheetJSDojo.xlsx */ | ||
|  |   // highlight-next-line | ||
|  |   XLSX.writeFile(workbook, "SheetJSDojo.xlsx"); | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Data Stores
 | ||
|  | 
 | ||
|  | `dojo/store`[^2] is the primary interface for working with structured data. | ||
|  | 
 | ||
|  | #### Importing Data
 | ||
|  | 
 | ||
|  | The SheetJS `sheet_to_json` method can generate an array of arrays that can back | ||
|  | a `dojo/store/Memory` store. | ||
|  | 
 | ||
|  | The following example fetches a test file, creates a Memory store from the data | ||
|  | in the first worksheet, and assigns to a `dijit` UI Widget: | ||
|  | 
 | ||
|  | ```html | ||
|  | <script> | ||
|  | require([ | ||
|  |   "dojo/ready", "dojo/request/xhr", "dojo/store/Memory" "dijit/registry", "xlsx" | ||
|  | ], function(ready, xhr, Memory, registry, _XLSX) { | ||
|  |   ready(function() { | ||
|  |     /* fetch test file */ | ||
|  |     xhr("https://sheetjs.com/pres.xlsx", { | ||
|  |       headers: { "X-Requested-With": null }, | ||
|  |       handleAs: "arraybuffer" | ||
|  |     }).then(function(ab) { | ||
|  |       /* parse ArrayBuffer */ | ||
|  |       var wb = XLSX.read(ab); | ||
|  |       /* get first worksheet */ | ||
|  |       var ws = wb.Sheets[wb.SheetNames[0]]; | ||
|  |       // highlight-start | ||
|  |       /* generate row objects from first worksheet */ | ||
|  |       const aoo = XLSX.utils.sheet_to_json(ws); | ||
|  | 
 | ||
|  |       /* generate memory store and assign to combo box */ | ||
|  |       var store = new Memory({ data: aoo }); | ||
|  |       // highlight-end | ||
|  |       registry.byId("widget").store = store; | ||
|  |     }); | ||
|  |   }); | ||
|  | }); | ||
|  | </script> | ||
|  | ``` | ||
|  | 
 | ||
|  | #### Exporting Data
 | ||
|  | 
 | ||
|  | Starting from a data store, query results are arrays of objects. Worksheets can | ||
|  | be created using the SheetJS `json_to_sheet` method: | ||
|  | 
 | ||
|  | ```js | ||
|  | function export_all_data_from_store(store) { | ||
|  |   require(["xlsx"], function(_XLSX) { | ||
|  |     // highlight-start | ||
|  |     /* pull all data rows from the store */ | ||
|  |     var rows = store.query(function() { return true; }); | ||
|  | 
 | ||
|  |     /* generate SheetJS worksheet */ | ||
|  |     var ws = XLSX.utils.json_to_sheet(rows); | ||
|  |     // highlight-end | ||
|  | 
 | ||
|  |     /* generate SheetJS workbook and write to XLSX */ | ||
|  |     var wb = XLSX.utils.book_new(); | ||
|  |     XLSX.utils.book_append_sheet(wb, ws, "Export"); | ||
|  |     XLSX.writeFile(wb, "SheetJSDojoExport.xlsx"); | ||
|  |   }); | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | [^1]: All Dojo Toolkit releases are available at <https://download.dojotoolkit.org/>. The mirrored `dojo.js` corresponds to the `1.17.3` uncompressed script <http://download.dojotoolkit.org/release-1.17.3/dojo.js.uncompressed.js>. | ||
|  | [^2]: See [`dojo/store`](https://dojotoolkit.org/reference-guide/dojo/store.html) in the Dojo Toolkit documentation. |