forked from sheetjs/sheetjs
		
	Math.LOG2E precision issue + new demos [ci skip]
- swift + jsc - java + rhino - XMLHttpRequest and friends
This commit is contained in:
		
							parent
							
								
									e34b6e78d2
								
							
						
					
					
						commit
						ad47cb433c
					
				| @ -4,7 +4,7 @@ This log is intended to keep track of backwards-incompatible changes, including | ||||
| but not limited to API changes and file location changes.  Minor behavioral | ||||
| changes may not be included if they are not expected to break existing code. | ||||
| 
 | ||||
| ## Unreleased (2017-08-??) | ||||
| ## 0.11.3 (2017-08-19) | ||||
| 
 | ||||
| * XLS cell ixfe/XF removed | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										32
									
								
								README.md
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										32
									
								
								README.md
									
									
									
									
									
								
							| @ -167,24 +167,25 @@ CDNjs automatically pulls the latest version and makes all versions available at | ||||
| 
 | ||||
| The `demos` directory includes sample projects for: | ||||
| 
 | ||||
| **Frameworks** | ||||
| **JS Frameworks and APIs** | ||||
| - [`angular 1.x`](demos/angular/) | ||||
| - [`angular 2.x / 4.x`](demos/angular2/) | ||||
| - [`meteor`](demos/meteor/) | ||||
| - [`vue 2`](demos/vue/) | ||||
| - [`vue 2.x`](demos/vue/) | ||||
| - [`XMLHttpRequest and fetch`](demos/xhr/) | ||||
| 
 | ||||
| **JS Bundlers and Tooling** | ||||
| - [`browserify`](demos/browserify/) | ||||
| - [`requirejs`](demos/requirejs/) | ||||
| - [`rollup`](demos/rollup/) | ||||
| - [`systemjs`](demos/systemjs/) | ||||
| - [`webpack`](demos/webpack/) | ||||
| - [`webpack 2.x`](demos/webpack/) | ||||
| 
 | ||||
| **JS Platforms and Integrations** | ||||
| - [`Adobe ExtendScript`](demos/extendscript/) | ||||
| - [`Headless Browsers`](demos/headless/) | ||||
| - [`canvas-datagrid`](demos/datagrid/) | ||||
| - [`Other JS engines`](demos/altjs/) | ||||
| - [`Swift JSC and other engines`](demos/altjs/) | ||||
| 
 | ||||
| ### Optional Modules | ||||
| 
 | ||||
| @ -616,6 +617,29 @@ saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), "test.xlsx"); | ||||
| ``` | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
| 	<summary><b>Browser upload to server</b> (click to show)</summary> | ||||
| 
 | ||||
| A complete example using XHR is [included in the xhr demo](demos/xhr/), along | ||||
| with examples for fetch and wrapper libraries.  This example assumes the server | ||||
| can handle Base64-encoded files (see the demo for a basic nodejs server): | ||||
| 
 | ||||
| ```js | ||||
| /* in this example, send a base64 string to the server */ | ||||
| var wopts = { bookType:'xlsx', bookSST:false, type:'base64' }; | ||||
| 
 | ||||
| var wbout = XLSX.write(workbook,wopts); | ||||
| 
 | ||||
| var oReq = new XMLHttpRequest(); | ||||
| oReq.open("POST", "/upload", true); | ||||
| var formdata = new FormData(); | ||||
| formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name | ||||
| formdata.append('data', wbout); // <-- `data` holds the base64-encoded data | ||||
| oReq.send(formdata); | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ### Writing Examples | ||||
| 
 | ||||
| - <http://sheetjs.com/demos/table.html> exporting an HTML table | ||||
|  | ||||
| @ -14,8 +14,8 @@ function write_double_le(b, v/*:number*/, idx/*:number*/) { | ||||
| 	var av = bs ? -v : v; | ||||
| 	if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; } | ||||
| 	else { | ||||
| 		e = Math.floor(Math.log(av) * Math.LOG2E); | ||||
| 		m = v * Math.pow(2, 52 - e); | ||||
| 		e = Math.floor(Math.log(av) / Math.LN2); | ||||
| 		m = av * Math.pow(2, 52 - e); | ||||
| 		if(e <= -1023 && (!isFinite(m) || m < Math.pow(2,52))) { e = -1022; } | ||||
| 		else { m -= Math.pow(2,52); e+=1023; } | ||||
| 	} | ||||
|  | ||||
							
								
								
									
										4
									
								
								demos/altjs/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										4
									
								
								demos/altjs/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,6 @@ | ||||
| jvm-npm.js | ||||
| sheetjs.* | ||||
| *.class | ||||
| *.jar | ||||
| rhino | ||||
| xlsx.swift.js | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| .PHONY: all | ||||
| all: duktape nashorn | ||||
| all: duktape nashorn rhinojs swift | ||||
| 
 | ||||
| .PHONY: base | ||||
| base: | ||||
| @ -13,3 +13,32 @@ duktape: base ## duktape / skookum demo | ||||
| nashorn: base ## nashorn demo
 | ||||
| 	if [ ! -e jvm-npm.js ]; then curl -O https://rawgit.com/nodyn/jvm-npm/master/src/main/javascript/jvm-npm.js; fi | ||||
| 	jjs nashorn.js | ||||
| 
 | ||||
| .PHONY: swift | ||||
| swift: base ## swift demo
 | ||||
| 	if [ ! -e xlsx.swift.js ]; then cp ../../dist/xlsx.full.min.js xlsx.swift.js; fi | ||||
| 	./SheetJSCore.swift | ||||
| 
 | ||||
| .PHONY: rhinojs ## rhino demo
 | ||||
| rhinojs: base SheetJSRhino.class | ||||
| 	java -cp .:SheetJS.jar:rhino.jar SheetJSRhino sheetjs.xlsx | ||||
| 	java -cp .:SheetJS.jar:rhino.jar SheetJSRhino sheetjs.xlsb | ||||
| 	java -cp .:SheetJS.jar:rhino.jar SheetJSRhino sheetjs.xls | ||||
| 	java -cp .:SheetJS.jar:rhino.jar SheetJSRhino sheetjs.xml.xls | ||||
| 
 | ||||
