37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
|
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");
|