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