forked from sheetjs/sheetjs
72 lines
1.8 KiB
Go
72 lines
1.8 KiB
Go
|
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) }
|
||
|
src := string(data)
|
||
|
_, err = vm.RunString(src)
|
||
|
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) {
|
||
|
/* due to some wonkiness with array passing, use base64 */
|
||
|
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("sheetjsg." + t, buf, 0644)
|
||
|
if err != nil { panic(err) }
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
vm := goja.New()
|
||
|
|
||
|
/* initialize */
|
||
|
eval_string(vm, "if(typeof global == 'undefined') global = (function(){ return this; }).call(null);")
|
||
|
|
||
|
/* load library */
|
||
|
safe_run_file(vm, "shim.min.js")
|
||
|
safe_run_file(vm, "xlsx.core.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", data)
|
||
|
fmt.Printf("Loaded file %s\n", os.Args[1])
|
||
|
|
||
|
/* parse workbook */
|
||
|
eval_string(vm, "var bstr = ''; for(var i = 0; i < buf.length; ++i) bstr += String.fromCharCode(buf[i]);")
|
||
|
eval_string(vm, "wb = XLSX.read(bstr, {type:'binary', cellNF:true});")
|
||
|
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)
|
||
|
|
||
|
/* change cell A1 to 3 */
|
||
|
eval_string(vm, "ws['A1'].v = 3; delete ws['A1'].w;")
|
||
|
|
||
|
/* write file */
|
||
|
//write_type(vm, "xlsb")
|
||
|
//write_type(vm, "xlsx")
|
||
|
write_type(vm, "xls")
|
||
|
write_type(vm, "csv")
|
||
|
}
|