forked from sheetjs/sheetjs
		
	
		
			
	
	
		
			71 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|  | # Internet Explorer
 | ||
|  | 
 | ||
|  | Despite the efforts to deprecate the pertinent operating systems, IE is still | ||
|  | very popular, required for various government and corporate websites throughout | ||
|  | the world.  The modern download strategies are not available in older versions | ||
|  | of IE, but there are alternative approaches. | ||
|  | 
 | ||
|  | ## Strategies
 | ||
|  | 
 | ||
|  | #### IE10 and IE11 File API
 | ||
|  | 
 | ||
|  | As part of the File API implementation, IE10 and IE11 provide the `msSaveBlob` | ||
|  | and `msSaveOrOpenBlob` functions to save blobs to the client computer.  This | ||
|  | approach is embedded in `XLSX.writeFile` and no additional shims are necessary. | ||
|  | 
 | ||
|  | #### Flash-based Download
 | ||
|  | 
 | ||
|  | It is possible to write to the file system using a SWF.  `Downloadify` library | ||
|  | implements one solution.  Since a genuine click is required, there is no way to | ||
|  | force a download.  The demo generates a button for each desired output format. | ||
|  | 
 | ||
|  | #### ActiveX-based Download
 | ||
|  | 
 | ||
|  | Through the `Scripting.FileSystemObject` object model, a script in the VBScript | ||
|  | scripting language can write to an arbitrary path on the filesystem.  The shim | ||
|  | includes a special `IE_SaveFile` function to write binary strings to file.  It | ||
|  | attempts to write to the Downloads folder or Documents folder or Desktop. | ||
|  | 
 | ||
|  | This approach can be triggered, but it requires the user to enable ActiveX.  It | ||
|  | is embedded as a strategy in `writeFile` and used only if the shim script is | ||
|  | included in the page and the relevant features are enabled on the target system. | ||
|  | 
 | ||
|  | ## Demo
 | ||
|  | 
 | ||
|  | The included demo starts from an array of arrays, generating an editable HTML | ||
|  | table with `aoa_to_sheet` and adding it to the page: | ||
|  | 
 | ||
|  | ```js | ||
|  | var ws = XLSX.utils.aoa_to_sheet(aoa); | ||
|  | var html_string = XLSX.utils.sheet_to_html(ws, { id: "table", editable: true }); | ||
|  | document.getElementById("container").innerHTML = html_string; | ||
|  | ``` | ||
|  | 
 | ||
|  | The included download buttons use `table_to_book` to construct a new workbook | ||
|  | based on the table and `writeFile` to force a download: | ||
|  | 
 | ||
|  | 
 | ||
|  | ```js | ||
|  | var elt = document.getElementById('table'); | ||
|  | var wb = XLSX.utils.table_to_book(elt, { sheet: "Sheet JS" }); | ||
|  | XLSX.writeFile(wb, filename); | ||
|  | ``` | ||
|  | 
 | ||
|  | The shim is included in the HTML page, unlocking the ActiveX pathway if enabled | ||
|  | in browser settings. | ||
|  | 
 | ||
|  | The corresponding SWF buttons are displayed in environments where Flash is | ||
|  | available and `Downloadify` is supported.  The easiest solution involves writing | ||
|  | to a Base64 string and passing to the library: | ||
|  | 
 | ||
|  | ```js | ||
|  | Downloadify.create(element_id, { | ||
|  | 	/* the demo includes the other options required by Downloadify */ | ||
|  | 	filename: "test.xlsx", | ||
|  | 	data: function() { return XLSX.write(wb, {bookType:"xlsx", type:'base64'}); }, | ||
|  | 	dataType: 'base64' | ||
|  | }); | ||
|  | ``` | ||
|  | 
 | ||
|  | [](https://github.com/SheetJS/js-xlsx) |