| 
									
										
										
										
											2023-02-14 08:22:31 +00:00
										 |  |  | --- | 
					
						
							| 
									
										
										
										
											2023-02-15 01:00:49 +00:00
										 |  |  | title: Ruby + Bindings | 
					
						
							| 
									
										
										
										
											2023-02-28 11:40:44 +00:00
										 |  |  | pagination_prev: demos/bigdata/index | 
					
						
							|  |  |  | pagination_next: solutions/input | 
					
						
							| 
									
										
										
										
											2023-02-14 08:22:31 +00:00
										 |  |  | --- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ExecJS is a Ruby abstraction over a number of JS runtimes including V8. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The [Standalone scripts](/docs/getting-started/installation/standalone) can be | 
					
						
							|  |  |  | parsed and evaluated in every supported runtime. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Integration Details
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _Load SheetJS Scripts_ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The main library can be loaded and compiled in a new context: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```rb | 
					
						
							|  |  |  | require "execjs" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | source = File.open("xlsx.full.min.js").read; | 
					
						
							|  |  |  | context = ExecJS.compile(source); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To confirm the library is loaded, `XLSX.version` can be inspected: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```rb | 
					
						
							|  |  |  | puts context.eval("XLSX.version"); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _Reading and Writing Files_ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The architecture of ExecJS forces users to combine reading and writing in one | 
					
						
							|  |  |  | function step.  Base64 strings should be used for interchange.  For example, | 
					
						
							|  |  |  | the following snippet reads data from `pres.numbers`, generates an XLSB file, | 
					
						
							|  |  |  | and writes to `sheetjsw.xlsb`: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```rb | 
					
						
							|  |  |  | require "base64" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # read and encode data to Base64
 | 
					
						
							|  |  |  | data = Base64.strict_encode64(File.open("pres.numbers").read); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # define function and call with the data
 | 
					
						
							|  |  |  | xlsb = context.call(<<EOF, data); | 
					
						
							|  |  |  | function(data) { | 
					
						
							|  |  |  |   /* parse data -- the argument is the data from Ruby code */ | 
					
						
							|  |  |  |   var wb = XLSX.read(data, {type: 'base64'}); | 
					
						
							|  |  |  |   /* write XLSB data (encoded as base64) */ | 
					
						
							|  |  |  |   return XLSX.write(wb, {bookType: "xlsb", type: "base64"}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | EOF | 
					
						
							|  |  |  | # at this point, `xlsb` is a Base64-encoded string
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # decode and write to file
 | 
					
						
							|  |  |  | File.write("sheetjsw.xlsb", Base64.strict_decode64(xlsb), mode: "wb"); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The `strict_` variants ensure that no newlines are added to the strings. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Complete Example
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | :::note | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This demo was tested on 2023 February 14. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ::: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 0) Install Ruby, `gem` (RubyGems), and the dependencies: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | gem install execjs | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 1) Download the standalone script and test file: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <ul> | 
					
						
							|  |  |  | <li><a href={`https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js`}>xlsx.full.min.js</a></li> | 
					
						
							|  |  |  | <li><a href="https://sheetjs.com/pres.numbers">pres.numbers</a></li> | 
					
						
							|  |  |  | </ul> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js | 
					
						
							|  |  |  | curl -LO https://sheetjs.com/pres.numbers | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 2) Download [`ExecSheetJS.rb`](pathname:///execjs/ExecSheetJS.rb): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | curl -LO https://docs.sheetjs.com/execjs/ExecSheetJS.rb | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 3) Run the demo: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```bash | 
					
						
							|  |  |  | ruby ExecSheetJS.rb pres.numbers | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If the program succeeded, the CSV contents will be printed to console and the | 
					
						
							|  |  |  | file `sheetjsw.xlsb` will be created.  That file can be opened with Excel. |