| RHDEPS=$(filter-out SheetJSRhino.class,$(patsubst %.java,%.class,$(wildcard com/sheetjs/*.java))) | ||||
| $(RHDEPS): %.class: %.java rhino.jar | ||||
| 	javac -cp .:SheetJS.jar:rhino.jar $*.java | ||||
| 
 | ||||
| SheetJSRhino.class: $(RHDEPS) | ||||
| 	jar -cf SheetJS.jar $^ ../../dist/xlsx.full.min.js | ||||
| 	javac -cp .:SheetJS.jar:rhino.jar SheetJSRhino.java | ||||
| 
 | ||||
| rhino.jar: | ||||
| 	if [ ! -e rhino ]; then git clone https://github.com/mozilla/rhino; fi | ||||
| 	if [ ! -e rhino/build/rhino*/js.jar ]; then cd rhino; ant jar; fi | ||||
| 	cp rhino/build/rhino*/js.jar rhino.jar | ||||
| 
 | ||||
| .PHONY: clean | ||||
| clean: | ||||
| 	rm SheetJS.jar *.class com/sheetjs/*.class | ||||
|  | ||||
| @ -6,6 +6,21 @@ optimize for low overhead and others optimize for ease of embedding within other | ||||
| applications.  Since it was designed for ES3 engines, the library can be used in | ||||
| those settings!  This demo tries to demonstrate a few alternative deployments. | ||||
| 
 | ||||
| Some engines provide no default global object.  To create a global reference: | ||||
| 
 | ||||
| ```js | ||||
| var global = (function(){ return this; }).call(null); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## Swift + JavaScriptCore | ||||
| 
 | ||||
| iOS and OSX ship with the JavaScriptCore framework, enabling easy JS access from | ||||
| Swift and Objective-C.  Hybrid function invocation is tricky, but explicit data | ||||
| passing is straightforward. | ||||
| 
 | ||||
| Binary strings can be passed back and forth using `String.Encoding.ascii`. | ||||
| 
 | ||||
| 
 | ||||
| ## Nashorn | ||||
| 
 | ||||
| @ -21,6 +36,20 @@ a byte array.  To use in `XLSX.read`, the demo copies the bytes into a plain JS | ||||
| array and calls `XLSX.read` with type `"array"`. | ||||
| 
 | ||||
| 
 | ||||
| ## Rhino | ||||
| 
 | ||||
| [Rhino](http://www.mozilla.org/rhino) is an ES3+ engine written in Java.  The | ||||
| `SheetJSRhino` class and `com.sheetjs` package show a complete JAR deployment, | ||||
| including the full XLSX source. | ||||
| 
 | ||||
| Due to code generation errors, optimization must be disabled: | ||||
| 
 | ||||
| ```java | ||||
| Context context = Context.enter(); | ||||
| context.setOptimizationLevel(-1); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## duktape and skookum | ||||
| 
 | ||||
| [Duktape](http://duktape.org/) is an embeddable JS engine written in C.  The | ||||
|  | ||||
							
								
								
									
										62
									
								
								demos/altjs/SheetJSCore.swift
									
									
									
									
									
										Executable file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										62
									
								
								demos/altjs/SheetJSCore.swift
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,62 @@ | ||||
| #!/usr/bin/env xcrun swift | ||||
| 
 | ||||
| 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.ascii); | ||||
| 		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")); | ||||
							
								
								
									
										31
									
								
								demos/altjs/SheetJSRhino.java
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										31
									
								
								demos/altjs/SheetJSRhino.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| import com.sheetjs.SheetJS; | ||||
| import com.sheetjs.SheetJSFile; | ||||
| import com.sheetjs.SheetJSSheet; | ||||
| 
 | ||||
| public class SheetJSRhino { | ||||
| 	public static void main(String args[]) throws Exception { | ||||
| 		try { | ||||
| 			SheetJS sjs = new SheetJS(); | ||||
| 
 | ||||
| 			/* open file */ | ||||
| 			SheetJSFile xl = sjs.read_file(args[0]); | ||||
| 
 | ||||
| 			/* get sheetnames */ | ||||
| 			String[] sheetnames = xl.get_sheet_names(); | ||||
| 			System.err.println(sheetnames[0]); | ||||
| 
 | ||||
| 			/* convert to CSV */ | ||||
| 			SheetJSSheet sheet = xl.get_sheet(0); | ||||
| 			String csv = sheet.get_csv(); | ||||
| 
 | ||||
| 			System.out.println(csv); | ||||
| 
 | ||||
| 		} catch(Exception e) { | ||||
| 			throw e; | ||||
| 		} finally { | ||||
| 			SheetJS.close(); | ||||
| 		} | ||||
| 	}	 | ||||
| } | ||||
							
								
								
									
										51
									
								
								demos/altjs/com/sheetjs/JSHelper.java
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										51
									
								
								demos/altjs/com/sheetjs/JSHelper.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| package com.sheetjs; | ||||
| 
 | ||||
| import java.lang.Integer; | ||||
| import java.lang.StringBuilder; | ||||
| import java.io.IOException; | ||||
| import java.nio.file.Files; | ||||
| import java.nio.file.Paths; | ||||
| import org.mozilla.javascript.Context; | ||||
| import org.mozilla.javascript.NativeArray; | ||||
| import org.mozilla.javascript.NativeObject; | ||||
| import org.mozilla.javascript.Scriptable; | ||||
| 
 | ||||
