docs.sheetjs.com/docz/static/goja/SheetGoja.go
2023-02-14 01:54:02 -05:00

61 lines
1.5 KiB
Go

/* SheetGoja (C) SheetJS LLC -- https://sheetjs.com */
package main
import (
b64 "encoding/base64"
"fmt"
"os"
"io/ioutil"
"github.com/dop251/goja"
)
func safe_run_file(vm *goja.Runtime, file string) {
data, err := ioutil.ReadFile(file)
if err != nil { panic(err) }
_, err = vm.RunString(string(data))
if err != nil { panic(err) }
}
func eval_string(vm *goja.Runtime, cmd string) goja.Value {
v, err := vm.RunString(cmd)
if err != nil { panic(err) }
return v
}
func write_type(vm *goja.Runtime, t string) {
b64str := eval_string(vm, "XLSX.write(wb, {type:'base64', bookType:'" + t + "'})")
buf, err := b64.StdEncoding.DecodeString(b64str.String());
if err != nil { panic(err) }
err = ioutil.WriteFile("sheetjsw." + t, buf, 0644)
if err != nil { panic(err) }
}
func main() {
/* initialize */
vm := goja.New()
eval_string(vm, "var global = (function(){ return this; }).call(null);")
/* load library */
safe_run_file(vm, "shim.min.js")
safe_run_file(vm, "xlsx.full.min.js")
/* get version string */
v := eval_string(vm, "XLSX.version")
fmt.Printf("SheetJS library version %s\n", v)
/* read file */
data, err := ioutil.ReadFile(os.Args[1])
if err != nil { panic(err) }
vm.Set("buf", vm.ToValue(vm.NewArrayBuffer(data)))
/* parse workbook */
eval_string(vm, "wb = XLSX.read(buf, {type:'buffer'});")
eval_string(vm, "ws = wb.Sheets[wb.SheetNames[0]]")
/* print CSV */
csv := eval_string(vm, "XLSX.utils.sheet_to_csv(ws)")
fmt.Printf("%s\n", csv)
/* write file */
write_type(vm, "xlsb")
}