Skip to main content

Go + Goja

Goja 是 ECMAScript 5 的纯 Go 实现。

¥Goja is a pure Go implementation of ECMAScript 5.

SheetJS 独立脚本 可以在 Goja 上下文中解析和评估。

¥The SheetJS Standalone scripts can be parsed and evaluated in a Goja context.

集成详情

¥Integration Details

初始化 Goja

¥Initialize Goja

Goja 不提供 global 变量。它可以在一行中创建:

¥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 */
v, err := vm.RunString("var global = (function(){ return this; }).call(null);")

加载 SheetJS 脚本

¥Load SheetJS Scripts

可以通过从文件系统读取脚本并在 Goja 上下文中进行评估来加载 shim 和主库:

¥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")

要确认库已加载,可以检查 XLSX.version

¥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

文件可以读入 []byte

¥Files can be read into []byte:

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

[]byte 应该从 Go 转换为 ArrayBuffer

¥[]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" 字符串可以从 JS 上下文传递到 Go 代码:

¥"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

测试部署

该演示在以下部署中进行了测试:

¥This demo was tested in the following deployments:

架构Git 提交去版本日期
darwin-x64e401ed41.21.72024-04-25
darwin-armccbae201.22.32024-05-23
win10-x64e401ed41.22.12024-03-24
win11-armccbae201.22.32024-05-25
linux-x64e401ed41.22.12024-03-21
linux-armccbae201.19.82024-05-25

在撰写本文时,Goja 没有正确的版本号。版本由 Git 提交哈希值标识。

¥At the time of writing, Goja did not have proper version numbers. Versions are identified by Git commit hashes.

  1. 创建模块并安装依赖:

    ¥Create a module and install dependencies:

mkdir SheetGoja
cd SheetGoja
go mod init SheetGoja
go get github.com/dop251/goja
  1. 下载 SheetJS Standalone 脚本、shim 脚本和测试文件。将所有三个文件移动到项目目录:

    ¥Download the SheetJS Standalone script, shim script and test file. Move all three files to the project directory:

curl -LO https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/shim.min.js
curl -LO https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js
curl -LO https://xlsx.nodejs.cn/pres.numbers
  1. 下载 SheetGoja.go

    ¥Download SheetGoja.go:

curl -LO https://xlsx.nodejs.cn/goja/SheetGoja.go
  1. 构建独立的 SheetGoja 二进制文件:

    ¥Build the standalone SheetGoja binary:

go build SheetGoja.go
  1. 运行演示:

    ¥Run the demo:

./SheetGoja pres.numbers

如果程序成功,CSV 内容将打印到控制台并创建文件 sheetjsw.xlsb。该文件可以用 Excel 打开。

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