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"));
 |