| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | ## Writing Workbooks
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For writing, the first step is to generate output data.  The helper functions | 
					
						
							|  |  |  | `write` and `writeFile` will produce the data in various formats suitable for | 
					
						
							|  |  |  | dissemination.  The second step is to actual share the data with the end point. | 
					
						
							|  |  |  | Assuming `workbook` is a workbook object: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  |   <summary><b>nodejs write a file</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 20:46:32 +00:00
										 |  |  | `XLSX.writeFile` uses `fs.writeFileSync` in server environments: | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | ```js | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | if(typeof require !== 'undefined') XLSX = require('xlsx'); | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | /* output format determined by filename */ | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | XLSX.writeFile(workbook, 'out.xlsb'); | 
					
						
							|  |  |  | /* at this point, out.xlsb is a file that you can distribute */ | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-08 18:21:39 +00:00
										 |  |  | <details> | 
					
						
							|  |  |  |   <summary><b>Photoshop ExtendScript write a file</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `writeFile` wraps the `File` logic in Photoshop and other ExtendScript targets. | 
					
						
							|  |  |  | The specified path should be an absolute path: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | #include "xlsx.extendscript.js"
 | 
					
						
							|  |  |  | /* output format determined by filename */ | 
					
						
							|  |  |  | XLSX.writeFile(workbook, 'out.xlsx'); | 
					
						
							|  |  |  | /* at this point, out.xlsx is a file that you can distribute */ | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The [`extendscript` demo](demos/extendscript/) includes a more complex example. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2018-02-03 20:46:32 +00:00
										 |  |  |   <summary><b>Browser add TABLE element to page</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-09-30 06:18:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The `sheet_to_html` utility function generates HTML code that can be added to | 
					
						
							|  |  |  | any DOM element. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | var worksheet = workbook.Sheets[workbook.SheetNames[0]]; | 
					
						
							|  |  |  | var container = document.getElementById('tableau'); | 
					
						
							|  |  |  | container.innerHTML = XLSX.utils.sheet_to_html(worksheet); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | </details> | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | <details> | 
					
						
							| 
									
										
										
										
											2018-02-03 20:46:32 +00:00
										 |  |  |   <summary><b>Browser upload file (ajax)</b> (click to show)</summary> | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | A complete example using XHR is [included in the XHR demo](demos/xhr/), along | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | with examples for fetch and wrapper libraries.  This example assumes the server | 
					
						
							|  |  |  | can handle Base64-encoded files (see the demo for a basic nodejs server): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | /* in this example, send a base64 string to the server */ | 
					
						
							|  |  |  | var wopts = { bookType:'xlsx', bookSST:false, type:'base64' }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var wbout = XLSX.write(workbook,wopts); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | var req = new XMLHttpRequest(); | 
					
						
							|  |  |  | req.open("POST", "/upload", true); | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | var formdata = new FormData(); | 
					
						
							|  |  |  | formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name | 
					
						
							|  |  |  | formdata.append('data', wbout); // <-- `data` holds the base64-encoded data | 
					
						
							| 
									
										
										
										
											2017-09-24 23:40:09 +00:00
										 |  |  | req.send(formdata); | 
					
						
							| 
									
										
										
										
											2017-09-05 05:26:50 +00:00
										 |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-03 20:46:32 +00:00
										 |  |  | <details> | 
					
						
							|  |  |  |   <summary><b>Browser save file</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.writeFile` wraps a few techniques for triggering a file save: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - `URL` browser API creates an object URL for the file, which the library uses | 
					
						
							|  |  |  |   by creating a link and forcing a click. It is supported in modern browsers. | 
					
						
							|  |  |  | - `msSaveBlob` is an IE10+ API for triggering a file save. | 
					
						
							|  |  |  | - `IE_FileSave` uses VBScript and ActiveX to write a file in IE6+ for Windows | 
					
						
							|  |  |  |   XP and Windows 7.  The shim must be included in the containing HTML page. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | There is no standard way to determine if the actual file has been downloaded. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | /* output format determined by filename */ | 
					
						
							|  |  |  | XLSX.writeFile(workbook, 'out.xlsb'); | 
					
						
							|  |  |  | /* at this point, out.xlsb will have been downloaded */ | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <details> | 
					
						
							|  |  |  |   <summary><b>Browser save file (compatibility)</b> (click to show)</summary> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `XLSX.writeFile` techniques work for most modern browsers as well as older IE. | 
					
						
							|  |  |  | For much older browsers, there are workarounds implemented by wrapper libraries. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [`FileSaver.js`](https://github.com/eligrey/FileSaver.js/) implements `saveAs`. | 
					
						
							|  |  |  | Note: `XLSX.writeFile` will automatically call `saveAs` if available. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | /* bookType can be any supported output type */ | 
					
						
							|  |  |  | var wopts = { bookType:'xlsx', bookSST:false, type:'array' }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var wbout = XLSX.write(workbook,wopts); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* the saveAs call downloads a file on the local machine */ | 
					
						
							|  |  |  | saveAs(new Blob([wbout],{type:"application/octet-stream"}), "test.xlsx"); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [`Downloadify`](https://github.com/dcneiner/downloadify) uses a Flash SWF button | 
					
						
							|  |  |  | to generate local files, suitable for environments where ActiveX is unavailable: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```js | 
					
						
							|  |  |  | Downloadify.create(id,{ | 
					
						
							|  |  |  | 	/* other options are required! read the downloadify docs for more info */ | 
					
						
							|  |  |  | 	filename: "test.xlsx", | 
					
						
							|  |  |  | 	data: function() { return XLSX.write(wb, {bookType:"xlsx", type:'base64'}); }, | 
					
						
							|  |  |  | 	append: false, | 
					
						
							|  |  |  | 	dataType: 'base64' | 
					
						
							|  |  |  | }); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The [`oldie` demo](demos/oldie/) shows an IE-compatible fallback scenario. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </details> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The [included demos](demos/) cover mobile apps and other special deployments. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 22:27:54 +00:00
										 |  |  | ### Writing Examples
 | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | - <http://sheetjs.com/demos/table.html> exporting an HTML table | 
					
						
							| 
									
										
										
										
											2017-04-30 20:37:53 +00:00
										 |  |  | - <http://sheetjs.com/demos/writexlsx.html> generates a simple file | 
					
						
							| 
									
										
										
										
											2017-03-20 09:02:25 +00:00
										 |  |  | 
 |