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. |