docs.sheetjs.com/docz/docs/03-demos/31-engines/05_goja.md
2023-02-14 01:54:02 -05:00

3.0 KiB

title pagination_prev pagination_next
Go + Goja demos/cli demos/clipboard

Goja is a pure Go implementation of ECMAScript 5.

The Standalone scripts 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:

/* 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:

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:

  /* 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:

/* read file */
data, _ := ioutil.ReadFile("sheetjs.xlsx")

[]byte should be converted to an ArrayBuffer from 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:

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

:::

  1. Create a module and install dependencies:
mkdir SheetGoja
cd SheetGoja
go mod init SheetGoja
go get github.com/dop251/goja
  1. Download the standalone script, shim and test file:
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
  1. Download SheetGoja.go:
curl -LO https://docs.sheetjs.com/goja/SheetGoja.go
  1. Build standalone SheetGoja binary:
go build SheetGoja.go
  1. Run the demo:
./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.