| public class JSHelper { | ||||
| 	static String read_file(String file) throws IOException { | ||||
| 		byte[] b = Files.readAllBytes(Paths.get(file)); | ||||
| 		System.out.println(b.length); | ||||
| 		StringBuilder sb = new StringBuilder(); | ||||
| 		for(int i = 0; i < b.length; ++i) sb.append(Character.toString((char)b[i])); | ||||
| 		return sb.toString(); | ||||
| 	} | ||||
| 
 | ||||
| 	static Object get_object(String path, Object base) throws ObjectNotFoundException { | ||||
| 		int idx = path.indexOf("."); | ||||
| 		Scriptable b = (Scriptable)base; | ||||
| 		if(idx == -1) return b.get(path, b); | ||||
| 		Object o = b.get(path.substring(0,idx), b); | ||||
| 		if(o == Scriptable.NOT_FOUND) throw new ObjectNotFoundException("not found: |" + path.substring(0,idx) + "|" + Integer.toString(idx)); | ||||
| 		return get_object(path.substring(idx+1), (NativeObject)o); | ||||
| 	} | ||||
| 
 | ||||
| 	static Object[] get_array(String path, Object base) throws ObjectNotFoundException { | ||||
| 		NativeArray arr = (NativeArray)get_object(path, base); | ||||
| 		Object[] out = new Object[(int)arr.getLength()]; | ||||
| 		int idx; | ||||
| 		for(Object o : arr.getIds()) out[idx = (Integer)o] = arr.get(idx, arr);  | ||||
| 		return out; | ||||
| 	} | ||||
| 
 | ||||
| 	static String[] get_string_array(String path, Object base) throws ObjectNotFoundException { | ||||
| 		NativeArray arr = (NativeArray)get_object(path, base); | ||||
| 		String[] out = new String[(int)arr.getLength()]; | ||||
| 		int idx; | ||||
| 		for(Object o : arr.getIds()) out[idx = (Integer)o] = arr.get(idx, arr).toString();  | ||||
| 		return out; | ||||
| 	} | ||||
| 	 | ||||
| 	public static void close() { Context.exit(); } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										10
									
								
								demos/altjs/com/sheetjs/ObjectNotFoundException.java
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								demos/altjs/com/sheetjs/ObjectNotFoundException.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| package com.sheetjs; | ||||
| 
 | ||||
| import java.lang.Exception; | ||||
| 
 | ||||
| public class ObjectNotFoundException extends Exception { | ||||
| 	public ObjectNotFoundException() {} | ||||
| 	public ObjectNotFoundException(String message) { super(message); } | ||||
| } | ||||
							
								
								
									
										58
									
								
								demos/altjs/com/sheetjs/SheetJS.java
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										58
									
								
								demos/altjs/com/sheetjs/SheetJS.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| package com.sheetjs; | ||||
| 
 | ||||
| import java.lang.Integer; | ||||
| import java.util.Scanner; | ||||
| import java.io.IOException; | ||||
| import java.io.File; | ||||
| import org.mozilla.javascript.Context; | ||||
| import org.mozilla.javascript.Function; | ||||
| import org.mozilla.javascript.NativeObject; | ||||
| import org.mozilla.javascript.Scriptable; | ||||
| 
 | ||||
| public class SheetJS { | ||||
| 	public Scriptable scope; | ||||
| 	public Context cx; | ||||
| 	public NativeObject nXLSX; | ||||
| 
 | ||||
| 	public SheetJS() throws Exception { | ||||
| 		this.cx = Context.enter(); | ||||
| 		this.scope = this.cx.initStandardObjects(); | ||||
| 
 | ||||
| 		/* boilerplate */ | ||||
| 		cx.setOptimizationLevel(-1); | ||||
| 		String s = "var global = (function(){ return this; }).call(null);"; | ||||
| 		cx.evaluateString(scope, s, "<cmd>", 1, null); | ||||
| 
 | ||||
| 		/* eval library */ | ||||
| 		s = new Scanner(SheetJS.class.getResourceAsStream("/dist/xlsx.full.min.js")).useDelimiter("\\Z").next(); | ||||
| 		//s = new Scanner(new File("xlsx.full.min.js")).useDelimiter("\\Z").next(); | ||||
| 		cx.evaluateString(scope, s, "<cmd>", 1, null); | ||||
| 
 | ||||
| 		/* grab XLSX variable */ | ||||
| 		Object XLSX = scope.get("XLSX", scope); | ||||
| 		if(XLSX == Scriptable.NOT_FOUND) throw new Exception("XLSX not found"); | ||||
| 		this.nXLSX = (NativeObject)XLSX; | ||||
| 	} | ||||
| 
 | ||||
| 	public SheetJSFile read_file(String filename) throws IOException, ObjectNotFoundException { | ||||
| 		/* open file */ | ||||
| 		String d = JSHelper.read_file(filename); | ||||
| 
 | ||||
| 		/* options argument */ | ||||
| 		NativeObject q = (NativeObject)this.cx.evaluateString(this.scope, "q = {'type':'binary'};", "<cmd>", 2, null); | ||||
| 
 | ||||
| 		/* set up function arguments */ | ||||
| 		Object functionArgs[] = {d, q}; | ||||
| 
 | ||||
| 		/* call read -> wb workbook */ | ||||
| 		Function readfunc = (Function)JSHelper.get_object("XLSX.read",this.scope); | ||||
| 		NativeObject wb = (NativeObject)readfunc.call(this.cx, this.scope, this.nXLSX, functionArgs); | ||||
| 
 | ||||
| 		return new SheetJSFile(wb, this); | ||||
| 	} | ||||
| 
 | ||||
| 	public static void close() { JSHelper.close(); } | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										24
									
								
								demos/altjs/com/sheetjs/SheetJSFile.java
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								demos/altjs/com/sheetjs/SheetJSFile.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| package com.sheetjs; | ||||
| 
 | ||||
| import org.mozilla.javascript.NativeObject; | ||||
| import org.mozilla.javascript.Function; | ||||
| 
 | ||||
| public class SheetJSFile { | ||||
| 	public NativeObject wb; | ||||
| 	public SheetJS sheetjs; | ||||
| 	public SheetJSFile() {} | ||||
| 	public SheetJSFile(NativeObject wb, SheetJS sheetjs) { this.wb = wb; this.sheetjs = sheetjs; } | ||||
| 	public String[] get_sheet_names() { | ||||
| 		try { | ||||
| 			return JSHelper.get_string_array("SheetNames", this.wb); | ||||
| 		} catch(ObjectNotFoundException e) { | ||||
| 			return null; | ||||
| 		} | ||||
| 	} | ||||
| 	public SheetJSSheet get_sheet(int idx) throws ObjectNotFoundException { | ||||
| 		return new SheetJSSheet(this, idx); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										29
									
								
								demos/altjs/com/sheetjs/SheetJSSheet.java
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										29
									
								
								demos/altjs/com/sheetjs/SheetJSSheet.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* vim: set ts=2: */ | ||||
| package com.sheetjs; | ||||
| 
 | ||||
| import org.mozilla.javascript.Function; | ||||
| import org.mozilla.javascript.NativeObject; | ||||
| 
 | ||||
| public class SheetJSSheet { | ||||
| 	public NativeObject ws; | ||||
| 	public SheetJSFile wb; | ||||
| 	public SheetJSSheet(SheetJSFile wb, int idx) throws ObjectNotFoundException { | ||||
| 		this.wb = wb; | ||||
| 		this.ws = (NativeObject)JSHelper.get_object("Sheets." + wb.get_sheet_names()[idx],wb.wb); | ||||
| 	} | ||||
| 	public String get_range() throws ObjectNotFoundException { | ||||
| 		return JSHelper.get_object("!ref",this.ws).toString(); | ||||
| 	} | ||||
| 	public String get_string_value(String address) throws ObjectNotFoundException { | ||||
| 		return JSHelper.get_object(address + ".v",this.ws).toString(); | ||||
| 	} | ||||
| 
 | ||||
| 	public String get_csv() throws ObjectNotFoundException { | ||||
| 		Function csvify = (Function)JSHelper.get_object("XLSX.utils.sheet_to_csv",this.wb.sheetjs.scope); | ||||
| 		Object csvArgs[] = {this.ws}; | ||||
| 		Object csv = csvify.call(this.wb.sheetjs.cx, this.wb.sheetjs.scope, this.wb.sheetjs.scope, csvArgs); | ||||
| 		return csv.toString(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -1,4 +1,5 @@ | ||||
| #!/usr/bin/env jjs
 | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* read file */ | ||||
| var path = java.nio.file.Paths.get('sheetjs.xlsx'); | ||||
| var fileArray = java.nio.file.Files.readAllBytes(path); | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| #!/usr/bin/env sjs
 | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| 
 | ||||
| var XLSX = require('../../xlsx.js'); | ||||
| 
 | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('../../'); // test against development version
 | ||||
| //var XLSX = require('xlsx'); // use in production
 | ||||
| module.exports = XLSX; | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var fs = require('fs'); | ||||
| var xlsx = require('../../xlsx'); | ||||
| var page = require('webpage').create(); | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| const puppeteer = require('puppeteer'); | ||||
| 
 | ||||
| (async () => { | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var fs = require('fs'); | ||||
| var xlsx = require('../../dist/xlsx.full.min'); | ||||
| var page = require('webpage').create(); | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| import { Template } from 'meteor/templating'; | ||||
| import { ReactiveVar } from 'meteor/reactive-var'; | ||||
| 
 | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| import { Meteor } from 'meteor/meteor'; | ||||
| 
 | ||||
| const XLSX = require('xlsx'); | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| ({ | ||||
| 	baseUrl: ".", | ||||
| 	name: "requirejs", | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| require(["xlsx.full.min"], function(_XLSX) { | ||||
| var X = XLSX; | ||||
| 
 | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /*jshint browser:true */ | ||||
| /*global XLSX */ | ||||
| var X = XLSX; | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX_1 = require('../../xlsx.js'); | ||||
| var XLSX_2 = require('../../dist/xlsx.core.min.js'); | ||||
| var XLSX_3 = require('../../dist/xlsx.full.min.js'); | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('xlsx'); | ||||
| console.log(XLSX); | ||||
| var w = XLSX.read('abc,def\nghi,jkl', {type:'binary'}); | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var SystemJS = require('systemjs'); | ||||
| SystemJS.config({ | ||||
| 	meta: { | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| var SheetJSFT = [ | ||||
| 	"xlsx", "xlsb", "xlsm", "xls", "xml", "csv", "txt", "ods", "fods", "uos", "sylk", "dif", "dbf", "prn", "qpw", "123", "wb*", "wq*", "html", "htm" | ||||
| ].map(function(x) { return "." + x; }).join(","); | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /*jshint browser:true */ | ||||
| /*global XLSX */ | ||||
| var X = XLSX; | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('./xlsx.core.min'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('./xlsx.full.min'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('../../'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| module.exports = { | ||||
| 	output: { | ||||
| 		libraryTarget: 'var', | ||||
|  | ||||
							
								
								
									
										7
									
								
								demos/xhr/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										7
									
								
								demos/xhr/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| .PHONY: serve | ||||
| serve: | ||||
| 	npm start | ||||
| 
 | ||||
| .PHONY: init | ||||
| init: | ||||
| 	if [ ! -e sheetjs.xlsx ]; then ln -s ../../sheetjs.xlsx; fi | ||||
							
								
								
									
										34
									
								
								demos/xhr/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										34
									
								
								demos/xhr/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| # XMLHttpRequest and Friends | ||||
| 
 | ||||
| `XMLHttpRequest` and `fetch` browser APIs enable binary data transfer between | ||||
| web browser clients and web servers.  Since this library works in web browsers, | ||||
| server conversion work can be offloaded to the client!  This demo shows a few | ||||
| common scenarios involving browser APIs and popular wrapper libraries. | ||||
| 
 | ||||
| ## Sample Server | ||||
| 
 | ||||
| The `server.js` nodejs server serves static files on `GET` request.  On a `POST` | ||||
| request to `/upload`, the server processes the body and looks for the `file` and | ||||
| `data` fields.  It will write the Base64-decoded data from `data` to the file | ||||
| name specified in `file`. | ||||
| 
 | ||||
| To start the demo, run `npm start` and navigate to <http://localhost:7262/> | ||||
| 
 | ||||
| ## XMLHttpRequest (xhr.html) | ||||
| 
 | ||||
| For downloading data, the `arraybuffer` response type generates an `ArrayBuffer` | ||||
| that can be viewed as an `Uint8Array` and fed to `XLSX.read` using `array` type. | ||||
| 
 | ||||
| For uploading data, this demo populates a `FormData` object with string data | ||||
| generated with the `base64` output type. | ||||
| 
 | ||||
| ## axios (axios.html) and superagent (superagent.html) | ||||
| 
 | ||||
| The codes are structurally similar to the XMLHttpRequest example.  `axios` uses | ||||
| a Promise-based API while `superagent` opts for a more traditional chain. | ||||
| 
 | ||||
| ## fetch (fetch.html) | ||||
| 
 | ||||
| For downloading data, `response.blob()` resolves to a `Blob` object that can be | ||||
| converted to `ArrayBuffer` using a `FileReader`. | ||||
| 
 | ||||
							
								
								
									
										67
									
								
								demos/xhr/axios.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										67
									
								
								demos/xhr/axios.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,67 @@ | ||||
| <!DOCTYPE html> | ||||
| <!-- xlsx.js (C) 2013-present  SheetJS http://sheetjs.com --> | ||||
| <!-- vim: set ts=2: --> | ||||
| <html> | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| <title>SheetJS Live Demo</title> | ||||
| <style> | ||||
| a { text-decoration: none } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b> | ||||
| 
 | ||||
| <a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a> | ||||
| <a href="https://github.com/SheetJS/js-xlsx/issues">Issues?  Something look weird?  Click here and report an issue</a> | ||||
| <br/><div id="fileurl"></div> | ||||
| </pre> | ||||
| <div id="htmlout"></div> | ||||
| <br /> | ||||
| <button id="ulbutton">Click here to upload the modified table</button> | ||||
| <pre> | ||||
| <div id="outfile"></div> | ||||
| </pre> | ||||
| <script src="xlsx.full.min.js"></script> | ||||
| <script src="https://unpkg.com/axios/dist/axios.min.js"></script> | ||||
| <script> | ||||
| var demo = 'axios', book = 'xlsx'; | ||||
| 
 | ||||
| function process_wb(wb) { | ||||
| 	console.log(wb); | ||||
| 	htmlout.innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]], {editable:true}).replace("<table", '<table id="table" border="1"'); | ||||
| } | ||||
| 
 | ||||
| var url = "sheetjs.xlsx"; | ||||
| document.getElementById('fileurl').innerHTML = '<a href="' + url + '">Download original file</a>'; | ||||
| document.getElementById('outfile').innerHTML = '<a href="' + demo + '.' + book + '">Download new file</a>'; | ||||
| 
 | ||||
| axios(url, {responseType:'arraybuffer'}).then(function(res) { | ||||
| 		var data = new Uint8Array(res.data); | ||||
| 		var wb = XLSX.read(data, {type:"array"}); | ||||
| 		process_wb(wb); | ||||
| }); | ||||
| 
 | ||||
| document.getElementById('ulbutton').onclick = function() { | ||||
| 	var wb = XLSX.utils.table_to_book(document.getElementById('htmlout')); | ||||
| 	console.log(wb); | ||||
| 	var formdata = new FormData(); | ||||
| 	formdata.append('file', demo + '.' + book); | ||||
| 	formdata.append('data', XLSX.write(wb, {bookType:book, type:'base64'})); | ||||
| 	axios("/upload", {method: "POST", data: formdata}); | ||||
| }; | ||||
| </script> | ||||
| <script type="text/javascript"> | ||||
| 	var _gaq = _gaq || []; | ||||
| 	_gaq.push(['_setAccount', 'UA-36810333-1']); | ||||
| 	_gaq.push(['_trackPageview']); | ||||
| 
 | ||||
| 	(function() { | ||||
| 		var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||||
| 		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||||
| 		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||||
| 	})(); | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										76
									
								
								demos/xhr/fetch.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										76
									
								
								demos/xhr/fetch.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| <!DOCTYPE html> | ||||
| <!-- xlsx.js (C) 2013-present  SheetJS http://sheetjs.com --> | ||||
| <!-- vim: set ts=2: --> | ||||
| <html> | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| <title>SheetJS Live Demo</title> | ||||
| <style> | ||||
| a { text-decoration: none } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b> | ||||
| 
 | ||||
| <a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a> | ||||
| <a href="https://github.com/SheetJS/js-xlsx/issues">Issues?  Something look weird?  Click here and report an issue</a> | ||||
| <br/><div id="fileurl"></div> | ||||
| </pre> | ||||
| <div id="htmlout"></div> | ||||
| <br /> | ||||
| <button id="ulbutton">Click here to upload the modified table</button> | ||||
| <pre> | ||||
| <div id="outfile"></div> | ||||
| </pre> | ||||
| <script src="xlsx.full.min.js"></script> | ||||
| <script> | ||||
| var demo = 'fetch', book = 'xlsx'; | ||||
| 
 | ||||
| if(!window.fetch) | ||||
| 	throw new Error("This demo is not supported in your browser"); | ||||
| 
 | ||||
| function process_wb(wb) { | ||||
| 	console.log(wb); | ||||
| 	htmlout.innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]], {editable:true}).replace("<table", '<table id="table" border="1"'); | ||||
| } | ||||
| 
 | ||||
| var url = "sheetjs.xlsx"; | ||||
| document.getElementById('fileurl').innerHTML = '<a href="' + url + '">Download original file</a>'; | ||||
| document.getElementById('outfile').innerHTML = '<a href="' + demo + '.' + book + '">Download new file</a>'; | ||||
| 
 | ||||
| fetch(url).then(function(res) { | ||||
| 	if(!res.ok) throw new Error("fetch failed"); | ||||
| 	return res.blob(); | ||||
| }).then(function(blob) { | ||||
| 	var reader = new FileReader(); | ||||
| 	reader.addEventListener("loadend", function() { | ||||
| 		var data = new Uint8Array(this.result); | ||||
| 		var wb = XLSX.read(data, {type:"array"}); | ||||
| 		process_wb(wb); | ||||
| 	}); | ||||
| 	reader.readAsArrayBuffer(blob); | ||||
| }); | ||||
| 
 | ||||
| document.getElementById('ulbutton').onclick = function() { | ||||
| 	var wb = XLSX.utils.table_to_book(document.getElementById('htmlout')); | ||||
| 	console.log(wb); | ||||
| 	var formdata = new FormData(); | ||||
| 	formdata.append('file', demo + '.' + book); | ||||
| 	formdata.append('data', XLSX.write(wb, {bookType:book, type:'base64'})); | ||||
| 	fetch("/upload", {method: "POST", body: formdata}).then(function(r) { return r.text(); }).then(function(t) { console.log(t); });  | ||||
| }; | ||||
| </script> | ||||
| <script type="text/javascript"> | ||||
| 	var _gaq = _gaq || []; | ||||
| 	_gaq.push(['_setAccount', 'UA-36810333-1']); | ||||
| 	_gaq.push(['_trackPageview']); | ||||
| 
 | ||||
| 	(function() { | ||||
| 		var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||||
| 		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||||
| 		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||||
| 	})(); | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										14
									
								
								demos/xhr/package.json
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										14
									
								
								demos/xhr/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| { | ||||
| 	"name": "sheetjs-xhr-demo", | ||||
| 	"author": "sheetjs", | ||||
| 	"version": "0.72.62", | ||||
| 	"dependencies": { | ||||
| 		"printj": "1.1.0", | ||||
| 		"express": "4.15.4", | ||||
| 		"express-formidable": "1.0.0", | ||||
| 		"serve-index": "1.9.0" | ||||
| 	}, | ||||
| 	"scripts": { | ||||
| 		"start": "node server.js 7262" | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										34
									
								
								demos/xhr/server.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										34
									
								
								demos/xhr/server.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | ||||
| #!/usr/bin/env node
 | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| 
 | ||||
| var fs = require('fs'), path = require('path'); | ||||
| var express = require('express'), app = express(); | ||||
| var sprintf = require('printj').sprintf; | ||||
| 
 | ||||
| var port = +process.argv[2] || +process.env.PORT || 7262; | ||||
| var basepath = process.cwd(); | ||||
| 
 | ||||
| function doit(cb) { | ||||
| 	return function(req, res, next) { | ||||
| 		cb(req, res); | ||||
| 		next(); | ||||
| 	}; | ||||
| } | ||||
| 
 | ||||
| app.use(doit(function(req, res) { | ||||
| 	console.log(sprintf("%s %s %d", req.method, req.url, res.statusCode)); | ||||
| })); | ||||
| app.use(doit(function(req, res) { | ||||
| 	res.header('Access-Control-Allow-Origin', '*'); | ||||
| })); | ||||
| app.use(require('express-formidable')()); | ||||
| app.post('/upload', function(req, res) { | ||||
| 	fs.writeFile(req.fields.file, req.fields.data, 'base64', function(err, r) { | ||||
| 		res.end("wrote to " + req.fields.file); | ||||
| 	}); | ||||
| }); | ||||
| app.use(express.static(path.resolve(basepath))); | ||||
| app.use(require('serve-index')(basepath, {'icons':true})); | ||||
| 
 | ||||
| app.listen(port, function() { console.log('Serving HTTP on port ' + port); }); | ||||
| 
 | ||||
							
								
								
									
										70
									
								
								demos/xhr/superagent.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										70
									
								
								demos/xhr/superagent.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | ||||
| <!DOCTYPE html> | ||||
| <!-- xlsx.js (C) 2013-present  SheetJS http://sheetjs.com --> | ||||
| <!-- vim: set ts=2: --> | ||||
| <html> | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| <title>SheetJS Live Demo</title> | ||||
| <style> | ||||
| a { text-decoration: none } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b> | ||||
| 
 | ||||
| <a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a> | ||||
| <a href="https://github.com/SheetJS/js-xlsx/issues">Issues?  Something look weird?  Click here and report an issue</a> | ||||
| <br/><div id="fileurl"></div> | ||||
| </pre> | ||||
| <div id="htmlout"></div> | ||||
| <br /> | ||||
| <button id="ulbutton">Click here to upload the modified table</button> | ||||
| <pre> | ||||
| <div id="outfile"></div> | ||||
| </pre> | ||||
| <script src="xlsx.full.min.js"></script> | ||||
| <script src="https://unpkg.com/superagent/superagent.js"></script> | ||||
| <script> | ||||
| var demo = 'superagent', book = 'xlsx'; | ||||
| 
 | ||||
| var request = window.superagent; | ||||
| function process_wb(wb) { | ||||
| 	console.log(wb); | ||||
| 	htmlout.innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]], {editable:true}).replace("<table", '<table id="table" border="1"'); | ||||
| } | ||||
| 
 | ||||
| var url = "sheetjs.xlsx"; | ||||
| document.getElementById('fileurl').innerHTML = '<a href="' + url + '">Download original file</a>'; | ||||
| document.getElementById('outfile').innerHTML = '<a href="' + demo + '.' + book + '">Download new file</a>'; | ||||
| 
 | ||||
| request.get(url) | ||||
| 	.responseType('arraybuffer') | ||||
| 	.end(function(err, res) { | ||||
| 		var data = new Uint8Array(res.body); | ||||
| 		var wb = XLSX.read(data, {type:"array"}); | ||||
| 		process_wb(wb); | ||||
| 	}); | ||||
| 
 | ||||
| document.getElementById('ulbutton').onclick = function() { | ||||
| 	var wb = XLSX.utils.table_to_book(document.getElementById('htmlout')); | ||||
| 	console.log(wb); | ||||
| 	var formdata = new FormData(); | ||||
| 	formdata.append('file', demo + '.' + book); | ||||
| 	formdata.append('data', XLSX.write(wb, {bookType:book, type:'base64'})); | ||||
| 	request.post("/upload").send(formdata).end(function(e,r) { console.log(r.text); }); | ||||
| }; | ||||
| </script> | ||||
| <script type="text/javascript"> | ||||
| 	var _gaq = _gaq || []; | ||||
| 	_gaq.push(['_setAccount', 'UA-36810333-1']); | ||||
| 	_gaq.push(['_trackPageview']); | ||||
| 
 | ||||
| 	(function() { | ||||
| 		var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||||
| 		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||||
| 		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||||
| 	})(); | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										77
									
								
								demos/xhr/xhr.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										77
									
								
								demos/xhr/xhr.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| <!DOCTYPE html> | ||||
| <!-- xlsx.js (C) 2013-present  SheetJS http://sheetjs.com --> | ||||
| <!-- vim: set ts=2: --> | ||||
| <html> | ||||
| <head> | ||||
| <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||||
| <title>SheetJS Live Demo</title> | ||||
| <style> | ||||
| a { text-decoration: none } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b> | ||||
| 
 | ||||
| <a href="https://github.com/SheetJS/js-xlsx">Source Code Repo</a> | ||||
| <a href="https://github.com/SheetJS/js-xlsx/issues">Issues?  Something look weird?  Click here and report an issue</a> | ||||
| <br/><div id="fileurl"></div> | ||||
| </pre> | ||||
| <div id="htmlout"></div> | ||||
| <br /> | ||||
| <button id="ulbutton">Click here to upload the modified table</button> | ||||
| <pre> | ||||
| <div id="outfile"></div> | ||||
| </pre> | ||||
| <script src="xlsx.full.min.js"></script> | ||||
| <script> | ||||
| var demo = 'xhr', book = 'xlsx'; | ||||
| 
 | ||||
| if(!window.XMLHttpRequest || typeof Uint8Array === 'undefined') | ||||
| 	throw new Error("This demo is not supported in your browser"); | ||||
| 
 | ||||
| function process_wb(wb) { | ||||
| 	console.log(wb); | ||||
| 	htmlout.innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]], {editable:true}).replace("<table", '<table id="table" border="1"'); | ||||
| } | ||||
| 
 | ||||
| var url = "sheetjs.xlsx"; | ||||
| document.getElementById('fileurl').innerHTML = '<a href="' + url + '">Download original file</a>'; | ||||
| document.getElementById('outfile').innerHTML = '<a href="' + demo + '.' + book + '">Download new file</a>'; | ||||
| 
 | ||||
| { | ||||
| 	var oReq = new XMLHttpRequest(); | ||||
| 	oReq.open("GET", url, true); | ||||
| 	oReq.responseType = "arraybuffer"; | ||||
| 	oReq.onload = function(e) { | ||||
| 		var data = new Uint8Array(oReq.response); | ||||
| 		var wb = XLSX.read(data, {type:"array"}); | ||||
| 		process_wb(wb); | ||||
| 	}; | ||||
| 	oReq.send(); | ||||
| } | ||||
| 
 | ||||
| document.getElementById('ulbutton').onclick = function() { | ||||
| 	var wb = XLSX.utils.table_to_book(document.getElementById('htmlout')); | ||||
| 	console.log(wb); | ||||
| 	var formdata = new FormData(); | ||||
| 	formdata.append('file', demo + '.' + book); | ||||
| 	formdata.append('data', XLSX.write(wb, {bookType:book, type:'base64'})); | ||||
| 	var oReq = new XMLHttpRequest(); | ||||
| 	oReq.open("POST", "/upload", true); | ||||
| 	oReq.send(formdata); | ||||
| }; | ||||
| </script> | ||||
| <script type="text/javascript"> | ||||
| 	var _gaq = _gaq || []; | ||||
| 	_gaq.push(['_setAccount', 'UA-36810333-1']); | ||||
| 	_gaq.push(['_trackPageview']); | ||||
| 
 | ||||
| 	(function() { | ||||
| 		var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; | ||||
| 		ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; | ||||
| 		var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); | ||||
| 	})(); | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										1
									
								
								demos/xhr/xlsx.full.min.js
									
									
									
									
										vendored
									
									
										Symbolic link
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/xhr/xlsx.full.min.js
									
									
									
									
										vendored
									
									
										Symbolic link
									
								
							| @ -0,0 +1 @@ | ||||
| ../../dist/xlsx.full.min.js | ||||
| @ -25,24 +25,25 @@ CDNjs automatically pulls the latest version and makes all versions available at | ||||
| 
 | ||||
| The `demos` directory includes sample projects for: | ||||
| 
 | ||||
| **Frameworks** | ||||
| **JS Frameworks and APIs** | ||||
| - [`angular 1.x`](demos/angular/) | ||||
| - [`angular 2.x / 4.x`](demos/angular2/) | ||||
| - [`meteor`](demos/meteor/) | ||||
| - [`vue 2`](demos/vue/) | ||||
| - [`vue 2.x`](demos/vue/) | ||||
| - [`XMLHttpRequest and fetch`](demos/xhr/) | ||||
| 
 | ||||
| **JS Bundlers and Tooling** | ||||
| - [`browserify`](demos/browserify/) | ||||
| - [`requirejs`](demos/requirejs/) | ||||
| - [`rollup`](demos/rollup/) | ||||
| - [`systemjs`](demos/systemjs/) | ||||
| - [`webpack`](demos/webpack/) | ||||
| - [`webpack 2.x`](demos/webpack/) | ||||
| 
 | ||||
| **JS Platforms and Integrations** | ||||
| - [`Adobe ExtendScript`](demos/extendscript/) | ||||
| - [`Headless Browsers`](demos/headless/) | ||||
| - [`canvas-datagrid`](demos/datagrid/) | ||||
| - [`Other JS engines`](demos/altjs/) | ||||
| - [`Swift JSC and other engines`](demos/altjs/) | ||||
| 
 | ||||
| ### Optional Modules | ||||
| 
 | ||||
|  | ||||
| @ -40,6 +40,29 @@ saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), "test.xlsx"); | ||||
| ``` | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
| 	<summary><b>Browser upload to server</b> (click to show)</summary> | ||||
| 
 | ||||
| A complete example using XHR is [included in the xhr demo](demos/xhr/), along | ||||
| with examples for fetch and wrapper libraries.  This example assumes the server | ||||
| can handle Base64-encoded files (see the demo for a basic nodejs server): | ||||
| 
 | ||||
| ```js | ||||
| /* in this example, send a base64 string to the server */ | ||||
| var wopts = { bookType:'xlsx', bookSST:false, type:'base64' }; | ||||
| 
 | ||||
| var wbout = XLSX.write(workbook,wopts); | ||||
| 
 | ||||
| var oReq = new XMLHttpRequest(); | ||||
| oReq.open("POST", "/upload", true); | ||||
| var formdata = new FormData(); | ||||
| formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name | ||||
| formdata.append('data', wbout); // <-- `data` holds the base64-encoded data | ||||
| oReq.send(formdata); | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| ### Writing Examples | ||||
| 
 | ||||
| - <http://sheetjs.com/demos/table.html> exporting an HTML table | ||||
|  | ||||
| @ -161,24 +161,25 @@ CDNjs automatically pulls the latest version and makes all versions available at | ||||
| 
 | ||||
| The `demos` directory includes sample projects for: | ||||
| 
 | ||||
| **Frameworks** | ||||
| **JS Frameworks and APIs** | ||||
| - [`angular 1.x`](demos/angular/) | ||||
| - [`angular 2.x / 4.x`](demos/angular2/) | ||||
| - [`meteor`](demos/meteor/) | ||||
| - [`vue 2`](demos/vue/) | ||||
| - [`vue 2.x`](demos/vue/) | ||||
| - [`XMLHttpRequest and fetch`](demos/xhr/) | ||||
| 
 | ||||
| **JS Bundlers and Tooling** | ||||
| - [`browserify`](demos/browserify/) | ||||
| - [`requirejs`](demos/requirejs/) | ||||
| - [`rollup`](demos/rollup/) | ||||
| - [`systemjs`](demos/systemjs/) | ||||
| - [`webpack`](demos/webpack/) | ||||
| - [`webpack 2.x`](demos/webpack/) | ||||
| 
 | ||||
| **JS Platforms and Integrations** | ||||
| - [`Adobe ExtendScript`](demos/extendscript/) | ||||
| - [`Headless Browsers`](demos/headless/) | ||||
| - [`canvas-datagrid`](demos/datagrid/) | ||||
| - [`Other JS engines`](demos/altjs/) | ||||
| - [`Swift JSC and other engines`](demos/altjs/) | ||||
| 
 | ||||
| ### Optional Modules | ||||
| 
 | ||||
| @ -565,6 +566,26 @@ function s2ab(s) { | ||||
| saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), "test.xlsx"); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| A complete example using XHR is [included in the xhr demo](demos/xhr/), along | ||||
| with examples for fetch and wrapper libraries.  This example assumes the server | ||||
| can handle Base64-encoded files (see the demo for a basic nodejs server): | ||||
| 
 | ||||
| ```js | ||||
| /* in this example, send a base64 string to the server */ | ||||
| var wopts = { bookType:'xlsx', bookSST:false, type:'base64' }; | ||||
| 
 | ||||
| var wbout = XLSX.write(workbook,wopts); | ||||
| 
 | ||||
| var oReq = new XMLHttpRequest(); | ||||
| oReq.open("POST", "/upload", true); | ||||
| var formdata = new FormData(); | ||||
| formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name | ||||
| formdata.append('data', wbout); // <-- `data` holds the base64-encoded data | ||||
| oReq.send(formdata); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ### Writing Examples | ||||
| 
 | ||||
| - <http://sheetjs.com/demos/table.html> exporting an HTML table | ||||
|  | ||||
							
								
								
									
										10
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								xlsx.flow.js
									
									
									
									
									
								
							| @ -1434,7 +1434,7 @@ var ENDOFCHAIN = -2; | ||||
| var HEADER_SIGNATURE = 'd0cf11e0a1b11ae1'; | ||||
| var HEADER_CLSID = '00000000000000000000000000000000'; | ||||
| var consts = { | ||||
| 	/* 2.1 Compund File Sector Numbers and Types */ | ||||
| 	/* 2.1 Compound File Sector Numbers and Types */ | ||||
| 	MAXREGSECT: -6, | ||||
| 	DIFSECT: -4, | ||||
| 	FATSECT: -3, | ||||
| @ -1907,8 +1907,8 @@ function write_double_le(b, v/*:number*/, idx/*:number*/) { | ||||
| 	var av = bs ? -v : v; | ||||
| 	if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; } | ||||
| 	else { | ||||
| 		e = Math.floor(Math.log(av) * Math.LOG2E); | ||||
| 		m = v * Math.pow(2, 52 - e); | ||||
| 		e = Math.floor(Math.log(av) / Math.LN2); | ||||
| 		m = av * Math.pow(2, 52 - e); | ||||
| 		if(e <= -1023 && (!isFinite(m) || m < Math.pow(2,52))) { e = -1022; } | ||||
| 		else { m -= Math.pow(2,52); e+=1023; } | ||||
| 	} | ||||
| @ -5423,7 +5423,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ { | ||||
| 				case 'L': switch(s.toUpperCase()) { | ||||
| 					case 'Y': case 'T': out[R][C] = true; break; | ||||
| 					case 'N': case 'F': out[R][C] = false; break; | ||||
| 					case ' ': case '?': out[R][C] = false; break; /* NOTE: technically unitialized */ | ||||
| 					case ' ': case '?': out[R][C] = false; break; /* NOTE: technically uninitialized */ | ||||
| 					default: throw new Error("DBF Unrecognized L:|" + s + "|"); | ||||
| 					} break; | ||||
| 				case 'M': /* TODO: handle memo files */ | ||||
| @ -6658,7 +6658,7 @@ function parse_EncryptionInfo(blob, length/*:?number*/) { | ||||
| 		case 0x03: return parse_EncInfoExt(blob, vers); | ||||
| 		case 0x04: return parse_EncInfoAgl(blob, vers); | ||||
| 	} | ||||
| 	throw new Error("ECMA-376 Encryped file unrecognized Version: " + vers.Minor); | ||||
| 	throw new Error("ECMA-376 Encrypted file unrecognized Version: " + vers.Minor); | ||||
| } | ||||
| 
 | ||||
| /* [MS-OFFCRYPTO] 2.3.4.5  EncryptionInfo Stream (Standard Encryption) */ | ||||
|  | ||||
							
								
								
									
										10
									
								
								xlsx.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								xlsx.js
									
									
									
									
									
								
							| @ -1372,7 +1372,7 @@ var ENDOFCHAIN = -2; | ||||
| var HEADER_SIGNATURE = 'd0cf11e0a1b11ae1'; | ||||
| var HEADER_CLSID = '00000000000000000000000000000000'; | ||||
| var consts = { | ||||
| 	/* 2.1 Compund File Sector Numbers and Types */ | ||||
| 	/* 2.1 Compound File Sector Numbers and Types */ | ||||
| 	MAXREGSECT: -6, | ||||
| 	DIFSECT: -4, | ||||
| 	FATSECT: -3, | ||||
| @ -1843,8 +1843,8 @@ function write_double_le(b, v, idx) { | ||||
| 	var av = bs ? -v : v; | ||||
| 	if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; } | ||||
| 	else { | ||||
| 		e = Math.floor(Math.log(av) * Math.LOG2E); | ||||
| 		m = v * Math.pow(2, 52 - e); | ||||
| 		e = Math.floor(Math.log(av) / Math.LN2); | ||||
| 		m = av * Math.pow(2, 52 - e); | ||||
| 		if(e <= -1023 && (!isFinite(m) || m < Math.pow(2,52))) { e = -1022; } | ||||
| 		else { m -= Math.pow(2,52); e+=1023; } | ||||
| 	} | ||||
| @ -5349,7 +5349,7 @@ function dbf_to_aoa(buf, opts) { | ||||
| 				case 'L': switch(s.toUpperCase()) { | ||||
| 					case 'Y': case 'T': out[R][C] = true; break; | ||||
| 					case 'N': case 'F': out[R][C] = false; break; | ||||
| 					case ' ': case '?': out[R][C] = false; break; /* NOTE: technically unitialized */ | ||||
| 					case ' ': case '?': out[R][C] = false; break; /* NOTE: technically uninitialized */ | ||||
| 					default: throw new Error("DBF Unrecognized L:|" + s + "|"); | ||||
| 					} break; | ||||
| 				case 'M': /* TODO: handle memo files */ | ||||
| @ -6583,7 +6583,7 @@ function parse_EncryptionInfo(blob, length) { | ||||
| 		case 0x03: return parse_EncInfoExt(blob, vers); | ||||
| 		case 0x04: return parse_EncInfoAgl(blob, vers); | ||||
| 	} | ||||
| 	throw new Error("ECMA-376 Encryped file unrecognized Version: " + vers.Minor); | ||||
| 	throw new Error("ECMA-376 Encrypted file unrecognized Version: " + vers.Minor); | ||||
| } | ||||
| 
 | ||||
| /* [MS-OFFCRYPTO] 2.3.4.5  EncryptionInfo Stream (Standard Encryption) */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user