forked from sheetjs/docs.sheetjs.com
		
	
		
			
	
	
		
			137 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			137 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								title: Go + Goja
							 | 
						||
| 
								 | 
							
								pagination_prev: demos/cli
							 | 
						||
| 
								 | 
							
								pagination_next: demos/clipboard
							 | 
						||
| 
								 | 
							
								---
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Goja is a pure Go implementation of ECMAScript 5.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The [Standalone scripts](/docs/getting-started/installation/standalone) can be
							 | 
						||
| 
								 | 
							
								parsed and evaluated in a Goja context.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Integration Details
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_Initialize Goja_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Goja does not provide a `global` variable. It can be created in one line:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								/* initialize */
							 | 
						||
| 
								 | 
							
								vm := goja.New()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* goja does not expose a standard "global" by default */
							 | 
						||
| 
								 | 
							
								// highlight-next-line
							 | 
						||
| 
								 | 
							
								v, err := vm.RunString("var global = (function(){ return this; }).call(null);")
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_Load SheetJS Scripts_
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The shim and main libraries can be loaded by reading the scripts from the file
							 | 
						||
| 
								 | 
							
								system and evaluating in the Goja context:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								func safe_run_file(vm *goja.Runtime, file string) {
							 | 
						||
| 
								 | 
							
								  data, err := ioutil.ReadFile(file)
							 | 
						||
| 
								 | 
							
								  if err != nil { panic(err) }
							 | 
						||
| 
								 | 
							
								  src := string(data)
							 | 
						||
| 
								 | 
							
								  _, err = vm.RunString(src)
							 | 
						||
| 
								 | 
							
								  if err != nil { panic(err) }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ...
							 | 
						||
| 
								 | 
							
								  safe_run_file(vm, "shim.min.js")
							 | 
						||
| 
								 | 
							
								  safe_run_file(vm, "xlsx.full.min.js")
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To confirm the library is loaded, `XLSX.version` can be inspected:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								  /* get version string */
							 | 
						||
| 
								 | 
							
								  v, err := vm.RunString("XLSX.version")
							 | 
						||
| 
								 | 
							
								  fmt.Printf("SheetJS library version %s\n", v)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Reading Files
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Files can be read into `[]byte`:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								/* read file */
							 | 
						||
| 
								 | 
							
								data, _ := ioutil.ReadFile("sheetjs.xlsx")
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`[]byte` should be converted to an `ArrayBuffer` from Go:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								/* load into engine */
							 | 
						||
| 
								 | 
							
								vm.Set("buf", vm.ToValue(vm.NewArrayBuffer(data)))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* parse */
							 | 
						||
| 
								 | 
							
								wb, _ = vm.RunString("wb = XLSX.read(buf, {type:'buffer'});")
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Writing Files
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								`"base64"` strings can be passed from the JS context to Go code:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```go
							 | 
						||
| 
								 | 
							
								/* write to Base64 string */
							 | 
						||
| 
								 | 
							
								b64str, _ := vm.RunString("XLSX.write(wb, {type:'base64', bookType:'xlsx'})")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* pull data back into Go and write to file */
							 | 
						||
| 
								 | 
							
								buf, _ := base64.StdEncoding.DecodeString(b64str.String())
							 | 
						||
| 
								 | 
							
								_ = ioutil.WriteFile("sheetjs.xlsx", buf, 0644)
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Complete Example
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:::note
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This demo was tested on 2023 February 14.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:::
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								0) Create a module and install dependencies:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								mkdir SheetGoja
							 | 
						||
| 
								 | 
							
								cd SheetGoja
							 | 
						||
| 
								 | 
							
								go mod init SheetGoja
							 | 
						||
| 
								 | 
							
								go get github.com/dop251/goja
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1) Download the standalone script, shim 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://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js`}>shim.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/shim.min.js
							 | 
						||
| 
								 | 
							
								curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
							 | 
						||
| 
								 | 
							
								curl -LO https://sheetjs.com/pres.numbers
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								2) Download [`SheetGoja.go`](pathname:///goja/SheetGoja.go):
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								curl -LO https://docs.sheetjs.com/goja/SheetGoja.go
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								3) Build standalone `SheetGoja` binary:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								go build SheetGoja.go
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								4) Run the demo:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```bash
							 | 
						||
| 
								 | 
							
								./SheetGoja 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.
							 |