2023-02-14 06:54:02 +00:00
|
|
|
---
|
|
|
|
title: Go + Goja
|
2023-02-28 11:40:44 +00:00
|
|
|
pagination_prev: demos/bigdata/index
|
|
|
|
pagination_next: solutions/input
|
2023-02-14 06:54:02 +00:00
|
|
|
---
|
|
|
|
|
2023-04-27 09:12:19 +00:00
|
|
|
import current from '/version.js';
|
|
|
|
|
2023-02-14 06:54:02 +00:00
|
|
|
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>
|
2023-04-27 09:12:19 +00:00
|
|
|
<li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js`}>xlsx.full.min.js</a></li>
|
|
|
|
<li><a href={`https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js`}>shim.min.js</a></li>
|
2023-02-14 06:54:02 +00:00
|
|
|
<li><a href="https://sheetjs.com/pres.numbers">pres.numbers</a></li>
|
|
|
|
</ul>
|
|
|
|
|
2023-04-27 09:12:19 +00:00
|
|
|
<pre><code parentName="pre" {...{"className": "language-bash"}}>{`\
|
|
|
|
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js
|
|
|
|
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
|
|
|
|
curl -LO https://sheetjs.com/pres.numbers`}
|
|
|
|
</code></pre>
|
2023-02-14 06:54:02 +00:00
|
|
|
|
|
|
|
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.
|