from sys import stderr, argv; from base64 import b64encode, b64decode; from STPyV8 import JSContext, JSClass; # Create context with methods for file i/o class Base64Context(JSClass): def read_file(self, path): with open(path, "rb") as f: data = f.read(); return b64encode(data).decode("ascii"); def write_file(self, data, path): with open(path, "wb") as f: f.write(b64decode(data)); globals = Base64Context(); # Read xlsx.full.min.js with open("xlsx.full.min.js", "r") as f: sheetjs = f.read(); # The JSContext starts and cleans up the V8 engine with JSContext(globals) as ctxt: # Load SheetJS library and display version number ctxt.eval(sheetjs); version = ctxt.eval("XLSX.version"); print(f"SheetJS Version: {version}", file=stderr); # Parse workbook ctxt.eval(f"globalThis.wb = XLSX.read(read_file('{argv[1]}'), {{type:'base64'}}); void 0;"); # Print CSV from first worksheet csv = ctxt.eval("XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]]);"); print(csv); # Generate XLSB xlsb = ctxt.eval("XLSX.write(wb, {type: 'base64', bookType: 'xlsb'})"); globals.write_file(xlsb,"SheetJSSTPyV8.xlsb");