59 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			59 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env perl
							 | 
						||
| 
								 | 
							
								# SheetJE.pl (c) SheetJS LLC -- https://sheetjs.com
							 | 
						||
| 
								 | 
							
								use JE;
							 | 
						||
| 
								 | 
							
								use File::Slurp;
							 | 
						||
| 
								 | 
							
								use MIME::Base64 qw( encode_base64 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Initialize
							 | 
						||
| 
								 | 
							
								say STDERR "Initializing Engine";
							 | 
						||
| 
								 | 
							
								my $je = new JE;
							 | 
						||
| 
								 | 
							
								$je->eval("var global = (function(){ return this; }).call(null);");
							 | 
						||
| 
								 | 
							
								$je->eval(<<'EOF');
							 | 
						||
| 
								 | 
							
								Number.prototype.charCodeAt = function(n) { return this + 48; };
							 | 
						||
| 
								 | 
							
								var string = ""; for(var i = 0; i < 256; ++i) string += String.fromCharCode(i);
							 | 
						||
| 
								 | 
							
								String.prototype.charCodeAt = function(n) {
							 | 
						||
| 
								 | 
							
								  var result = string.indexOf(this.charAt(n));
							 | 
						||
| 
								 | 
							
								  if(result == -1) throw this.charAt(n);
							 | 
						||
| 
								 | 
							
								  return result;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								String.prototype.old_match = String.prototype.match;
							 | 
						||
| 
								 | 
							
								String.prototype.match = function(p) {
							 | 
						||
| 
								 | 
							
								  var result = this.old_match(p);
							 | 
						||
| 
								 | 
							
								  return (Array.isArray(result) && result.length == 0) ? null : result;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								EOF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Load SheetJS source
							 | 
						||
| 
								 | 
							
								say STDERR "Loading SheetJS Library";
							 | 
						||
| 
								 | 
							
								my $src = read_file('xlsx.extendscript.js', { binmode => ':raw' });
							 | 
						||
| 
								 | 
							
								$src =~ s/^\xEF\xBB\xBF//;
							 | 
						||
| 
								 | 
							
								my $XLSX = $je->eval($src);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Set up conversion method
							 | 
						||
| 
								 | 
							
								$je->eval(<<'EOF');
							 | 
						||
| 
								 | 
							
								function sheetjsparse(data) { try {
							 | 
						||
| 
								 | 
							
								  return XLSX.read(String(data), {type: "base64", WTF:1});
							 | 
						||
| 
								 | 
							
								} catch(e) { return String(e); } }
							 | 
						||
| 
								 | 
							
								function sheetjscsv(wb) { try {
							 | 
						||
| 
								 | 
							
								  var ws = wb.Sheets[wb.SheetNames[0]];
							 | 
						||
| 
								 | 
							
								  return XLSX.utils.sheet_to_csv(ws);
							 | 
						||
| 
								 | 
							
								} catch(e) { return String(e); } }
							 | 
						||
| 
								 | 
							
								function sheetjswrite(wb) { try {
							 | 
						||
| 
								 | 
							
								  return XLSX.write(wb, { WTF:1, bookType: "fods", type: "string" });
							 | 
						||
| 
								 | 
							
								} catch(e) { return String(e); } }
							 | 
						||
| 
								 | 
							
								EOF
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Read file
							 | 
						||
| 
								 | 
							
								say STDERR "Parsing " . $ARGV[0];
							 | 
						||
| 
								 | 
							
								my $raw_data = encode_base64(read_file($ARGV[0], { binmode => ':raw' }), "");
							 | 
						||
| 
								 | 
							
								$workbook = $je->method(sheetjsparse => $raw_data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Convert to CSV
							 | 
						||
| 
								 | 
							
								say STDERR "Converting to CSV";
							 | 
						||
| 
								 | 
							
								my $csv_data = $je->method(sheetjscsv => $workbook);
							 | 
						||
| 
								 | 
							
								print $csv_data;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Write to SheetJE.fods
							 | 
						||
| 
								 | 
							
								say STDERR "Writing to SheetJE.fods";
							 | 
						||
| 
								 | 
							
								my $fods = $je->method(sheetjswrite => $workbook);
							 | 
						||
| 
								 | 
							
								write_file("SheetJE.fods", $fods);
							 |