forked from sheetjs/sheetjs
		
	
		
			
				
	
	
		
			63 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Swift
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Swift
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env xcrun swift
 | 
						|
/* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */
 | 
						|
import JavaScriptCore;
 | 
						|
 | 
						|
class SheetJS {
 | 
						|
	var context: JSContext!;
 | 
						|
	var XLSX: JSValue!;
 | 
						|
 | 
						|
	enum SJSError: Error {
 | 
						|
		case badJSContext;
 | 
						|
	};
 | 
						|
 | 
						|
	func init_context() throws -> JSContext {
 | 
						|
		var context: JSContext!
 | 
						|
		do {
 | 
						|
			context = JSContext();
 | 
						|
			context.exceptionHandler = { ctx, X in if let e = X { print(e.toString()); }; }
 | 
						|
			var src = "var global = (function(){ return this; }).call(null);";
 | 
						|
			context.evaluateScript(src);
 | 
						|
			src = try String(contentsOfFile: "xlsx.swift.js");
 | 
						|
			context.evaluateScript(src);
 | 
						|
			if context != nil { return context!; }
 | 
						|
		} catch { print(error.localizedDescription); }
 | 
						|
		throw SheetJS.SJSError.badJSContext;
 | 
						|
	}
 | 
						|
 | 
						|
	func version() throws -> String {
 | 
						|
		if let version = XLSX.objectForKeyedSubscript("version") { return version.toString(); }
 | 
						|
		throw SheetJS.SJSError.badJSContext;
 | 
						|
	}
 | 
						|
 | 
						|
	func readFileToCSV(file: String) throws -> String {
 | 
						|
		let data:String! = try String(contentsOfFile: file, encoding:String.Encoding.isoLatin1);
 | 
						|
		self.context.setObject(data, forKeyedSubscript:"payload" as (NSCopying & NSObjectProtocol)!);
 | 
						|
 | 
						|
		let src = [
 | 
						|
			"var wb = XLSX.read(payload, {type:'binary'});",
 | 
						|
			"var ws = wb.Sheets[wb.SheetNames[0]];",
 | 
						|
			"var result = XLSX.utils.sheet_to_csv(ws);"
 | 
						|
		].joined(separator: "\n");
 | 
						|
		self.context.evaluateScript(src);
 | 
						|
 | 
						|
		return context.objectForKeyedSubscript("result").toString();
 | 
						|
	}
 | 
						|
 | 
						|
	init() throws {
 | 
						|
		do {
 | 
						|
			self.context = try init_context();
 | 
						|
			self.XLSX = context.objectForKeyedSubscript("XLSX");
 | 
						|
			if self.XLSX == nil {
 | 
						|
				throw SheetJS.SJSError.badJSContext;
 | 
						|
			}
 | 
						|
		} catch { print(error.localizedDescription); }
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
let sheetjs = try SheetJS();
 | 
						|
try print(sheetjs.version());
 | 
						|
try print(sheetjs.readFileToCSV(file:"sheetjs.xlsx"));
 | 
						|
try print(sheetjs.readFileToCSV(file:"sheetjs.xlsb"));
 | 
						|
try print(sheetjs.readFileToCSV(file:"sheetjs.xls"));
 | 
						|
try print(sheetjs.readFileToCSV(file:"sheetjs.xml.xls"));
 |