# usage: perl SheetJSDuk.pl path/to/file use JavaScript::Duktape::XS; use File::Slurp; use MIME::Base64 qw( encode_base64 decode_base64 ); # Initialize my $js = JavaScript::Duktape::XS->new({ max_memory_bytes => 256 * 1024 * 1024 }); $js->eval("var global = (function(){ return this; }).call(null);"); # Load the ExtendScript build my $src = read_file('xlsx.extendscript.js', { binmode => ':raw' }); $src =~ s/^\xEF\xBB\xBF//; my $XLSX = $js->eval($src); # Print version number $js->set('log' => sub { print $_[0], "\n"; }); $js->eval("log('SheetJS library version ' + XLSX.version);"); # Parse File my $raw_data = encode_base64(read_file($ARGV[0], { binmode => ':raw' }), ""); $js->set("b64", $raw_data); $js->eval(qq{ global.wb = XLSX.read(b64, {type: "base64", WTF:1}); global.ws = wb.Sheets[wb.SheetNames[0]]; void 0; }); # Print first worksheet CSV $js->eval('log(XLSX.utils.sheet_to_csv(global.ws))'); # Write XLSB file my $xlsb = $js->eval("XLSX.write(global.wb, {type:'base64', bookType:'xlsb'})"); write_file("SheetJSDuk.xlsb", decode_base64($xlsb));