33 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			33 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|  | # 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)); |