forked from sheetjs/sheetjs
		
	update tests
This commit is contained in:
		
							parent
							
								
									6bea47aaef
								
							
						
					
					
						commit
						838ee58a49
					
				| @ -48,9 +48,7 @@ function Base64_encode_pass(input) { | ||||
| function Base64_decode(input) { | ||||
|   var o = ""; | ||||
|   var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; | ||||
|   input = input.replace(/^data:([^\/]+\/[^\/]+)?;base64,/, '') | ||||
|                .replace(/[^\w\+\/\=]/g, ""); | ||||
| 
 | ||||
|   input = input.replace(/^data:([^\/]+\/[^\/]+)?;base64\,/, "").replace(/[^\w\+\/\=]/g, ""); | ||||
|   for (var i = 0; i < input.length; ) { | ||||
|     e1 = Base64_map.indexOf(input.charAt(i++)); | ||||
|     e2 = Base64_map.indexOf(input.charAt(i++)); | ||||
|  | ||||
| @ -51,7 +51,7 @@ can be installed with Bash on Windows or with `cygwin`. | ||||
| - [`SalesForce Lightning Web Components`](https://docs.sheetjs.com/docs/getting-started/demos/salesforce) | ||||
| - [`Excel JavaScript API`](https://docs.sheetjs.com/docs/getting-started/demos/excel) | ||||
| - [`Headless Automation`](https://docs.sheetjs.com/docs/getting-started/demos/headless) | ||||
| - [`Swift JSC and Other JavaScript Engines`](altjs/) | ||||
| - [`Swift JSC and Other JavaScript Engines`](https://docs.sheetjs.com/docs/getting-started/demos/engines) | ||||
| - [`"serverless" functions`](function/) | ||||
| - [`Databases and Structured Data Stores`](https://docs.sheetjs.com/docs/getting-started/demos/database) | ||||
| - [`NoSQL, K/V, and Unstructured Data Stores`](https://docs.sheetjs.com/docs/getting-started/demos/nosql) | ||||
| @ -68,9 +68,7 @@ can be installed with Bash on Windows or with `cygwin`. | ||||
| - [`swc`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#swc) | ||||
| - [`systemjs`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#systemjs) | ||||
| - [`vite`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#vite) | ||||
| - [`webpack 2.x`](webpack/) | ||||
| - [`webpack`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#webpack) | ||||
| - [`wmr`](https://docs.sheetjs.com/docs/getting-started/demos/bundler#wmr) | ||||
| 
 | ||||
| Other examples are included in the [showcase](demos/showcase/). | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
							
								
								
									
										10
									
								
								demos/altjs/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								demos/altjs/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,10 +0,0 @@ | ||||
| sheetjs.* | ||||
| SheetJSSwift | ||||
| duk* | ||||
| *.class | ||||
| *.jar | ||||
| rhino | ||||
| shim.min.js | ||||
| xlsx.*.js | ||||
| payload.js | ||||
| goja | ||||
| @ -1,3 +0,0 @@ | ||||
| disabled_rules: | ||||
|   - trailing_semicolon | ||||
|   - identifier_name | ||||
| @ -1,60 +0,0 @@ | ||||
| .PHONY: all | ||||
| all: duktape nashorn rhinojs swift goja | ||||
| 
 | ||||
| .PHONY: base | ||||
| base: | ||||
| 	if [ ! -e sheetjs.xlsx ]; then node ../../tests/write.js; fi | ||||
| 	if [ ! -e xlsx.full.min.js ]; then cp ../../dist/xlsx.full.min.js .; fi | ||||
| 	if [ ! -e shim.min.js ]; then cp ../../dist/shim.min.js .; fi | ||||
| 
 | ||||
| .PHONY: duk | ||||
| duk: base | ||||
| 	bash ./duktape.sh | ||||
| 	gcc -std=c99 -Wall -osheetjs.duk sheetjs.duk.c duktape.c -lm | ||||
| 
 | ||||
| .PHONY: duktape | ||||
| duktape: duk ## duktape demo
 | ||||
| 	for ext in xlsx xlsb biff8.xls xml.xls; do ./sheetjs.duk sheetjs.$$ext; done | ||||
| 
 | ||||
| .PHONY: nashorn | ||||
| nashorn: base ## nashorn demo
 | ||||
| 	jjs nashorn.js | ||||
| 
 | ||||
| .PHONY: swift | ||||
| swift: base ## swift demo
 | ||||
| 	swiftc SheetJSCore.swift main.swift -o SheetJSSwift | ||||
| 	./SheetJSSwift | ||||
| 
 | ||||
| .PHONY: goja | ||||
| goja: base ## goja demo
 | ||||
| 	go build goja.go | ||||
| 	for ext in xlsx xlsb biff8.xls xml.xls; do ./goja sheetjs.$$ext; done | ||||
| 
 | ||||
| .PHONY: chakra | ||||
| chakra: base ## Chakra demo
 | ||||
| 	node -pe "fs.writeFileSync('payload.js', 'var payload = \"' + fs.readFileSync('sheetjs.xlsx').toString('base64') + '\";')" | ||||
| 	cat global.js xlsx.full.min.js payload.js chakra.js > xlsx.chakra.js | ||||
| 	chakra ./xlsx.chakra.js | ||||
| 
 | ||||
| .PHONY: rhinojs ## rhino demo
 | ||||
| rhinojs: base SheetJSRhino.class | ||||
| 	for ext in xlsx xlsb biff8.xls xml.xls; do java -cp .:SheetJS.jar:rhino.jar SheetJSRhino sheetjs.$$ext; done | ||||
| 
 | ||||
| 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 $^ xlsx.full.min.js | ||||
| 	javac -cp .:SheetJS.jar:rhino.jar SheetJSRhino.java | ||||
| 
 | ||||
| rhino.jar: | ||||
| 	if [ ! -e rhino ]; then git clone --depth=1 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 | ||||
| 	if [ ! -e rhino/buildGradle/libs/rhino-[0-1]*.jar ]; then cd rhino; ./gradlew jar; fi | ||||
| 	cp rhino/buildGradle/libs/rhino-[0-9]*.jar rhino.jar | ||||
| 
 | ||||
| .PHONY: clean | ||||
| clean: | ||||
| 	rm SheetJS.jar *.class com/sheetjs/*.class | ||||
| @ -1,186 +1,7 @@ | ||||
| # Other JS Engines and Deployments | ||||
| 
 | ||||
| There are many JS engines and deployments outside of web browsers. NodeJS is the | ||||
| most popular deployment, but there are many others for special use cases.  Some | ||||
| 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. | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/engines) | ||||
| includes more detailed instructions and more JS engines. | ||||
| 
 | ||||
| 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 for running JS scripts from | ||||
| Swift and Objective-C.  Hybrid function invocation is tricky, but explicit data | ||||
| passing is straightforward.  The demo shows a standalone example for OSX.  For | ||||
| playgrounds, the library should be copied to shared playground data directory | ||||
| (usually `~/Documents/Shared Playground Data`): | ||||
| 
 | ||||
| ```swift | ||||
| /* This only works in a playground, see SheetJSCore.swift for standalone use */ | ||||
| import JavaScriptCore; | ||||
| import PlaygroundSupport; | ||||
| 
 | ||||
| /* build path variable for the library */ | ||||
| let shared_dir = PlaygroundSupport.playgroundSharedDataDirectory; | ||||
| let lib_path = shared_dir.appendingPathComponent("xlsx.full.min.js"); | ||||
| 
 | ||||
| /* prepare JS context */ | ||||
| var context: JSContext! = JSContext(); | ||||
| var src = "var global = (function(){ return this; }).call(null);"; | ||||
| context.evaluateScript(src); | ||||
| 
 | ||||
| /* load library */ | ||||
| var lib = try? String(contentsOf: lib_path); | ||||
| context.evaluateScript(lib); | ||||
| let XLSX: JSValue! = context.objectForKeyedSubscript("XLSX"); | ||||
| 
 | ||||
| /* to verify the library was loaded, get the version string */ | ||||
| let XLSXversion: JSValue! = XLSX.objectForKeyedSubscript("version") | ||||
| var version  = XLSXversion.toString(); | ||||
| ``` | ||||
| 
 | ||||
| Binary strings can be passed back and forth using `String.Encoding.isoLatin1`: | ||||
| 
 | ||||
| ```swift | ||||
| /* parse sheetjs.xls */ | ||||
| let file_path = shared_dir.appendingPathComponent("sheetjs.xls"); | ||||
| let data: String! = try String(contentsOf: file_path, encoding: String.Encoding.isoLatin1); | ||||
| context.setObject(data, forKeyedSubscript: "payload" as (NSCopying & NSObjectProtocol)); | ||||
| src = "var wb = XLSX.read(payload, {type:'binary'});"; | ||||
| context.evaluateScript(src); | ||||
| 
 | ||||
| /* write to sheetjsw.xlsx  */ | ||||
| let out_path = shared_dir.appendingPathComponent("sheetjsw.xlsx"); | ||||
| src = "var out = XLSX.write(wb, {type:'binary', bookType:'xlsx'})"; | ||||
| context.evaluateScript(src); | ||||
| let outvalue: JSValue! = context.objectForKeyedSubscript("out"); | ||||
| var out: String! = outvalue.toString(); | ||||
| try? out.write(to: out_path, atomically: false, encoding: String.Encoding.isoLatin1); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## Nashorn | ||||
| 
 | ||||
| Nashorn ships with Java 8.  It includes a command-line tool `jjs` for running JS | ||||
| scripts.  It is somewhat limited but does offer access to the full Java runtime. | ||||
| 
 | ||||
| The `load` function in `jjs` can load the minified source directly: | ||||
| 
 | ||||
| ```js | ||||
| var global = (function(){ return this; }).call(null); | ||||
| load('xlsx.full.min.js'); | ||||
| ``` | ||||
| 
 | ||||
| The Java `nio` API provides the `Files.readAllBytes` method to read a file into | ||||
| 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 turned off: | ||||
| 
 | ||||
| ```java | ||||
| Context context = Context.enter(); | ||||
| context.setOptimizationLevel(-1); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## ChakraCore | ||||
| 
 | ||||
| ChakraCore is an embeddable JS engine written in C++.  The library and binary | ||||
| distributions include a command-line tool `chakra` for running JS scripts. | ||||
| 
 | ||||
| The simplest way to interact with the engine is to pass Base64 strings. The make | ||||
| target builds a very simple payload with the data. | ||||
| 
 | ||||
| 
 | ||||
| ## Duktape | ||||
| 
 | ||||
| [Duktape](http://duktape.org/) is an embeddable JS engine written in C.  The | ||||
| amalgamation makes integration extremely simple!  It supports `Buffer` natively | ||||
| but should be sliced before processing: | ||||
| 
 | ||||
| ```C | ||||
| /* parse a C char array as a workbook object */ | ||||
| duk_push_external_buffer(ctx); | ||||
| duk_config_buffer(ctx, -1, buf, len); | ||||
| duk_put_global_string(ctx, "buf"); | ||||
| duk_eval_string_noresult("workbook = XLSX.read(buf.slice(0, buf.length), {type:'buffer'});"); | ||||
| 
 | ||||
| /* write a workbook object to a C char array */ | ||||
| duk_eval_string(ctx, "XLSX.write(workbook, {type:'array', bookType:'xlsx'})"); | ||||
| duk_size_t sz; | ||||
| char *buf = (char *)duk_get_buffer_data(ctx, -1, sz); | ||||
| duk_pop(ctx); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## QuickJS | ||||
| 
 | ||||
| QuickJS is an embeddable JS engine written in C.  It provides a separate set of | ||||
| functions for interacting with the filesystem and the global object.  It can run | ||||
| the browser dist build. | ||||
| 
 | ||||
| The `global` object is available as `std.global`.  To make it visible to the | ||||
| loader, create a reference to itself: | ||||
| 
 | ||||
| ```js | ||||
| std.global.global = std.global; | ||||
| std.loadScript("xlsx.full.min.js"); | ||||
| ``` | ||||
| 
 | ||||
| The filesystem interaction mirrors POSIX, including separate allocations: | ||||
| 
 | ||||
| ```js | ||||
| /* read file */ | ||||
| var rh = std.open(filename, "rb"); rh.seek(0, std.SEEK_END); | ||||
| var sz = rh.tell(); rh.seek(); | ||||
| var ab = new ArrayBuffer(sz); rh.read(ab, 0, sz); rh.close(); | ||||
| var wb = XLSX.read(ab, {type: 'array'}); | ||||
| 
 | ||||
| /* write file */ | ||||
| var ab = XLSX.write(wb, {type: 'array'}); | ||||
| var wh = std.open("sheetjs.qjs.xlsx", "wb"); | ||||
| wh.write(out, 0, ab.byteLength); wh.close(); | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
| ## Goja | ||||
| 
 | ||||
| Goja is a pure Go implementation of ECMAScript 5.  `[]byte` should be converted | ||||
| to a binary string in the engine: | ||||
| 
 | ||||
| ```go | ||||
| /* read file */ | ||||
| data, _ := ioutil.ReadFile("sheetjs.xlsx") | ||||
| 
 | ||||
| /* load into engine */ | ||||
| vm.Set("buf", data) | ||||
| 
 | ||||
| /* convert to binary string */ | ||||
| _, _ = vm.RunString("var bstr = ''; for(var i = 0; i < buf.length; ++i) bstr += String.fromCharCode(buf[i]);") | ||||
| 
 | ||||
| /* parse */ | ||||
| wb, _ = vm.RunString("wb = XLSX.read(bstr, {type:'binary', cellNF:true});") | ||||
| ``` | ||||
| 
 | ||||
| On the write side, `"base64"` strings can be decoded in Go: | ||||
| 
 | ||||
| ```go | ||||
| b64str, _ := vm.RunString("XLSX.write(wb, {type:'base64', bookType:'xlsx'})") | ||||
| buf, _ := base64.StdEncoding.DecodeString(b64str.String()) | ||||
| _ = ioutil.WriteFile("sheetjs.xlsx", buf, 0644) | ||||
| ``` | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,37 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* This only works in a playground, see SheetJSCore.swift for standalone use */ | ||||
| import JavaScriptCore; | ||||
| import PlaygroundSupport; | ||||
| 
 | ||||
| /* build path variable for the library */ | ||||
| let shared_dir = PlaygroundSupport.playgroundSharedDataDirectory; | ||||
| let lib_path = shared_dir.appendingPathComponent("xlsx.full.min.js"); | ||||
| 
 | ||||
| /* prepare JS context */ | ||||
| var context: JSContext! = JSContext(); | ||||
| var src = "var global = (function(){ return this; }).call(null);"; | ||||
| context.evaluateScript(src); | ||||
| 
 | ||||
| /* load library */ | ||||
| var lib = try? String(contentsOf: lib_path); | ||||
| context.evaluateScript(lib); | ||||
| let XLSX: JSValue! = context.objectForKeyedSubscript("XLSX"); | ||||
| 
 | ||||
| /* to verify the library was loaded, get the version string */ | ||||
| let XLSXversion: JSValue! = XLSX.objectForKeyedSubscript("version") | ||||
| var version  = XLSXversion.toString(); | ||||
| 
 | ||||
| /* parse sheetjs.xls */ | ||||
| let file_path = shared_dir.appendingPathComponent("sheetjs.xls"); | ||||
| let data: String! = try String(contentsOf: file_path, encoding: String.Encoding.isoLatin1); | ||||
| context.setObject(data, forKeyedSubscript: "payload" as (NSCopying & NSObjectProtocol)!); | ||||
| src = "var wb = XLSX.read(payload, {type:'binary'});"; | ||||
| context.evaluateScript(src); | ||||
| 
 | ||||
| /* write to sheetjsw.xlsx  */ | ||||
| let out_path = shared_dir.appendingPathComponent("sheetjsw.xlsx"); | ||||
| src = "var out = XLSX.write(wb, {type:'binary', bookType:'xlsx'})"; | ||||
| context.evaluateScript(src); | ||||
| let outvalue: JSValue! = context.objectForKeyedSubscript("out"); | ||||
| var out: String! = outvalue.toString(); | ||||
| try? out.write(to: out_path, atomically: false, encoding: String.Encoding.isoLatin1); | ||||
| @ -1,96 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| import JavaScriptCore; | ||||
| 
 | ||||
| enum SJSError: Error { | ||||
|   case badJSContext; | ||||
|   case badJSWorkbook; | ||||
|   case badJSWorksheet; | ||||
| }; | ||||
| 
 | ||||
| class SJSWorksheet { | ||||
|   var context: JSContext!; | ||||
|   var wb: JSValue; var ws: JSValue; | ||||
|   var idx: Int32; | ||||
| 
 | ||||
|   func toCSV() throws -> String { | ||||
|     let XLSX: JSValue! = context.objectForKeyedSubscript("XLSX"); | ||||
|     let utils: JSValue! = XLSX.objectForKeyedSubscript("utils"); | ||||
|     let sheet_to_csv: JSValue! = utils.objectForKeyedSubscript("sheet_to_csv"); | ||||
|     return sheet_to_csv.call(withArguments: [ws]).toString(); | ||||
|   } | ||||
| 
 | ||||
|   init(ctx: JSContext, workbook: JSValue, worksheet: JSValue, idx: Int32) throws { | ||||
|     self.context = ctx; self.wb = workbook; self.ws = worksheet; self.idx = idx; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class SJSWorkbook { | ||||
|   var context: JSContext!; | ||||
|   var wb: JSValue; var SheetNames: JSValue; var Sheets: JSValue; | ||||
| 
 | ||||
|   func getSheetAtIndex(idx: Int32) throws -> SJSWorksheet { | ||||
|     let SheetName: String = SheetNames.atIndex(Int(idx)).toString(); | ||||
|     let ws: JSValue! = Sheets.objectForKeyedSubscript(SheetName); | ||||
|     return try SJSWorksheet(ctx: context, workbook: wb, worksheet: ws, idx: idx); | ||||
|   } | ||||
| 
 | ||||
|   func writeBStr(bookType: String = "xlsx") throws -> String { | ||||
|     let XLSX: JSValue! = context.objectForKeyedSubscript("XLSX"); | ||||
|     context.evaluateScript(String(format: "var writeopts = {type:'binary', bookType:'%@'}", bookType)); | ||||
|     let writeopts: JSValue = context.objectForKeyedSubscript("writeopts"); | ||||
|     let writefunc: JSValue = XLSX.objectForKeyedSubscript("write"); | ||||
|     return writefunc.call(withArguments: [wb, writeopts]).toString(); | ||||
|   } | ||||
| 
 | ||||
|   init(ctx: JSContext, wb: JSValue) throws { | ||||
|     self.context = ctx; | ||||
|     self.wb = wb; | ||||
|     self.SheetNames = wb.objectForKeyedSubscript("SheetNames"); | ||||
|     self.Sheets = wb.objectForKeyedSubscript("Sheets"); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| class SheetJSCore { | ||||
|   var context: JSContext!; | ||||
|   var XLSX: JSValue!; | ||||
| 
 | ||||
|   func init_context() throws -> JSContext { | ||||
|     var context: JSContext! | ||||
|     do { | ||||
|       context = JSContext(); | ||||
|       context.exceptionHandler = { _, X in if let e = X { print(e.toString()!); }; }; | ||||
|       context.evaluateScript("var global = (function(){ return this; }).call(null);"); | ||||
|       context.evaluateScript("if(typeof wbs == 'undefined') wbs = [];"); | ||||
|       let src = try String(contentsOfFile: "xlsx.full.min.js"); | ||||
|       context.evaluateScript(src); | ||||
|       if context != nil { return context!; } | ||||
|     } catch { print(error.localizedDescription); } | ||||
|     throw SJSError.badJSContext; | ||||
|   } | ||||
| 
 | ||||
|   func version() throws -> String { | ||||
|     if let version = XLSX.objectForKeyedSubscript("version") { return version.toString(); } | ||||
|     throw SJSError.badJSContext; | ||||
|   } | ||||
| 
 | ||||
|   func readFile(file: String) throws -> SJSWorkbook { | ||||
|     let data: String! = try String(contentsOfFile: file, encoding: String.Encoding.isoLatin1); | ||||
|     return try readBStr(data: data); | ||||
|   } | ||||
| 
 | ||||
|   func readBStr(data: String) throws -> SJSWorkbook { | ||||
|     context.setObject(data, forKeyedSubscript: "payload" as (NSCopying & NSObjectProtocol)); | ||||
|     context.evaluateScript("var wb = XLSX.read(payload, {type:'binary'});"); | ||||
|     let wb: JSValue! = context.objectForKeyedSubscript("wb"); | ||||
|     if wb == nil { throw SJSError.badJSWorkbook; } | ||||
|     return try SJSWorkbook(ctx: context, wb: wb); | ||||
|   } | ||||
| 
 | ||||
|   init() throws { | ||||
|     do { | ||||
|       self.context = try init_context(); | ||||
|       self.XLSX = self.context.objectForKeyedSubscript("XLSX"); | ||||
|       if self.XLSX == nil { throw SJSError.badJSContext; } | ||||
|     } catch { print(error.localizedDescription); } | ||||
|   } | ||||
| } | ||||
| @ -1,31 +0,0 @@ | ||||
| /* 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(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -1,3 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var wb = XLSX.read(payload, {type:'base64'}); | ||||
| console.log(XLSX.utils.sheet_to_csv(wb.Sheets[wb.SheetNames[0]])); | ||||
| @ -1,51 +0,0 @@ | ||||
| /* 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] < 0 ? b[i] + 256 : 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(); } | ||||
| 
 | ||||
| } | ||||
| @ -1,10 +0,0 @@ | ||||
| /* 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); } | ||||
| } | ||||
| @ -1,58 +0,0 @@ | ||||
| /* 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("/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', 'WTF':1};", "<cmd>", 2, null); | ||||
| 
 | ||||
|     /* set up function arguments */ | ||||
|     Object args[] = {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, args); | ||||
| 
 | ||||
|     return new SheetJSFile(wb, this); | ||||
|   } | ||||
| 
 | ||||
|   public static void close() { JSHelper.close(); } | ||||
| } | ||||
| 
 | ||||
| @ -1,24 +0,0 @@ | ||||
| /* 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); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @ -1,29 +0,0 @@ | ||||
| /* 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,16 +0,0 @@ | ||||
| #!/bin/bash | ||||
| DUKTAPE_VER=2.6.0 | ||||
| if [ ! -e duktape-$DUKTAPE_VER ]; then | ||||
| 	if [ ! -e duktape-$DUKTAPE_VER.tar ]; then | ||||
| 		if [ ! -e duktape-$DUKTAPE_VER.tar.xz ]; then | ||||
| 			curl -O https://duktape.org/duktape-$DUKTAPE_VER.tar.xz | ||||
| 		fi | ||||
| 		xz -d duktape-$DUKTAPE_VER.tar.xz | ||||
| 	fi | ||||
| 	tar -xf duktape-$DUKTAPE_VER.tar | ||||
| fi | ||||
| 
 | ||||
| for f in duktape.{c,h} duk_config.h; do | ||||
| 	cp duktape-$DUKTAPE_VER/src/$f . | ||||
| done | ||||
| 
 | ||||
| @ -1,3 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var global = (function(){ return this; }).call(null); | ||||
| 
 | ||||
| @ -1,71 +0,0 @@ | ||||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	b64 "encoding/base64" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"io/ioutil" | ||||
| 	"github.com/dop251/goja" | ||||
| ) | ||||
| 
 | ||||
| func safe_run_file(vm *goja.Runtime, file string) { | ||||
| 	data, err := ioutil.ReadFile(file) | ||||
| 	if err != nil { panic(err) } | ||||
| 	src := string(data) | ||||
| 	_, err = vm.RunString(src) | ||||
| 	if err != nil { panic(err) } | ||||
| } | ||||
| 
 | ||||
| func eval_string(vm *goja.Runtime, cmd string) goja.Value { | ||||
| 	v, err := vm.RunString(cmd) | ||||
| 	if err != nil { panic(err) } | ||||
| 	return v | ||||
| } | ||||
| 
 | ||||
| func write_type(vm *goja.Runtime, t string) { | ||||
| 	/* due to some wonkiness with array passing, use base64 */ | ||||
| 	b64str := eval_string(vm, "XLSX.write(wb, {type:'base64', bookType:'" + t + "'})") | ||||
| 	buf, err := b64.StdEncoding.DecodeString(b64str.String()); | ||||
| 	if err != nil { panic(err) } | ||||
| 	err = ioutil.WriteFile("sheetjsg." + t, buf, 0644) | ||||
| 	if err != nil { panic(err) } | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	vm := goja.New() | ||||
| 
 | ||||
| 	/* initialize */ | ||||
| 	eval_string(vm, "if(typeof global == 'undefined') global = (function(){ return this; }).call(null);") | ||||
| 
 | ||||
| 	/* load library */ | ||||
| 	safe_run_file(vm, "shim.min.js") | ||||
| 	safe_run_file(vm, "xlsx.full.min.js") | ||||
| 
 | ||||
| 	/* get version string */ | ||||
| 	v := eval_string(vm, "XLSX.version") | ||||
| 	fmt.Printf("SheetJS library version %s\n", v) | ||||
| 
 | ||||
| 	/* read file */ | ||||
| 	data, err := ioutil.ReadFile(os.Args[1]) | ||||
| 	if err != nil { panic(err) } | ||||
| 	vm.Set("buf", data) | ||||
| 	fmt.Printf("Loaded file %s\n", os.Args[1]) | ||||
| 
 | ||||
| 	/* parse workbook */ | ||||
| 	eval_string(vm, "var bstr = ''; for(var i = 0; i < buf.length; ++i) bstr += String.fromCharCode(buf[i]);") | ||||
| 	eval_string(vm, "wb = XLSX.read(bstr, {type:'binary', cellNF:true});") | ||||
| 	eval_string(vm, "ws = wb.Sheets[wb.SheetNames[0]]") | ||||
| 
 | ||||
| 	/* print CSV */ | ||||
| 	csv := eval_string(vm, "XLSX.utils.sheet_to_csv(ws)") | ||||
| 	fmt.Printf("%s\n", csv) | ||||
| 
 | ||||
| 	/* change cell A1 to 3 */ | ||||
| 	eval_string(vm, "ws['A1'].v = 3; delete ws['A1'].w;") | ||||
| 
 | ||||
| 	/* write file */ | ||||
| 	//write_type(vm, "xlsb")
 | ||||
| 	//write_type(vm, "xlsx")
 | ||||
| 	write_type(vm, "xls") | ||||
| 	write_type(vm, "csv") | ||||
| } | ||||
| @ -1,21 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| 
 | ||||
| let sheetjs = try SheetJSCore(); | ||||
| 
 | ||||
| try print(sheetjs.version()); | ||||
| 
 | ||||
| let filenames: [[String]] = [ | ||||
|   ["xlsx", "xlsx"], | ||||
|   ["xlsb", "xlsb"], | ||||
|   ["biff8.xls", "xls"], | ||||
|   ["xml.xls", "xlml"] | ||||
| ]; | ||||
| 
 | ||||
| for fn in filenames { | ||||
|   let wb: SJSWorkbook = try sheetjs.readFile(file: "sheetjs." + fn[0]); | ||||
|   let ws: SJSWorksheet = try wb.getSheetAtIndex(idx: 0); | ||||
|   let csv: String = try ws.toCSV(); | ||||
|   print(csv); | ||||
|   let wbout: String = try wb.writeBStr(bookType: fn[1]); | ||||
|   try wbout.write(toFile: "sheetjsswift." + fn[0], atomically: false, encoding: String.Encoding.isoLatin1); | ||||
| } | ||||
| @ -1,36 +0,0 @@ | ||||
| #!/usr/bin/env jjs
 | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| 
 | ||||
| /* load module */ | ||||
| var global = (function(){ return this; }).call(null); | ||||
| load('xlsx.full.min.js'); | ||||
| 
 | ||||
| /* helper to convert byte array to plain JS array */ | ||||
| function b2a(b) { | ||||
| 	var out = new Array(b.length); | ||||
| 	for(var i = 0; i < out.length; i++) out[i] = (b[i] < 0 ? b[i] + 256 : b[i]); | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| function process_file(path) { | ||||
| 	java.lang.System.out.println(path); | ||||
| 
 | ||||
| 	/* read file */ | ||||
| 	var path = java.nio.file.Paths.get(path); | ||||
| 	var bytes = java.nio.file.Files.readAllBytes(path); | ||||
| 	var u8a = b2a(bytes); | ||||
| 
 | ||||
| 	/* read data */ | ||||
| 	var wb = XLSX.read(u8a, {type:"array"}); | ||||
| 
 | ||||
| 	/* get first worksheet as an array of arrays */ | ||||
| 	var ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| 	var js = XLSX.utils.sheet_to_json(ws, {header:1}); | ||||
| 
 | ||||
| 	/* print out every line */ | ||||
| 	js.forEach(function(l) { java.lang.System.out.println(JSON.stringify(l)); }); | ||||
| } | ||||
| 
 | ||||
| process_file('sheetjs.xlsx'); | ||||
| process_file('sheetjs.xlsb'); | ||||
| process_file('sheetjs.biff8.xls'); | ||||
| @ -1,25 +0,0 @@ | ||||
| #!/usr/bin/env qjs
 | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| /* load XLSX */ | ||||
| std.global.global = std.global; | ||||
| std.loadScript("xlsx.full.min.js"); | ||||
| 
 | ||||
| /* read contents of file */ | ||||
| var rh = std.open("sheetjs.xlsx", "rb"); | ||||
| rh.seek(0, std.SEEK_END); | ||||
| var sz = rh.tell(); | ||||
| var ab = new ArrayBuffer(sz); | ||||
| rh.seek(); | ||||
| rh.read(ab, 0, sz); | ||||
| rh.close(); | ||||
| 
 | ||||
| /* parse file */ | ||||
| var wb = XLSX.read(ab, {type: 'array'}); | ||||
| 
 | ||||
| /* write array */ | ||||
| var out = XLSX.write(wb, {type: 'array'}); | ||||
| 
 | ||||
| /* write contents to file */ | ||||
| var wh = std.open("sheetjs.qjs.xlsx", "wb"); | ||||
| wh.write(out, 0, out.byteLength); | ||||
| wh.close(); | ||||
| @ -1,110 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "duktape.h" | ||||
| 
 | ||||
| #define FAIL_LOAD { \ | ||||
| 	duk_push_undefined(ctx); \ | ||||
| 	perror("Error in load_file"); \ | ||||
| 	return 1; \ | ||||
| } | ||||
| 
 | ||||
| static char *read_file(const char *filename, size_t *sz) { | ||||
| 	FILE *f = fopen(filename, "rb"); | ||||
| 	if(!f) return NULL; | ||||
| 	long fsize; { fseek(f, 0, SEEK_END); fsize = ftell(f); fseek(f, 0, SEEK_SET); } | ||||
| 	char *buf = (char *)malloc(fsize * sizeof(char)); | ||||
| 	*sz = fread((void *) buf, 1, fsize, f); | ||||
| 	fclose(f); | ||||
| 	return buf; | ||||
| } | ||||
| 
 | ||||
| static duk_int_t eval_file(duk_context *ctx, const char *filename) { | ||||
| 	size_t len; char *buf = read_file(filename, &len); | ||||
| 	if(!buf) FAIL_LOAD | ||||
| 
 | ||||
| 	duk_push_lstring(ctx, (const char *)buf, (duk_size_t)len); | ||||
| 	duk_int_t retval = duk_peval(ctx); | ||||
| 	duk_pop(ctx); | ||||
| 	return retval; | ||||
| } | ||||
| 
 | ||||
| static duk_int_t load_file(duk_context *ctx, const char *filename, const char *var) { | ||||
| 	size_t len; char *buf = read_file(filename, &len); | ||||
| 	if(!buf) FAIL_LOAD | ||||
| 
 | ||||
| 	duk_push_external_buffer(ctx); | ||||
| 	duk_config_buffer(ctx, -1, buf, len); | ||||
| 	duk_put_global_string(ctx, var); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static duk_int_t save_file(duk_context *ctx, const char *filename, const char *var) { | ||||
| 	duk_get_global_string(ctx, var); | ||||
| 	duk_size_t sz; | ||||
| 	char *buf = (char *)duk_get_buffer_data(ctx, -1, &sz); | ||||
| 
 | ||||
| 	if(!buf) return 1; | ||||
| 	FILE *f = fopen(filename, "wb"); fwrite(buf, 1, sz, f); fclose(f); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| #define FAIL(cmd) { \ | ||||
| 	printf("error in %s: %s\n", cmd, duk_safe_to_string(ctx, -1)); \ | ||||
| 	duk_destroy_heap(ctx); \ | ||||
| 	return res; \ | ||||
| } | ||||
| 
 | ||||
| #define DOIT(cmd) duk_eval_string_noresult(ctx, cmd); | ||||
| int main(int argc, char *argv[]) { | ||||
| 	duk_int_t res = 0; | ||||
| 
 | ||||
| 	/* initialize */ | ||||
| 	duk_context *ctx = duk_create_heap_default(); | ||||
| 	/* duktape does not expose a standard "global" by default */ | ||||
| 	DOIT("var global = (function(){ return this; }).call(null);"); | ||||
| 
 | ||||
| 	/* load library */ | ||||
| 	res = eval_file(ctx, "shim.min.js"); | ||||
| 	if(res != 0) FAIL("shim load") | ||||
| 	res = eval_file(ctx, "xlsx.full.min.js"); | ||||
| 	if(res != 0) FAIL("library load") | ||||
| 
 | ||||
| 	/* get version string */ | ||||
| 	duk_eval_string(ctx, "XLSX.version"); | ||||
| 	printf("SheetJS library version %s\n", duk_get_string(ctx, -1)); | ||||
| 	duk_pop(ctx); | ||||
| 
 | ||||
| 	/* read file */ | ||||
| 	res = load_file(ctx, argv[1], "buf"); | ||||
| 	if(res != 0) FAIL("file load") | ||||
| 	printf("Loaded file %s\n", argv[1]); | ||||
| 
 | ||||
| 	/* parse workbook */ | ||||
| 	DOIT("wb = XLSX.read(buf, {type:'buffer', cellNF:true});"); | ||||
| 	DOIT("ws = wb.Sheets[wb.SheetNames[0]]"); | ||||
| 
 | ||||
| 	/* print CSV */ | ||||
| 	duk_eval_string(ctx, "XLSX.utils.sheet_to_csv(ws)"); | ||||
| 	printf("%s\n", duk_get_string(ctx, -1)); | ||||
| 	duk_pop(ctx); | ||||
| 
 | ||||
| 	/* change cell A1 to 3 */ | ||||
| 	DOIT("ws['A1'].v = 3; delete ws['A1'].w;"); | ||||
| 
 | ||||
| 	/* write file */ | ||||
| #define WRITE_TYPE(BOOKTYPE) \ | ||||
| 	DOIT("newbuf = (XLSX.write(wb, {type:'array', bookType:'" BOOKTYPE "'}));");\ | ||||
| 	res = save_file(ctx, "sheetjsw." BOOKTYPE, "newbuf");\ | ||||
| 	if(res != 0) FAIL("save sheetjsw." BOOKTYPE) | ||||
| 
 | ||||
| 	WRITE_TYPE("xlsb") | ||||
| 	WRITE_TYPE("xlsx") | ||||
| 	WRITE_TYPE("xls") | ||||
| 	WRITE_TYPE("csv") | ||||
| 
 | ||||
| 	/* cleanup */ | ||||
| 	duk_destroy_heap(ctx); | ||||
| 	return res; | ||||
| } | ||||
| @ -1,14 +0,0 @@ | ||||
| # Showcase | ||||
| 
 | ||||
| Many use cases are too complex to summarize in a short demo.  The listed open | ||||
| source projects use SheetJS libraries in clever deployments. | ||||
| 
 | ||||
| ### vscode-data-preview | ||||
| 
 | ||||
| **Deployment**: Visual Studio Code Extension | ||||
| 
 | ||||
| **Website**: <https://marketplace.visualstudio.com/items?itemName=RandomFractalsInc.vscode-data-preview> | ||||
| 
 | ||||
| **Repository**: <https://github.com/RandomFractals/vscode-data-preview> | ||||
| 
 | ||||
| **Notes**: Demonstrates reading and writing files. | ||||
							
								
								
									
										3
									
								
								demos/webpack/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								demos/webpack/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,3 +0,0 @@ | ||||
| main.js | ||||
| main.min.js | ||||
| *.out.js | ||||
| @ -1,15 +0,0 @@ | ||||
| TOOL=webpack | ||||
| WPOPTS=--display-modules --display-reasons --profile --mode=development  | ||||
| .PHONY: all | ||||
| all: main.min.js core.out.js full.out.js app.out.js | ||||
| 
 | ||||
| main.min.js: main.out.js | ||||
| 	uglifyjs $< > $@ | ||||
| 
 | ||||
| .PHONY: main.out.js core.out.js full.out.js | ||||
| main.out.js core.out.js full.out.js: %.out.js: %.js | ||||
| 	webpack $< --output-filename $@ $(WPOPTS) | ||||
| 
 | ||||
| .PHONY: app.out.js | ||||
| app.out.js: webpack.app.js app.js appworker.js | ||||
| 	webpack --config $< $(WPOPTS) | ||||
| @ -1,110 +1,6 @@ | ||||
| # Webpack | ||||
| 
 | ||||
| This library is built with some dynamic logic to determine if it is invoked in a | ||||
| script tag or in nodejs.  Webpack does not understand those feature tests, so by | ||||
| default it will do some strange things. | ||||
| 
 | ||||
| ## Basic Usage | ||||
| 
 | ||||
| `webpack.app.js` demonstrates bundling an entire app script in a bundle.  For | ||||
| basic projects requiring the module from the npm package, it is sufficient to | ||||
| suppress the node shims: | ||||
| 
 | ||||
| ```js | ||||
| /* webpack config for app.out.js */ | ||||
| { | ||||
| 	/* entry point app.js */ | ||||
| 	entry: './app.js', | ||||
| 
 | ||||
| 	/* write to app.out.js */ | ||||
| 	output: { path:__dirname, filename: './app.out.js' }, | ||||
| 
 | ||||
| 	/* suppress node shims */ | ||||
| 	node: { | ||||
| 		process: false, | ||||
| 		Buffer: false | ||||
| 	} | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ## Suppressing the Node shims | ||||
| 
 | ||||
| The library properly guards against accidental leakage of node features in the | ||||
| browser but webpack disregards those.  The config should explicitly suppress: | ||||
| 
 | ||||
| ```js | ||||
| 	node: { | ||||
| 		process: false, | ||||
| 		Buffer: false | ||||
| 	} | ||||
| ``` | ||||
| 
 | ||||
| ## Omitting optional dependencies | ||||
| 
 | ||||
| The `codepage` is needed in certain special cases, including files generated by | ||||
| non-US-English versions of Excel, but may not be needed.  To reduce build size, | ||||
| the module can be omitted by aliasing the dependency: | ||||
| 
 | ||||
| ```js | ||||
| 	resolve: { | ||||
| 		alias: { "./dist/cpexcel.js": "" } | ||||
| 	}, | ||||
| ``` | ||||
| 
 | ||||
| Alternatively, bundling the `xlsx.core.min.js` script always omits dependencies. | ||||
| 
 | ||||
| ## Bower and minified versions | ||||
| 
 | ||||
| Webpack may show a message like "This seems to be a pre-built javascript file" | ||||
| when processing minified files (like the default Bower script).  The message is | ||||
| harmless.  To suppress the message, set `module.noParse` in the webpack config: | ||||
| 
 | ||||
| ```js | ||||
| 	module: { | ||||
| 		noParse: [ | ||||
| 			/xlsx.core.min.js/, | ||||
| 			/xlsx.full.min.js/ | ||||
| 		] | ||||
| 	} | ||||
| ``` | ||||
| 
 | ||||
| ## Other Demos | ||||
| 
 | ||||
| This demo also attempts to demonstrate bundling of the library as well as the | ||||
| core and full distribution versions.  `app.js` is the common app code (it will | ||||
| not be bundled).  The individual bundles merely wrap and reflect `XLSX`.  The | ||||
| app code uses the bundles with script tag inclusion in the main HTML files. The | ||||
| worker scripts use the bundles with `importScripts` references. | ||||
| 
 | ||||
| | required script |   HTML page |     entry |   worker script | | ||||
| |----------------:|------------:|----------:|----------------:| | ||||
| | main `xlsx` lib | `main.html` | `main.js` | `mainworker.js` | | ||||
| | `xlsx.core.min` | `core.html` | `core.js` | `coreworker.js` | | ||||
| | `xlsx.full.min` | `full.html` | `full.js` | `fullworker.js` | | ||||
| 
 | ||||
| The entry points in the demo merely require and re-export the library: | ||||
| 
 | ||||
| ```js | ||||
| /* main.js */ | ||||
| var XLSX = require('../../'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
| ``` | ||||
| 
 | ||||
| The main advantage of reflecting the library is deduplication: the library code | ||||
| is only downloaded once.  The basic example builds a separate worker script and | ||||
| eventually ships the library twice. | ||||
| 
 | ||||
| ### Reflecting the XLSX variable | ||||
| 
 | ||||
| This library will not assign to `module.exports` if it is run in the browser. To | ||||
| convince webpack, the demo webpack config sets `output`: | ||||
| 
 | ||||
| ```js | ||||
| 	output: { | ||||
| 		libraryTarget: 'var', | ||||
| 		library: 'XLSX' | ||||
| 	} | ||||
| ``` | ||||
| [The new demo](https://docs.sheetjs.com/docs/getting-started/demos/bundler#webpack) | ||||
| reflects the new default behavior to use the ESM build. | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,147 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| /*jshint browser:true */ | ||||
| /*global XLSX */ | ||||
| var X = typeof require !== "undefined" && require('../../') || XLSX; | ||||
| 
 | ||||
| var global_wb; | ||||
| 
 | ||||
| var process_wb = (function() { | ||||
| 	var OUT = document.getElementById('out'); | ||||
| 	var HTMLOUT = document.getElementById('htmlout'); | ||||
| 
 | ||||
| 	var get_format = (function() { | ||||
| 		var radios = document.getElementsByName( "format" ); | ||||
| 		return function() { | ||||
| 			for(var i = 0; i < radios.length; ++i) if(radios[i].checked || radios.length === 1) return radios[i].value; | ||||
| 		}; | ||||
| 	})(); | ||||
| 
 | ||||
| 	var to_json = function to_json(workbook) { | ||||
| 		var result = {}; | ||||
| 		workbook.SheetNames.forEach(function(sheetName) { | ||||
| 			var roa = X.utils.sheet_to_json(workbook.Sheets[sheetName]); | ||||
| 			if(roa.length) result[sheetName] = roa; | ||||
| 		}); | ||||
| 		return JSON.stringify(result, 2, 2); | ||||
| 	}; | ||||
| 
 | ||||
| 	var to_csv = function to_csv(workbook) { | ||||
| 		var result = []; | ||||
| 		workbook.SheetNames.forEach(function(sheetName) { | ||||
| 			var csv = X.utils.sheet_to_csv(workbook.Sheets[sheetName]); | ||||
| 			if(csv.length){ | ||||
| 				result.push("SHEET: " + sheetName); | ||||
| 				result.push(""); | ||||
| 				result.push(csv); | ||||
| 			} | ||||
| 		}); | ||||
| 		return result.join("\n"); | ||||
| 	}; | ||||
| 
 | ||||
| 	var to_fmla = function to_fmla(workbook) { | ||||
| 		var result = []; | ||||
| 		workbook.SheetNames.forEach(function(sheetName) { | ||||
| 			var formulae = X.utils.get_formulae(workbook.Sheets[sheetName]); | ||||
| 			if(formulae.length){ | ||||
| 				result.push("SHEET: " + sheetName); | ||||
| 				result.push(""); | ||||
| 				result.push(formulae.join("\n")); | ||||
| 			} | ||||
| 		}); | ||||
| 		return result.join("\n"); | ||||
| 	}; | ||||
| 
 | ||||
| 	var to_html = function to_html(workbook) { | ||||
| 		HTMLOUT.innerHTML = ""; | ||||
| 		workbook.SheetNames.forEach(function(sheetName) { | ||||
| 			var htmlstr = X.write(workbook, {sheet:sheetName, type:'string', bookType:'html'}); | ||||
| 			HTMLOUT.innerHTML += htmlstr; | ||||
| 		}); | ||||
| 		return ""; | ||||
| 	}; | ||||
| 
 | ||||
| 	return function process_wb(wb) { | ||||
| 		global_wb = wb; | ||||
| 		var output = ""; | ||||
| 		switch(get_format()) { | ||||
| 			case "form": output = to_fmla(wb); break; | ||||
| 			case "html": output = to_html(wb); break; | ||||
| 			case "json": output = to_json(wb); break; | ||||
| 			default: output = to_csv(wb); | ||||
| 		} | ||||
| 		if(OUT.innerText === undefined) OUT.textContent = output; | ||||
| 		else OUT.innerText = output; | ||||
| 		if(typeof console !== 'undefined') console.log("output", new Date()); | ||||
| 	}; | ||||
| })(); | ||||
| 
 | ||||
| var setfmt = window.setfmt = function setfmt() { if(global_wb) process_wb(global_wb); }; | ||||
| 
 | ||||
| var b64it = window.b64it = (function() { | ||||
| 	var tarea = document.getElementById('b64data'); | ||||
| 	return function b64it() { | ||||
| 		if(typeof console !== 'undefined') console.log("onload", new Date()); | ||||
| 		var wb = X.read(tarea.value, {type:'base64', WTF:false}); | ||||
| 		process_wb(wb); | ||||
| 	}; | ||||
| })(); | ||||
| 
 | ||||
| var do_file = (function() { | ||||
| 	var use_worker = typeof Worker !== 'undefined'; | ||||
| 	var domwork = document.getElementsByName("useworker")[0]; | ||||
| 	if(!use_worker) domwork.disabled = !(domwork.checked = false); | ||||
| 
 | ||||
| 	var xw = function xw(data, cb) { | ||||
| 		var worker = new Worker(XW.worker); | ||||
| 		worker.onmessage = function(e) { | ||||
| 			switch(e.data.t) { | ||||
| 				case 'ready': break; | ||||
| 				case 'e': console.error(e.data.d); break; | ||||
| 				case XW.msg: cb(JSON.parse(e.data.d)); break; | ||||
| 			} | ||||
| 		}; | ||||
| 		worker.postMessage({d:data,b:'array'}); | ||||
| 	}; | ||||
| 
 | ||||
| 	return function do_file(files) { | ||||
| 		use_worker = domwork.checked; | ||||
| 		var f = files[0]; | ||||
| 		var reader = new FileReader(); | ||||
| 		reader.onload = function(e) { | ||||
| 			if(typeof console !== 'undefined') console.log("onload", new Date(), use_worker); | ||||
| 			var data = e.target.result; | ||||
| 			data = new Uint8Array(data); | ||||
| 			if(use_worker) xw(data, process_wb); | ||||
| 			else process_wb(X.read(data, {type: 'array'})); | ||||
| 		}; | ||||
| 		reader.readAsArrayBuffer(f); | ||||
| 	}; | ||||
| })(); | ||||
| 
 | ||||
| (function() { | ||||
| 	var drop = document.getElementById('drop'); | ||||
| 	if(!drop.addEventListener) return; | ||||
| 
 | ||||
| 	function handleDrop(e) { | ||||
| 		e.stopPropagation(); | ||||
| 		e.preventDefault(); | ||||
| 		do_file(e.dataTransfer.files); | ||||
| 	} | ||||
| 
 | ||||
| 	function handleDragover(e) { | ||||
| 		e.stopPropagation(); | ||||
| 		e.preventDefault(); | ||||
| 		e.dataTransfer.dropEffect = 'copy'; | ||||
| 	} | ||||
| 
 | ||||
| 	drop.addEventListener('dragenter', handleDragover, false); | ||||
| 	drop.addEventListener('dragover', handleDragover, false); | ||||
| 	drop.addEventListener('drop', handleDrop, false); | ||||
| })(); | ||||
| 
 | ||||
| (function() { | ||||
| 	var xlf = document.getElementById('xlf'); | ||||
| 	if(!xlf.addEventListener) return; | ||||
| 	function handleFile(e) { do_file(e.target.files); } | ||||
| 	xlf.addEventListener('change', handleFile, false); | ||||
| })(); | ||||
| @ -1,11 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('../../'); | ||||
| postMessage({t:"ready"}); | ||||
| 
 | ||||
| onmessage = function (evt) { | ||||
|   var v; | ||||
|   try { | ||||
|     v = XLSX.read(evt.data.d, {type: evt.data.b}); | ||||
| postMessage({t:"xlsx", d:JSON.stringify(v)}); | ||||
|   } catch(e) { postMessage({t:"e",d:e.stack||e}); } | ||||
| }; | ||||
| @ -1,59 +0,0 @@ | ||||
| <!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> | ||||
| #drop{ | ||||
| 	border:2px dashed #bbb; | ||||
| 	-moz-border-radius:5px; | ||||
| 	-webkit-border-radius:5px; | ||||
| 	border-radius:5px; | ||||
| 	padding:25px; | ||||
| 	text-align:center; | ||||
| 	font:20pt bold,"Vollkorn";color:#bbb | ||||
| } | ||||
| #b64data{ | ||||
| 	width:100%; | ||||
| } | ||||
| a { text-decoration: none } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b> | ||||
| (Base64 text works back to IE6; drag and drop works back to IE10) | ||||
| 
 | ||||
| <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> | ||||
| Output Format: <select name="format" onchange="setfmt()"> | ||||
| <option value="csv" selected> CSV</option> | ||||
| <option value="json"> JSON</option> | ||||
| <option value="form"> FORMULAE</option> | ||||
| <option value="html"> HTML</option> | ||||
| </select><br /> | ||||
| <div id="drop">Drop a spreadsheet file here to see sheet data</div> | ||||
| <input type="file" name="xlfile" id="xlf" /> ... or click here to select a file | ||||
| 
 | ||||
| <textarea id="b64data">... or paste a base64-encoding here</textarea> | ||||
| <input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br /> | ||||
| <b>Advanced Demo Options:</b> | ||||
| Use Web Workers: (when available) <input type="checkbox" name="useworker" checked> | ||||
| </pre> | ||||
| <pre id="out"></pre> | ||||
| <div id="htmlout"></div> | ||||
| <br /> | ||||
| <script src="core.out.js"></script> | ||||
| <script> | ||||
| var XW = { | ||||
| 	/* worker message */ | ||||
| 	msg: 'xlsx', | ||||
| 	/* worker scripts */ | ||||
| 	worker: './coreworker.js' | ||||
| }; | ||||
| </script> | ||||
| <script src="app.js"></script> | ||||
| </body> | ||||
| </html> | ||||
| @ -1,4 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('./xlsx.core.min'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
| @ -1,11 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('core.out.js'); | ||||
| postMessage({t:"ready"}); | ||||
| 
 | ||||
| onmessage = function (evt) { | ||||
|   var v; | ||||
|   try { | ||||
|     v = XLSX.read(evt.data.d, {type: evt.data.b}); | ||||
| postMessage({t:"xlsx", d:JSON.stringify(v)}); | ||||
|   } catch(e) { postMessage({t:"e",d:e.stack||e}); } | ||||
| }; | ||||
| @ -1,59 +0,0 @@ | ||||
| <!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> | ||||
| #drop{ | ||||
| 	border:2px dashed #bbb; | ||||
| 	-moz-border-radius:5px; | ||||
| 	-webkit-border-radius:5px; | ||||
| 	border-radius:5px; | ||||
| 	padding:25px; | ||||
| 	text-align:center; | ||||
| 	font:20pt bold,"Vollkorn";color:#bbb | ||||
| } | ||||
| #b64data{ | ||||
| 	width:100%; | ||||
| } | ||||
| a { text-decoration: none } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b> | ||||
| (Base64 text works back to IE6; drag and drop works back to IE10) | ||||
| 
 | ||||
| <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> | ||||
| Output Format: <select name="format" onchange="setfmt()"> | ||||
| <option value="csv" selected> CSV</option> | ||||
| <option value="json"> JSON</option> | ||||
| <option value="form"> FORMULAE</option> | ||||
| <option value="html"> HTML</option> | ||||
| </select><br /> | ||||
| <div id="drop">Drop a spreadsheet file here to see sheet data</div> | ||||
| <input type="file" name="xlfile" id="xlf" /> ... or click here to select a file | ||||
| 
 | ||||
| <textarea id="b64data">... or paste a base64-encoding here</textarea> | ||||
| <input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br /> | ||||
| <b>Advanced Demo Options:</b> | ||||
| Use Web Workers: (when available) <input type="checkbox" name="useworker" checked> | ||||
| </pre> | ||||
| <pre id="out"></pre> | ||||
| <div id="htmlout"></div> | ||||
| <br /> | ||||
| <script src="full.out.js"></script> | ||||
| <script> | ||||
| var XW = { | ||||
| 	/* worker message */ | ||||
| 	msg: 'xlsx', | ||||
| 	/* worker scripts */ | ||||
| 	worker: './fullworker.js' | ||||
| }; | ||||
| </script> | ||||
| <script src="app.js"></script> | ||||
| </body> | ||||
| </html> | ||||
| @ -1,4 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('./xlsx.full.min'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
| @ -1,11 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('full.out.js'); | ||||
| postMessage({t:"ready"}); | ||||
| 
 | ||||
| onmessage = function (evt) { | ||||
|   var v; | ||||
|   try { | ||||
|     v = XLSX.read(evt.data.d, {type: evt.data.b}); | ||||
| postMessage({t:"xlsx", d:JSON.stringify(v)}); | ||||
|   } catch(e) { postMessage({t:"e",d:e.stack||e}); } | ||||
| }; | ||||
| @ -1,59 +0,0 @@ | ||||
| <!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> | ||||
| #drop{ | ||||
| 	border:2px dashed #bbb; | ||||
| 	-moz-border-radius:5px; | ||||
| 	-webkit-border-radius:5px; | ||||
| 	border-radius:5px; | ||||
| 	padding:25px; | ||||
| 	text-align:center; | ||||
| 	font:20pt bold,"Vollkorn";color:#bbb | ||||
| } | ||||
| #b64data{ | ||||
| 	width:100%; | ||||
| } | ||||
| a { text-decoration: none } | ||||
| </style> | ||||
| </head> | ||||
| <body> | ||||
| <pre> | ||||
| <b><a href="http://sheetjs.com">SheetJS Data Preview Live Demo</a></b> | ||||
| (Base64 text works back to IE6; drag and drop works back to IE10) | ||||
| 
 | ||||
| <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> | ||||
| Output Format: <select name="format" onchange="setfmt()"> | ||||
| <option value="csv" selected> CSV</option> | ||||
| <option value="json"> JSON</option> | ||||
| <option value="form"> FORMULAE</option> | ||||
| <option value="html"> HTML</option> | ||||
| </select><br /> | ||||
| <div id="drop">Drop a spreadsheet file here to see sheet data</div> | ||||
| <input type="file" name="xlfile" id="xlf" /> ... or click here to select a file | ||||
| 
 | ||||
| <textarea id="b64data">... or paste a base64-encoding here</textarea> | ||||
| <input type="button" id="dotext" value="Click here to process the base64 text" onclick="b64it();"/><br /> | ||||
| <b>Advanced Demo Options:</b> | ||||
| Use Web Workers: (when available) <input type="checkbox" name="useworker" checked> | ||||
| </pre> | ||||
| <pre id="out"></pre> | ||||
| <div id="htmlout"></div> | ||||
| <br /> | ||||
| <script src="main.min.js"></script> | ||||
| <script> | ||||
| var XW = { | ||||
| 	/* worker message */ | ||||
| 	msg: 'xlsx', | ||||
| 	/* worker scripts */ | ||||
| 	worker: './mainworker.js' | ||||
| }; | ||||
| </script> | ||||
| <script src="app.js"></script> | ||||
| </body> | ||||
| </html> | ||||
| @ -1,11 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ | ||||
| importScripts('main.min.js'); | ||||
| postMessage({t:"ready"}); | ||||
| 
 | ||||
| onmessage = function (evt) { | ||||
|   var v; | ||||
|   try { | ||||
|     v = XLSX.read(evt.data.d, {type: evt.data.b}); | ||||
| postMessage({t:"xlsx", d:JSON.stringify(v)}); | ||||
|   } catch(e) { postMessage({t:"e",d:e.stack||e}); } | ||||
| }; | ||||
| @ -1,4 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var XLSX = require('../../'); | ||||
| console.log("it works!"); | ||||
| module.exports = XLSX; | ||||
| @ -1,25 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| var commonops = { | ||||
| 	/* suppress node shims */ | ||||
| 	node: { | ||||
| 		process: false, | ||||
| 		Buffer: false | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /* app.out.js */ | ||||
| var app_config = Object.assign({ | ||||
| 	entry: './app.js', | ||||
| 	output: { path:__dirname, filename: './app.out.js' } | ||||
| }, commonops); | ||||
| 
 | ||||
| /* appworker.out.js */ | ||||
| var appworker_config = Object.assign({ | ||||
| 	entry: './appworker.js', | ||||
| 	output: { path:__dirname, filename: './appworker.out.js' } | ||||
| }, commonops); | ||||
| 
 | ||||
| module.exports = [ | ||||
| 	app_config, | ||||
| 	appworker_config | ||||
| ] | ||||
| @ -1,27 +0,0 @@ | ||||
| /* xlsx.js (C) 2013-present  SheetJS -- http://sheetjs.com */ | ||||
| module.exports = { | ||||
| 	/* ensure that the XLSX variable is exported */ | ||||
| 	output: { | ||||
| 		path: __dirname, | ||||
| 		libraryTarget: 'var', | ||||
| 		library: 'XLSX' | ||||
| 	}, | ||||
| 	/* module.noParse needed for bower */ | ||||
| 	module: { | ||||
| 		noParse: [ | ||||
| 			/xlsx.core.min.js/, | ||||
| 			/xlsx.full.min.js/ | ||||
| 		] | ||||
| 	}, | ||||
| 	/* Uncomment the next block to suppress codepage */ | ||||
| 	/* | ||||
| 	resolve: { | ||||
| 		alias: { "./dist/cpexcel.js": "" } | ||||
| 	}, | ||||
| 	*/ | ||||
| 	/* suppress node shims */ | ||||
| 	node: { | ||||
| 		process: false, | ||||
| 		Buffer: false | ||||
| 	} | ||||
| }; | ||||
							
								
								
									
										1
									
								
								demos/webpack/xlsx.core.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/webpack/xlsx.core.min.js
									
									
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | ||||
| ../../dist/xlsx.core.min.js | ||||
							
								
								
									
										1
									
								
								demos/webpack/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								demos/webpack/xlsx.full.min.js
									
									
									
									
										vendored
									
									
								
							| @ -1 +0,0 @@ | ||||
| ../../dist/xlsx.full.min.js | ||||
| @ -48,9 +48,7 @@ function Base64_encode_pass(input) { | ||||
| function Base64_decode(input) { | ||||
|   var o = ""; | ||||
|   var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; | ||||
|   input = input.replace(/^data:.+\/.+;base64\,/,'') | ||||
|                .replace(/[^\w\+\/\=]/g, "") | ||||
|    | ||||
|   input = input.replace(/^data:([^\/]+\/[^\/]+)?;base64\,/, "").replace(/[^\w\+\/\=]/g, ""); | ||||
|   for (var i = 0; i < input.length; ) { | ||||
|     e1 = Base64_map.indexOf(input.charAt(i++)); | ||||
|     e2 = Base64_map.indexOf(input.charAt(i++)); | ||||
|  | ||||
| @ -40,7 +40,7 @@ function Base64_encode_pass(input: string): string { | ||||
| function Base64_decode(input: string): string { | ||||
| 	var o = ""; | ||||
| 	var c1=0, c2=0, c3=0, e1=0, e2=0, e3=0, e4=0; | ||||
| 	input = input.replace(/^data:.+\/.+;base64\,/,'') | ||||
| 	input = input.replace(/^data:([^\/]+\/[^\/]+)?;base64\,/,'') | ||||
| 	             .replace(/[^\w\+\/\=]/g, "") | ||||
| 	for(var i = 0; i < input.length;) { | ||||
| 		e1 = Base64_map.indexOf(input.charAt(i++)); | ||||
|  | ||||
							
								
								
									
										33
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										33
									
								
								test.js
									
									
									
									
									
								
							| @ -688,30 +688,21 @@ describe('input formats', function() { | ||||
| 	it('should read base64 strings', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'base64'), {type: 'base64'}); | ||||
| 	}); }); | ||||
| 
 | ||||
| 	it('handles base64 within data URI scheme (gh-2762)', function() { | ||||
| 		// Arrange
 | ||||
| 		var fileInBase64 = 'TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 		var fileInBase64WithDataURIScheme = 'data:text/csv;base64,TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 		var data = 'TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 
 | ||||
| 		// Act
 | ||||
| 		var workBookFromRawBase64 = X.read(fileInBase64, { type: 'base64' }); | ||||
| 		var workBookFromBase64WithinDataURI = X.read(fileInBase64WithDataURIScheme, { type: 'base64' }); | ||||
| 		var wb0 = X.read(data, { type: 'base64' }); // raw base64 string
 | ||||
| 		var wb1 = X.read('data:;base64,' + data, { type: 'base64' }); // data URI, no media type
 | ||||
| 		var wb2 = X.read('data:text/csv;base64,' + data, { type: 'base64' }); // data URI, CSV type
 | ||||
| 		var wb3 = X.read('data:application/vnd.ms-excel;base64,' + data, { type: 'base64' }); // data URI, Excel
 | ||||
| 
 | ||||
| 		// Assert
 | ||||
| 		assert.deepStrictEqual(workBookFromRawBase64, workBookFromBase64WithinDataURI); | ||||
| 	}); | ||||
| 	it('handles base64 where data URI has no media type (gh-2762)', function() { | ||||
| 		// Arrange
 | ||||
| 		var fileInBase64 = 'TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 		var fileInBase64WithDataURIScheme = 'data:;base64,TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 
 | ||||
| 		// Act
 | ||||
| 		var workBookFromRawBase64 = X.read(fileInBase64, { type: 'base64' }); | ||||
| 		var workBookFromBase64WithinDataURI = X.read(fileInBase64WithDataURIScheme, { type: 'base64' }); | ||||
| 
 | ||||
| 		// Assert
 | ||||
| 		assert.deepStrictEqual(workBookFromRawBase64, workBookFromBase64WithinDataURI); | ||||
| 		[wb0, wb1, wb2, wb3].forEach(function(wb) { | ||||
| 			var ws = wb.Sheets.Sheet1; | ||||
| 			assert.equal(ws["!ref"], "A1:A3"); | ||||
| 			assert.equal(get_cell(ws, "A1").v, "Names"); | ||||
| 			assert.equal(get_cell(ws, "A2").v, "Hafez"); | ||||
| 			assert.equal(get_cell(ws, "A3").v, "Sam"); | ||||
| 		}); | ||||
| 	}); | ||||
| 	if(typeof Uint8Array !== 'undefined') it('should read array', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
|  | ||||
							
								
								
									
										20
									
								
								test.mjs
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										20
									
								
								test.mjs
									
									
									
										generated
									
									
									
								
							| @ -685,6 +685,22 @@ describe('input formats', function() { | ||||
| 	it('should read base64 strings', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'base64'), {type: 'base64'}); | ||||
| 	}); }); | ||||
| 	it('handles base64 within data URI scheme (gh-2762)', function() { | ||||
| 		var data = 'TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 
 | ||||
| 		var wb0 = X.read(data, { type: 'base64' }); // raw base64 string
 | ||||
| 		var wb1 = X.read('data:;base64,' + data, { type: 'base64' }); // data URI, no media type
 | ||||
| 		var wb2 = X.read('data:text/csv;base64,' + data, { type: 'base64' }); // data URI, CSV type
 | ||||
| 		var wb3 = X.read('data:application/vnd.ms-excel;base64,' + data, { type: 'base64' }); // data URI, Excel
 | ||||
| 
 | ||||
| 		[wb0, wb1, wb2, wb3].forEach(function(wb) { | ||||
| 			var ws = wb.Sheets.Sheet1; | ||||
| 			assert.equal(ws["!ref"], "A1:A3"); | ||||
| 			assert.equal(get_cell(ws, "A1").v, "Names"); | ||||
| 			assert.equal(get_cell(ws, "A2").v, "Hafez"); | ||||
| 			assert.equal(get_cell(ws, "A3").v, "Sam"); | ||||
| 		}); | ||||
| 	}); | ||||
| 	if(typeof Uint8Array !== 'undefined') it('should read array', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	}); }); | ||||
| @ -1384,7 +1400,7 @@ describe('parse features', function() { | ||||
| 	}); | ||||
| 
 | ||||
| 	describe('data types formats', function() {[ | ||||
| 		['xlsx', paths.dtfxlsx], | ||||
| 		['xlsx', paths.dtfxlsx] | ||||
| 	].forEach(function(m) { it(m[0], function() { | ||||
| 		var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true}); | ||||
| 		var ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| @ -2187,7 +2203,7 @@ describe('CSV', function() { | ||||
| 			var aoa = [ | ||||
| 				["3a", "3 a", "3 a-1"], | ||||
| 				["3b", "3 b", "3 b-1"], | ||||
| 				["3p", "3 P", "3 p-1"], | ||||
| 				["3p", "3 P", "3 p-1"] | ||||
| 			] | ||||
| 			var ws = X.read(aoa.map(function(row) { return row.join(","); }).join("\n"), {type: "string", cellDates: true}).Sheets.Sheet1; | ||||
| 			for(var R = 0; R < 3; ++R) { | ||||
|  | ||||
							
								
								
									
										16
									
								
								test.mts
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								test.mts
									
									
									
									
									
								
							| @ -702,6 +702,22 @@ describe('input formats', function() { | ||||
| 	it('should read base64 strings', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'base64'), {type: 'base64'}); | ||||
| 	}); }); | ||||
| 	it('handles base64 within data URI scheme (gh-2762)', function() { | ||||
| 		var data = 'TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 
 | ||||
| 		var wb0 = X.read(data, { type: 'base64' }); // raw base64 string
 | ||||
| 		var wb1 = X.read('data:;base64,' + data, { type: 'base64' }); // data URI, no media type
 | ||||
| 		var wb2 = X.read('data:text/csv;base64,' + data, { type: 'base64' }); // data URI, CSV type
 | ||||
| 		var wb3 = X.read('data:application/vnd.ms-excel;base64,' + data, { type: 'base64' }); // data URI, Excel
 | ||||
| 
 | ||||
| 		[wb0, wb1, wb2, wb3].forEach(function(wb) { | ||||
| 			var ws = wb.Sheets.Sheet1; | ||||
| 			assert.equal(ws["!ref"], "A1:A3"); | ||||
| 			assert.equal(get_cell(ws, "A1").v, "Names"); | ||||
| 			assert.equal(get_cell(ws, "A2").v, "Hafez"); | ||||
| 			assert.equal(get_cell(ws, "A3").v, "Sam"); | ||||
| 		}); | ||||
| 	}); | ||||
| 	if(typeof Uint8Array !== 'undefined') it('should read array', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	}); }); | ||||
|  | ||||
							
								
								
									
										16
									
								
								test.ts
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								test.ts
									
									
									
									
									
								
							| @ -702,6 +702,22 @@ Deno.test('input formats', async function(t) { | ||||
| 	await t.step('should read base64 strings', async function(t) { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'base64'), {type: 'base64'}); | ||||
| 	}); }); | ||||
| 	await t.step('handles base64 within data URI scheme (gh-2762)', async function(t) { | ||||
| 		var data = 'TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 
 | ||||
| 		var wb0 = X.read(data, { type: 'base64' }); // raw base64 string
 | ||||
| 		var wb1 = X.read('data:;base64,' + data, { type: 'base64' }); // data URI, no media type
 | ||||
| 		var wb2 = X.read('data:text/csv;base64,' + data, { type: 'base64' }); // data URI, CSV type
 | ||||
| 		var wb3 = X.read('data:application/vnd.ms-excel;base64,' + data, { type: 'base64' }); // data URI, Excel
 | ||||
| 
 | ||||
| 		[wb0, wb1, wb2, wb3].forEach(function(wb) { | ||||
| 			var ws = wb.Sheets.Sheet1; | ||||
| 			assert.equal(ws["!ref"], "A1:A3"); | ||||
| 			assert.equal(get_cell(ws, "A1").v, "Names"); | ||||
| 			assert.equal(get_cell(ws, "A2").v, "Hafez"); | ||||
| 			assert.equal(get_cell(ws, "A3").v, "Sam"); | ||||
| 		}); | ||||
| 	}); | ||||
| 	if(typeof Uint8Array !== 'undefined') await t.step('should read array', async function(t) { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	}); }); | ||||
|  | ||||
							
								
								
									
										16
									
								
								testnocp.ts
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16
									
								
								testnocp.ts
									
									
									
									
									
								
							| @ -701,6 +701,22 @@ Deno.test('input formats', async function(t) { | ||||
| 	await t.step('should read base64 strings', async function(t) { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'base64'), {type: 'base64'}); | ||||
| 	}); }); | ||||
| 	await t.step('handles base64 within data URI scheme (gh-2762)', async function(t) { | ||||
| 		var data = 'TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 
 | ||||
| 		var wb0 = X.read(data, { type: 'base64' }); // raw base64 string
 | ||||
| 		var wb1 = X.read('data:;base64,' + data, { type: 'base64' }); // data URI, no media type
 | ||||
| 		var wb2 = X.read('data:text/csv;base64,' + data, { type: 'base64' }); // data URI, CSV type
 | ||||
| 		var wb3 = X.read('data:application/vnd.ms-excel;base64,' + data, { type: 'base64' }); // data URI, Excel
 | ||||
| 
 | ||||
| 		[wb0, wb1, wb2, wb3].forEach(function(wb) { | ||||
| 			var ws = wb.Sheets.Sheet1; | ||||
| 			assert.equal(ws["!ref"], "A1:A3"); | ||||
| 			assert.equal(get_cell(ws, "A1").v, "Names"); | ||||
| 			assert.equal(get_cell(ws, "A2").v, "Hafez"); | ||||
| 			assert.equal(get_cell(ws, "A3").v, "Sam"); | ||||
| 		}); | ||||
| 	}); | ||||
| 	if(typeof Uint8Array !== 'undefined') await t.step('should read array', async function(t) { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	}); }); | ||||
|  | ||||
							
								
								
									
										20
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										20
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							| @ -688,6 +688,22 @@ describe('input formats', function() { | ||||
| 	it('should read base64 strings', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'base64'), {type: 'base64'}); | ||||
| 	}); }); | ||||
| 	it('handles base64 within data URI scheme (gh-2762)', function() { | ||||
| 		var data = 'TmFtZXMNCkhhZmV6DQpTYW0NCg=='; | ||||
| 
 | ||||
| 		var wb0 = X.read(data, { type: 'base64' }); // raw base64 string
 | ||||
| 		var wb1 = X.read('data:;base64,' + data, { type: 'base64' }); // data URI, no media type
 | ||||
| 		var wb2 = X.read('data:text/csv;base64,' + data, { type: 'base64' }); // data URI, CSV type
 | ||||
| 		var wb3 = X.read('data:application/vnd.ms-excel;base64,' + data, { type: 'base64' }); // data URI, Excel
 | ||||
| 
 | ||||
| 		[wb0, wb1, wb2, wb3].forEach(function(wb) { | ||||
| 			var ws = wb.Sheets.Sheet1; | ||||
| 			assert.equal(ws["!ref"], "A1:A3"); | ||||
| 			assert.equal(get_cell(ws, "A1").v, "Names"); | ||||
| 			assert.equal(get_cell(ws, "A2").v, "Hafez"); | ||||
| 			assert.equal(get_cell(ws, "A3").v, "Sam"); | ||||
| 		}); | ||||
| 	}); | ||||
| 	if(typeof Uint8Array !== 'undefined') it('should read array', function() { artifax.forEach(function(p) { | ||||
| 		X.read(fs.readFileSync(p, 'binary').split("").map(function(x) { return x.charCodeAt(0); }), {type:'array'}); | ||||
| 	}); }); | ||||
| @ -1393,7 +1409,7 @@ describe('parse features', function() { | ||||
| 	}); | ||||
| 
 | ||||
| 	describe('data types formats', function() {[ | ||||
| 		['xlsx', paths.dtfxlsx], | ||||
| 		['xlsx', paths.dtfxlsx] | ||||
| 	].forEach(function(m) { it(m[0], function() { | ||||
| 		var wb = X.read(fs.readFileSync(m[1]), {type: TYPE, cellDates: true}); | ||||
| 		var ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| @ -2200,7 +2216,7 @@ describe('CSV', function() { | ||||
| 			var aoa = [ | ||||
| 				["3a", "3 a", "3 a-1"], | ||||
| 				["3b", "3 b", "3 b-1"], | ||||
| 				["3p", "3 P", "3 p-1"], | ||||
| 				["3p", "3 P", "3 p-1"] | ||||
| 			] | ||||
| 			var ws = X.read(aoa.map(function(row) { return row.join(","); }).join("\n"), {type: "string", cellDates: true}).Sheets.Sheet1; | ||||
| 			for(var R = 0; R < 3; ++R) { | ||||
|  | ||||
| @ -133,7 +133,7 @@ function Base64_encode_pass(input) { | ||||
| function Base64_decode(input) { | ||||
|   var o = ""; | ||||
|   var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; | ||||
|   input = input.replace(/[^\w\+\/\=]/g, ""); | ||||
|   input = input.replace(/^data:([^\/]+\/[^\/]+)?;base64\,/, "").replace(/[^\w\+\/\=]/g, ""); | ||||
|   for (var i = 0; i < input.length; ) { | ||||
|     e1 = Base64_map.indexOf(input.charAt(i++)); | ||||
|     e2 = Base64_map.indexOf(input.charAt(i++)); | ||||
| @ -19310,6 +19310,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 		if(RecordType === 0 && last_RT === 0x000a /* EOF */) break; | ||||
| 		var length = (blob.l === blob.length ? 0 : blob.read_shift(2)); | ||||
| 		var R = XLSRecordEnum[RecordType]; | ||||
| 		if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(RecordType) == -1 /* BOF */) break; | ||||
| 		//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
 | ||||
| 		//if(!R) console.log(blob.slice(blob.l, blob.l + length));
 | ||||
| 		if(R && R.f) { | ||||
|  | ||||
							
								
								
									
										3
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							| @ -132,7 +132,7 @@ function Base64_encode_pass(input) { | ||||
| function Base64_decode(input) { | ||||
|   var o = ""; | ||||
|   var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; | ||||
|   input = input.replace(/[^\w\+\/\=]/g, ""); | ||||
|   input = input.replace(/^data:([^\/]+\/[^\/]+)?;base64\,/, "").replace(/[^\w\+\/\=]/g, ""); | ||||
|   for (var i = 0; i < input.length; ) { | ||||
|     e1 = Base64_map.indexOf(input.charAt(i++)); | ||||
|     e2 = Base64_map.indexOf(input.charAt(i++)); | ||||
| @ -19204,6 +19204,7 @@ function parse_workbook(blob, options) { | ||||
| 		if(RecordType === 0 && last_RT === 0x000a /* EOF */) break; | ||||
| 		var length = (blob.l === blob.length ? 0 : blob.read_shift(2)); | ||||
| 		var R = XLSRecordEnum[RecordType]; | ||||
| 		if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(RecordType) == -1 /* BOF */) break; | ||||
| 		//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
 | ||||
| 		//if(!R) console.log(blob.slice(blob.l, blob.l + length));
 | ||||
| 		if(R && R.f) { | ||||
|  | ||||
							
								
								
									
										3
									
								
								xlsx.mjs
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								xlsx.mjs
									
									
									
										generated
									
									
									
								
							| @ -132,7 +132,7 @@ function Base64_encode_pass(input) { | ||||
| function Base64_decode(input) { | ||||
|   var o = ""; | ||||
|   var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0; | ||||
|   input = input.replace(/[^\w\+\/\=]/g, ""); | ||||
|   input = input.replace(/^data:([^\/]+\/[^\/]+)?;base64\,/, "").replace(/[^\w\+\/\=]/g, ""); | ||||
|   for (var i = 0; i < input.length; ) { | ||||
|     e1 = Base64_map.indexOf(input.charAt(i++)); | ||||
|     e2 = Base64_map.indexOf(input.charAt(i++)); | ||||
| @ -19305,6 +19305,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ { | ||||
| 		if(RecordType === 0 && last_RT === 0x000a /* EOF */) break; | ||||
| 		var length = (blob.l === blob.length ? 0 : blob.read_shift(2)); | ||||
| 		var R = XLSRecordEnum[RecordType]; | ||||
| 		if(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(RecordType) == -1 /* BOF */) break; | ||||
| 		//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);
 | ||||
| 		//if(!R) console.log(blob.slice(blob.l, blob.l + length));
 | ||||
| 		if(R && R.f) { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user