forked from sheetjs/docs.sheetjs.com
		
	ruby
This commit is contained in:
		
							parent
							
								
									c2a3326377
								
							
						
					
					
						commit
						39b171c011
					
				
							
								
								
									
										100
									
								
								docz/docs/03-demos/31-engines/09_rb.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										100
									
								
								docz/docs/03-demos/31-engines/09_rb.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | ||||
| --- | ||||
| title: Ruby Bindings | ||||
| pagination_prev: demos/cli | ||||
| pagination_next: demos/clipboard | ||||
| --- | ||||
| 
 | ||||
| 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. | ||||
| @ -142,7 +142,7 @@ const config = { | ||||
|       prism: { | ||||
|         theme: lightCodeTheme, | ||||
|         darkTheme: darkCodeTheme, | ||||
|         additionalLanguages: [ "swift", "java", "csharp", "perl" ], | ||||
|         additionalLanguages: [ "swift", "java", "csharp", "perl", "ruby" ], | ||||
|       }, | ||||
|       liveCodeBlock: { | ||||
|         playgroundPosition: 'top' | ||||
|  | ||||
							
								
								
									
										24
									
								
								docz/static/execjs/ExecSheetJS.rb
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								docz/static/execjs/ExecSheetJS.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| #!/usr/bin/env ruby | ||||
| # ExecSheetJS.rb (c) SheetJS LLC -- https://sheetjs.com | ||||
| require "execjs" | ||||
| require "base64" | ||||
| 
 | ||||
| source = File.open("xlsx.full.min.js").read; | ||||
| context = ExecJS.compile(source); | ||||
| puts context.eval("XLSX.version"); | ||||
| 
 | ||||
| data = Base64.strict_encode64(File.open(ARGV[0]).read); | ||||
| result = context.call(<<EOF, data); | ||||
| function(data) { | ||||
|   var wb = XLSX.read(data, {type: 'base64'}); | ||||
|   var ws = wb.Sheets[wb.SheetNames[0]]; | ||||
|   /* to avoid re-parsing, CSV and XLSB are written in the same call */ | ||||
|   return [ | ||||
|     XLSX.utils.sheet_to_csv(ws), | ||||
|     XLSX.write(wb, {bookType: "xlsb", type: "base64"}) | ||||
|   ]; | ||||
| } | ||||
| EOF | ||||
| puts result[0]; | ||||
| xlsb = Base64.strict_decode64(result[1]); | ||||
| File.write("sheetjsw.xlsb", xlsb, mode: "wb"); | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user