forked from sheetjs/sheetjs
		
	version bump 0.12.0: extendscript fixes
- ExtendScript write quirks (fixes #986 h/t @grefel) - BIFF8 write number formats (fixes #987 h/t @scwood) - xlsx.extendscript.js library script - readFile / writeFile support ExtendScript - flow update
This commit is contained in:
		
							parent
							
								
									fb97bf1768
								
							
						
					
					
						commit
						f002afae4b
					
				| @ -36,3 +36,6 @@ module.file_ext=.js | ||||
| module.file_ext=.njs | ||||
| module.ignore_non_literal_requires=true | ||||
| suppress_comment= \\(.\\|\n\\)*\\$FlowIgnore | ||||
| 
 | ||||
| [lints] | ||||
| deprecated-declare-exports=off | ||||
|  | ||||
| @ -4,7 +4,11 @@ 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. | ||||
| 
 | ||||
| ## 0.11.19 | ||||
| ## 0.12.0 (2018-02-08) | ||||
| 
 | ||||
| * Extendscript target script in NPM package  | ||||
| 
 | ||||
| ## 0.11.19 (2018-02-03) | ||||
| 
 | ||||
| * Error on empty workbook | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										3
									
								
								Makefile
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3
									
								
								Makefile
									
									
									
									
									
								
							| @ -63,6 +63,7 @@ dist: dist-deps $(TARGET) bower.json ## Prepare JS files for distribution | ||||
| 	misc/strip_sourcemap.sh dist/$(LIB).core.min.js | ||||
| 	uglifyjs $(DISTHDR) $(REQS) $(ADDONS) dist/$(TARGET) $(AUXTARGETS) $(UGLIFYOPTS) -o dist/$(LIB).full.min.js --source-map dist/$(LIB).full.min.map --preamble "$$(head -n 1 bits/00_header.js)" | ||||
| 	misc/strip_sourcemap.sh dist/$(LIB).full.min.js | ||||
| 	cat <(head -n 1 bits/00_header.js) shim.js $(DISTHDR) $(REQS) dist/$(TARGET) > dist/$(LIB).extendscript.js | ||||
| 
 | ||||
| .PHONY: dist-deps | ||||
| dist-deps: ## Copy dependencies for distribution
 | ||||
| @ -73,7 +74,7 @@ dist-deps: ## Copy dependencies for distribution | ||||
| .PHONY: aux | ||||
| aux: $(AUXTARGETS) | ||||
| 
 | ||||
| BYTEFILE=dist/xlsx.min.js dist/xlsx.{core,full}.min.js | ||||
| BYTEFILE=dist/xlsx.min.js dist/xlsx.{core,full}.min.js dist/xlsx.extendscript.js | ||||
| .PHONY: bytes | ||||
| bytes: ## Display minified and gzipped file sizes
 | ||||
| 	for i in $(BYTEFILE); do printj "%-30s %7d %10d" $$i $$(wc -c < $$i) $$(gzip --best --stdout $$i | wc -c); done | ||||
|  | ||||
							
								
								
									
										34
									
								
								README.md
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										34
									
								
								README.md
									
									
									
									
									
								
							| @ -316,6 +316,23 @@ var workbook = XLSX.readFile('test.xlsx'); | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Photoshop ExtendScript read a file</b> (click to show)</summary> | ||||
| 
 | ||||
| `readFile` wraps the `File` logic in Photoshop and other ExtendScript targets. | ||||
| The specified path should be an absolute path: | ||||
| 
 | ||||
| ```js | ||||
| #include "xlsx.extendscript.js" | ||||
| /* Read test.xlsx from the Documents folder */ | ||||
| var workbook = XLSX.readFile(Folder.myDocuments + '/' + 'test.xlsx'); | ||||
| /* DO SOMETHING WITH workbook HERE */ | ||||
| ``` | ||||
| 
 | ||||
| The [`extendscript` demo](demos/extendscript/) includes a more complex example. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Browser read TABLE element from page</b> (click to show)</summary> | ||||
| 
 | ||||
| @ -604,6 +621,23 @@ XLSX.writeFile(workbook, 'out.xlsb'); | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Photoshop ExtendScript write a file</b> (click to show)</summary> | ||||
| 
 | ||||
| `writeFile` wraps the `File` logic in Photoshop and other ExtendScript targets. | ||||
| The specified path should be an absolute path: | ||||
| 
 | ||||
| ```js | ||||
| #include "xlsx.extendscript.js" | ||||
| /* output format determined by filename */ | ||||
| XLSX.writeFile(workbook, 'out.xlsx'); | ||||
| /* at this point, out.xlsx is a file that you can distribute */ | ||||
| ``` | ||||
| 
 | ||||
| The [`extendscript` demo](demos/extendscript/) includes a more complex example. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Browser add TABLE element to page</b> (click to show)</summary> | ||||
| 
 | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| XLSX.version = '0.11.19'; | ||||
| XLSX.version = '0.12.0'; | ||||
|  | ||||
| @ -9,7 +9,7 @@ function blobify(data) { | ||||
| } | ||||
| /* write or download file */ | ||||
| function write_dl(fname/*:string*/, payload/*:any*/, enc/*:?string*/) { | ||||
| 	/*global IE_SaveFile, Blob, navigator, saveAs, URL, document */ | ||||
| 	/*global IE_SaveFile, Blob, navigator, saveAs, URL, document, File */ | ||||
| 	if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload); | ||||
| 	var data = (enc == "utf8") ? utf8write(payload) : payload; | ||||
| 	/*:: declare var IE_SaveFile: any; */ | ||||
| @ -32,6 +32,25 @@ function write_dl(fname/*:string*/, payload/*:any*/, enc/*:?string*/) { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	throw new Error("cannot initiate download"); | ||||
| 	// $FlowIgnore
 | ||||
| 	if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
 | ||||
| 		// $FlowIgnore
 | ||||
| 		var out = File(fname); out.open("w"); out.encoding = "binary"; | ||||
| 		if(Array.isArray(payload)) payload = a2s(payload); | ||||
| 		out.write(payload); out.close(); return payload; | ||||
| 	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } | ||||
| 	throw new Error("cannot save file " + fname); | ||||
| } | ||||
| 
 | ||||
| /* read binary data from file */ | ||||
| function read_binary(path/*:string*/) { | ||||
| 	if(typeof _fs !== 'undefined') return _fs.readFileSync(path); | ||||
| 	// $FlowIgnore
 | ||||
| 	if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
 | ||||
| 		// $FlowIgnore
 | ||||
| 		var infile = File(path); infile.open("r"); infile.encoding = "binary"; | ||||
| 		var data = infile.read(); infile.close(); | ||||
| 		return data; | ||||
| 	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } | ||||
| 	throw new Error("Cannot access file " + path); | ||||
| } | ||||
|  | ||||
| @ -3,25 +3,25 @@ function read_double_le(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { | ||||
| 	var e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f); | ||||
| 	var m = (b[idx+6]&0x0f); | ||||
| 	for(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i]; | ||||
| 	if(e == 0x7ff) return m == 0 ? s * Infinity : NaN; | ||||
| 	if(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN; | ||||
| 	if(e == 0) e = -1022; | ||||
| 	else { e -= 1023; m += Math.pow(2,52); } | ||||
| 	return s * Math.pow(2, e - 52) * m; | ||||
| } | ||||
| 
 | ||||
| function write_double_le(b/*:RawBytes|CFBlob*/, v/*:number*/, idx/*:number*/) { | ||||
| 	var bs = ((v < 0 || 1/v == -Infinity) ? 1 : 0) << 7, e = 0, m = 0; | ||||
| 	var av = bs ? -v : v; | ||||
| 	var bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0; | ||||
| 	var av = bs ? (-v) : v; | ||||
| 	if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; } | ||||
| 	else if(av == 0) e = m = 0; | ||||
| 	else { | ||||
| 		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; } | ||||
| 		if((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; } | ||||
| 		else { m -= Math.pow(2,52); e+=1023; } | ||||
| 	} | ||||
| 	for(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff; | ||||
| 	b[idx + 6] = ((e & 0x0f) << 4) | m & 0xf; | ||||
| 	b[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf); | ||||
| 	b[idx + 7] = (e >> 4) | bs; | ||||
| } | ||||
| 
 | ||||
| @ -73,8 +73,8 @@ if(typeof cptable !== 'undefined') { | ||||
| } | ||||
| 
 | ||||
| var __readUInt8 = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx]; }; | ||||
| var __readUInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx+1]*(1<<8)+b[idx]; }; | ||||
| var __readInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; }; | ||||
| var __readUInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+1]*(1<<8))+b[idx]; }; | ||||
| var __readInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); }; | ||||
| var __readUInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; }; | ||||
| var __readInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; }; | ||||
| var __readInt32BE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; }; | ||||
| @ -85,7 +85,7 @@ function ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ { | ||||
| 		case 'dbcs': | ||||
| 			loc = this.l; | ||||
| 			if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le"); | ||||
| 			else for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | ||||
| 			else for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | ||||
| 			size *= 2; | ||||
| 			break; | ||||
| 
 | ||||
| @ -116,7 +116,7 @@ function ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ { | ||||
| 
 | ||||
| 		/* sbcs and dbcs support continue records in the SST way TODO codepages */ | ||||
| 		case 'dbcs-cont': o = ""; loc = this.l; | ||||
| 			for(i = 0; i != size; ++i) { | ||||
| 			for(i = 0; i < size; ++i) { | ||||
| 				if(this.lens && this.lens.indexOf(loc) !== -1) { | ||||
| 					w = __readUInt8(this, loc); | ||||
| 					this.l = loc + 1; | ||||
| @ -150,7 +150,7 @@ function ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ { | ||||
| 		case 1: oI = __readUInt8(this, this.l); this.l++; return oI; | ||||
| 		case 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI; | ||||
| 		case 4: case -4: | ||||
| 			if(t === 'i' || (this[this.l+3] & 0x80)===0) { oI = (size > 0 ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } | ||||
| 			if(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } | ||||
| 			else { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR; | ||||
| 		case 8: case -8: | ||||
| 			if(t === 'f') { | ||||
| @ -179,20 +179,20 @@ function WriteShift(t/*:number*/, val/*:string|number*/, f/*:?string*/)/*:any*/ | ||||
| 		/*:: if(typeof val !== 'string') throw new Error("unreachable"); */ | ||||
| 		val = val.replace(/[^\x00-\x7F]/g, "_"); | ||||
| 		/*:: if(typeof val !== 'string') throw new Error("unreachable"); */ | ||||
| 		for(i = 0; i != val.length; ++i) this[this.l + i] = val.charCodeAt(i) & 0xFF; | ||||
| 		for(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF); | ||||
| 		size = val.length; | ||||
| 	} else if(f === 'hex') { | ||||
| 		for(; i < t; ++i) { | ||||
| 			/*:: if(typeof val !== "string") throw new Error("unreachable"); */ | ||||
| 			this[this.l++] = parseInt(val.slice(2*i, 2*i+2), 16)||0; | ||||
| 			this[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0); | ||||
| 		} return this; | ||||
| 	} else if(f === 'utf16le') { | ||||
| 			/*:: if(typeof val !== "string") throw new Error("unreachable"); */ | ||||
| 			var end/*:number*/ = this.l + t; | ||||
| 			for(i = 0; i < Math.min(val.length, t); ++i) { | ||||
| 				var cc = val.charCodeAt(i); | ||||
| 				this[this.l++] = cc & 0xff; | ||||
| 				this[this.l++] = cc >> 8; | ||||
| 				this[this.l++] = (cc & 0xff); | ||||
| 				this[this.l++] = (cc >> 8); | ||||
| 			} | ||||
| 			while(this.l < end) this[this.l++] = 0; | ||||
| 			return this; | ||||
|  | ||||
| @ -31,13 +31,13 @@ function buf_array()/*:BufArray*/ { | ||||
| 
 | ||||
| 	var endbuf = function ba_endbuf() { | ||||
| 		if(!curbuf) return; | ||||
| 		if(curbuf.length > curbuf.l) curbuf = curbuf.slice(0, curbuf.l); | ||||
| 		if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } | ||||
| 		if(curbuf.length > 0) bufs.push(curbuf); | ||||
| 		curbuf = null; | ||||
| 	}; | ||||
| 
 | ||||
| 	var next = function ba_next(sz/*:number*/)/*:Block*/ { | ||||
| 		if(curbuf && sz < curbuf.length - curbuf.l) return curbuf; | ||||
| 		if(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf; | ||||
| 		endbuf(); | ||||
| 		return (curbuf = newblk(Math.max(sz+1, blksz))); | ||||
| 	}; | ||||
| @ -47,7 +47,7 @@ function buf_array()/*:BufArray*/ { | ||||
| 		return __toBuffer([bufs]); | ||||
| 	}; | ||||
| 
 | ||||
| 	var push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); }; | ||||
| 	var push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); }; | ||||
| 
 | ||||
| 	return ({ next:next, push:push, end:end, _bufs:bufs }/*:any*/); | ||||
| } | ||||
|  | ||||
| @ -112,17 +112,17 @@ var write_RelID = write_XLNullableWideString; | ||||
| /* [MS-XLS] 2.5.217 */ | ||||
| function parse_RkNumber(data)/*:number*/ { | ||||
| 	var b = data.slice(data.l, data.l+4); | ||||
| 	var fX100 = b[0] & 1, fInt = b[0] & 2; | ||||
| 	var fX100 = (b[0] & 1), fInt = (b[0] & 2); | ||||
| 	data.l+=4; | ||||
| 	b[0] &= 0xFC; // b[0] &= ~3;
 | ||||
| 	var RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2; | ||||
| 	return fX100 ? RK/100 : RK; | ||||
| 	return fX100 ? (RK/100) : RK; | ||||
| } | ||||
| function write_RkNumber(data/*:number*/, o) { | ||||
| 	if(o == null) o = new_buf(4); | ||||
| 	var fX100 = 0, fInt = 0, d100 = data * 100; | ||||
| 	if(data == (data | 0) && data >= -(1<<29) && data < (1 << 29)) { fInt = 1; } | ||||
| 	else if(d100 == (d100 | 0) && d100 >= -(1<<29) && d100 < (1 << 29)) { fInt = 1; fX100 = 1; } | ||||
| 	if((data == (data | 0)) && (data >= -(1<<29)) && (data < (1 << 29))) { fInt = 1; } | ||||
| 	else if((d100 == (d100 | 0)) && (d100 >= -(1<<29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; } | ||||
| 	if(fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2)); | ||||
| 	else throw new Error("unsupported RkNumber " + data); // TODO
 | ||||
| } | ||||
|  | ||||
| @ -249,7 +249,8 @@ function write_BoundSheet8(data, opts) { | ||||
| 	o.write_shift(1, data.name.length); | ||||
| 	if(opts.biff >= 8) o.write_shift(1, 1); | ||||
| 	o.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le'); | ||||
| 	return o.slice(0, o.l); | ||||
| 	var out = o.slice(0, o.l); | ||||
| 	out.l = o.l; return out; | ||||
| } | ||||
| 
 | ||||
| /* 2.4.265 TODO */ | ||||
| @ -393,10 +394,10 @@ function parse_Label(blob, length, opts) { | ||||
| 	cell.val = str; | ||||
| 	return cell; | ||||
| } | ||||
| function write_Label(R/*:number*/, C/*:number*/, v/*:string*/, opts) { | ||||
| function write_Label(R/*:number*/, C/*:number*/, v/*:string*/, os/*:number*/, opts) { | ||||
| 	var b8 = !opts || opts.biff == 8; | ||||
| 	var o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	o.write_shift(2, v.length); | ||||
| 	if(b8) o.write_shift(1, 1); | ||||
| 	o.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs'); | ||||
| @ -410,6 +411,14 @@ function parse_Format(blob, length, opts) { | ||||
| 	var fmtstr = parse_XLUnicodeString2(blob, 0, opts); | ||||
| 	return [numFmtId, fmtstr]; | ||||
| } | ||||
| function write_Format(i/*:number*/, f/*:string*/, o) { | ||||
| 	if(!o) o = new_buf(6 + 4 * f.length); | ||||
| 	o.write_shift(2, i); | ||||
| 	write_XLUnicodeString(f, null, o); | ||||
| 	var out = (o.length > o.l) ? o.slice(0, o.l) : o; | ||||
| 	if(o.l == null) o.l = o.length; | ||||
| 	return out; | ||||
| } | ||||
| var parse_BIFF2Format = parse_XLUnicodeString2; | ||||
| 
 | ||||
| /* 2.4.90 */ | ||||
| @ -515,6 +524,17 @@ function parse_XF(blob, length, opts) { | ||||
| 	o.data = parse_CellStyleXF(blob, length, o.fStyle, opts); | ||||
| 	return o; | ||||
| } | ||||
| function write_XF(data, ixfeP, o) { | ||||
| 	if(!o) o = new_buf(20); | ||||
| 	o.write_shift(2, 0); | ||||
| 	o.write_shift(2, data.numFmtId||0); | ||||
| 	o.write_shift(2, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(2, 0); | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| /* 2.4.134 */ | ||||
| function parse_Guts(blob) { | ||||
| @ -542,9 +562,9 @@ function parse_BoolErr(blob, length, opts) { | ||||
| 	cell.t = (val === true || val === false) ? 'b' : 'e'; | ||||
| 	return cell; | ||||
| } | ||||
| function write_BoolErr(R/*:number*/, C/*:number*/, v, opts, t/*:string*/) { | ||||
| function write_BoolErr(R/*:number*/, C/*:number*/, v, os/*:number*/, opts, t/*:string*/) { | ||||
| 	var o = new_buf(8); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	write_Bes(v, t, o); | ||||
| 	return o; | ||||
| } | ||||
| @ -556,9 +576,9 @@ function parse_Number(blob) { | ||||
| 	cell.val = xnum; | ||||
| 	return cell; | ||||
| } | ||||
| function write_Number(R/*:number*/, C/*:number*/, v/*::, opts*/) { | ||||
| function write_Number(R/*:number*/, C/*:number*/, v, os/*:: :number, opts*/) { | ||||
| 	var o = new_buf(14); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	write_Xnum(v, o); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| @ -460,7 +460,7 @@ var SYLK = (function() { | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C]: ws[coord]; | ||||
| 				if(!cell || cell.v == null && (!cell.f || cell.F)) continue; | ||||
| 				if(!cell || (cell.v == null && (!cell.f || cell.F))) continue; | ||||
| 				o.push(write_ws_cell_sylk(cell, ws, R, C, opts)); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| @ -8,7 +8,9 @@ function write_BrtFmt(i/*:number*/, f/*:string*/, o) { | ||||
| 	if(!o) o = new_buf(6 + 4 * f.length); | ||||
| 	o.write_shift(2, i); | ||||
| 	write_XLWideString(f, o); | ||||
| 	return o.length > o.l ? o.slice(0, o.l) : o; | ||||
| 	var out = (o.length > o.l) ? o.slice(0, o.l) : o; | ||||
| 	if(o.l == null) o.l = o.length; | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.4.653 BrtFont TODO */ | ||||
|  | ||||
| @ -3,7 +3,7 @@ function make_vba_xls(cfb/*:CFBContainer*/) { | ||||
| 	var newcfb = CFB.utils.cfb_new({root:"R"}); | ||||
| 	cfb.FullPaths.forEach(function(p, i) { | ||||
| 		if(p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/)) return; | ||||
| 		var newpath = p.replace(/^[^/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); | ||||
| 		var newpath = p.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); | ||||
| 		CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content); | ||||
| 	}); | ||||
| 	return CFB.write(newcfb); | ||||
| @ -12,7 +12,7 @@ function make_vba_xls(cfb/*:CFBContainer*/) { | ||||
| function fill_vba_xls(cfb/*:CFBContainer*/, vba/*:CFBContainer*/)/*:void*/ { | ||||
| 	vba.FullPaths.forEach(function(p, i) { | ||||
| 		if(i == 0) return; | ||||
| 		var newpath = p.replace(/[^/]*[/]/, "/_VBA_PROJECT_CUR/"); | ||||
| 		var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/"); | ||||
| 		if(newpath.slice(-1) !== "/") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content); | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| @ -429,7 +429,7 @@ function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook | ||||
| 			if(_cell === undefined) continue; | ||||
| 			if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell); | ||||
| 		} | ||||
| 		if(r.length > 0 || rows && rows[R]) { | ||||
| 		if(r.length > 0 || (rows && rows[R])) { | ||||
| 			params = ({r:rr}/*:any*/); | ||||
| 			if(rows && rows[R]) { | ||||
| 				row = rows[R]; | ||||
|  | ||||
| @ -42,7 +42,7 @@ function write_BrtRowHdr(R/*:number*/, range, ws) { | ||||
| 
 | ||||
| 	var caddr = {r:R, c:0}; | ||||
| 	for(var i = 0; i < 16; ++i) { | ||||
| 		if(range.s.c > ((i+1) << 10) || range.e.c < (i << 10)) continue; | ||||
| 		if((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue; | ||||
| 		var first = -1, last = -1; | ||||
| 		for(var j = (i<<10); j < ((i+1)<<10); ++j) { | ||||
| 			caddr.c = j; | ||||
| @ -64,7 +64,7 @@ function write_BrtRowHdr(R/*:number*/, range, ws) { | ||||
| } | ||||
| function write_row_header(ba, ws, range, R) { | ||||
| 	var o = write_BrtRowHdr(R, range, ws); | ||||
| 	if(o.length > 17 || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o); | ||||
| 	if((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o); | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.4.812 BrtWsDim */ | ||||
|  | ||||
| @ -1013,7 +1013,7 @@ function write_ws_xlml_comment(comments/*:Array<any>*/)/*:string*/ { | ||||
| 	}).join(""); | ||||
| } | ||||
| function write_ws_xlml_cell(cell, ref/*:string*/, ws, opts, idx/*:number*/, wb, addr)/*:string*/{ | ||||
| 	if(!cell || cell.v == undefined && cell.f == undefined) return ""; | ||||
| 	if(!cell || (cell.v == undefined && cell.f == undefined)) return ""; | ||||
| 
 | ||||
| 	var attr = {}; | ||||
| 	if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); | ||||
|  | ||||
| @ -84,6 +84,19 @@ function write_biff2_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) { | ||||
| 	return ba.end(); | ||||
| } | ||||
| 
 | ||||
| function write_FMTS_biff8(ba, NF/*:?SSFTable*/) { | ||||
| 	if(!NF) return; | ||||
| 	[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) { | ||||
| 		/*:: if(!NF) return; */ | ||||
| 		for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_biff_rec(ba, "Format", write_Format(i, NF[i])); | ||||
| 	}); | ||||
| } | ||||
| function write_CELLXFS_biff8(ba, data) { | ||||
| 	data.forEach(function(c) { | ||||
| 		write_biff_rec(ba, "XF", write_XF(c,0)); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff8_hlinks(ba/*:BufArray*/, ws) { | ||||
| 	for(var R=0; R<ws['!links'].length; ++R) { | ||||
| 		var HL = ws['!links'][R]; | ||||
| @ -94,19 +107,20 @@ function write_ws_biff8_hlinks(ba/*:BufArray*/, ws) { | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff8_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*/, opts) { | ||||
| 	var os = get_cell_style(opts.cellXfs, cell, opts); | ||||
| 	if(cell.v != null) switch(cell.t) { | ||||
| 		case 'd': case 'n': | ||||
| 			var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v; | ||||
| 			/* TODO: emit RK as appropriate */ | ||||
| 			write_biff_rec(ba, "Number", write_Number(R, C, v, opts)); | ||||
| 			write_biff_rec(ba, "Number", write_Number(R, C, v, os, opts)); | ||||
| 			return; | ||||
| 		case 'b': case 'e': write_biff_rec(ba, "BoolErr", write_BoolErr(R, C, cell.v, opts, cell.t)); return; | ||||
| 		case 'b': case 'e': write_biff_rec(ba, "BoolErr", write_BoolErr(R, C, cell.v, os, opts, cell.t)); return; | ||||
| 		/* TODO: codepage, sst */ | ||||
| 		case 's': case 'str': | ||||
| 			write_biff_rec(ba, "Label", write_Label(R, C, cell.v, opts)); | ||||
| 			write_biff_rec(ba, "Label", write_Label(R, C, cell.v, os, opts)); | ||||
| 			return; | ||||
| 	} | ||||
| 	write_biff_rec(ba, "Blank", write_XLSCell(R, C)); | ||||
| 	write_biff_rec(ba, "Blank", write_XLSCell(R, C, os)); | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLS] 2.1.7.20.5 */ | ||||
| @ -201,6 +215,9 @@ function write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) { | ||||
| 	if(b8) write_biff_rec(A, "RefreshAll", writebool(false)); | ||||
| 	write_biff_rec(A, "BookBool", writeuint16(0)); | ||||
| 	/* ... */ | ||||
| 	if(b8) write_FMTS_biff8(A, wb.SSF); | ||||
| 	if(b8) write_CELLXFS_biff8(A, opts.cellXfs); | ||||
| 	/* ... */ | ||||
| 	if(b8) write_biff_rec(A, "UsesELFs", writebool(false)); | ||||
| 	var a = A.end(); | ||||
| 
 | ||||
| @ -233,6 +250,20 @@ function write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) { | ||||
| function write_biff8_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) { | ||||
| 	var o = opts || {}; | ||||
| 	var bufs = []; | ||||
| 
 | ||||
| 	if(wb && !wb.SSF) { | ||||
| 		wb.SSF = SSF.get_table(); | ||||
| 	} | ||||
| 	if(wb && wb.SSF) { | ||||
| 		make_ssf(SSF); SSF.load_table(wb.SSF); | ||||
| 		// $FlowIgnore
 | ||||
| 		o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0; | ||||
| 		o.ssf = wb.SSF; | ||||
| 	} | ||||
| 	o.cellXfs = []; | ||||
| 	o.Strings = /*::((*/[]/*:: :any):SST)*/; o.Strings.Count = 0; o.Strings.Unique = 0; | ||||
| 	get_cell_style(o.cellXfs, {}, {revssf:{"General":0}}); | ||||
| 
 | ||||
| 	for(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb); | ||||
| 	bufs.unshift(write_biff8_global(wb, bufs, o)); | ||||
| 	return __toBuffer([bufs]); | ||||
|  | ||||
| @ -77,7 +77,7 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ { | ||||
| 	_ssfopts = {}; | ||||
| 	if(o.dateNF) _ssfopts.dateNF = o.dateNF; | ||||
| 	if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64"; | ||||
| 	if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); } | ||||
| 	if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); } | ||||
| 	if(o.type == "string") { str = true; o.type = "binary"; d = bstrify(data); } | ||||
| 	if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') { | ||||
| 		// $FlowIgnore
 | ||||
|  | ||||
| @ -85,6 +85,7 @@ function writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) { | ||||
| 		case 'xlml': return write_string_type(write_xlml(wb, o), o); | ||||
| 		case 'slk': | ||||
| 		case 'sylk': return write_string_type(write_slk_str(wb, o), o); | ||||
| 		case 'htm': | ||||
| 		case 'html': return write_string_type(write_htm_str(wb, o), o); | ||||
| 		case 'txt': return write_stxt_type(write_txt_str(wb, o), o); | ||||
| 		case 'csv': return write_string_type(write_csv_str(wb, o), o, "\ufeff"); | ||||
|  | ||||
							
								
								
									
										6
									
								
								demos/extendscript/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								demos/extendscript/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,5 +1 @@ | ||||
| jszip.js | ||||
| shim.js | ||||
| xlsx.flow.js | ||||
| xlsx.core.min.js | ||||
| xlsx.full.min.js | ||||
| xlsx.extendscript.js | ||||
|  | ||||
| @ -6,8 +6,7 @@ all: deps $(TARGETS) | ||||
| 
 | ||||
| .PHONY: deps | ||||
| deps: | ||||
| 	cp ../../shim.js . | ||||
| 	cp ../../dist/xlsx.core.min.js . | ||||
| 	cp ../../dist/xlsx.extendscript.js . | ||||
| 
 | ||||
| %.base: | ||||
| 	echo "#target $*" > $@ | ||||
|  | ||||
| @ -4,31 +4,83 @@ ExtendScript adds some features to a limited form of ECMAScript version 3.  With | ||||
| the included shim, the library can run within Photoshop and other Adobe apps! | ||||
| 
 | ||||
| The main file is `test.jsx`.  Target-specific files prepend target directives. | ||||
| Copy the `test.jsx` file as well as the `shim.js` and `xlsx.core.min.js` files | ||||
| Copy the `test.jsx` file as well as the `xlsx.extendscript.js` library script  | ||||
| to wherever you want the scripts to reside. | ||||
| 
 | ||||
| The demo shows opening a file and converting to an array of arrays: | ||||
| 
 | ||||
| ## ExtendScript Quirks | ||||
| 
 | ||||
| There are numerous quirks in ExtendScript code parsing, especially related to | ||||
| Boolean and bit operations.  Most JS tooling will generate code that is not | ||||
| compatible with ExtendScript.  It is highly recommended to `#include` the `dist` | ||||
| file directly and avoid trying to minify or pack as part of a larger project. | ||||
| 
 | ||||
| 
 | ||||
| ## File I/O | ||||
| 
 | ||||
| Using the `"binary"` encoding, file operations will work with binary strings | ||||
| that play nice with the `"binary"` type of this library.  The `readFile` and | ||||
| `writeFile` library functions wrap the File logic: | ||||
| 
 | ||||
| ```js | ||||
| /* include library */ | ||||
| #include "shim.js" | ||||
| #include "xlsx.core.min.js" | ||||
| /* Read file from disk */ | ||||
| var workbook = XLSX.readFile(filename); | ||||
| 
 | ||||
| /* get data as binary string */ | ||||
| var filename = "sheetjs.xlsx"; | ||||
| var base = new File($.fileName); | ||||
| var infile = File(base.path + "/" + filename); | ||||
| /* Write file to disk */ | ||||
| XLSX.writeFile(workbook, filename); | ||||
| ``` | ||||
| 
 | ||||
| The `readFile` and `writeFile` functions use `"binary"` encoding under the hood: | ||||
| 
 | ||||
| 
 | ||||
| ```js | ||||
| /* Read file from disk without using readFile */ | ||||
| var infile = File(filename); | ||||
| infile.open("r"); | ||||
| infile.encoding = "binary"; | ||||
| var data = infile.read(); | ||||
| 
 | ||||
| /* parse data */ | ||||
| var workbook = XLSX.read(data, {type:"binary"}); | ||||
| infile.close(); | ||||
| 
 | ||||
| /* DO SOMETHING WITH workbook HERE */ | ||||
| /* Write file to disk without using writeFile */ | ||||
| var outFile = File(filename); | ||||
| outFile.open("w"); | ||||
| outFile.encoding = "binary"; | ||||
| outFile.write(workbook); | ||||
| outFile.close(); | ||||
| ``` | ||||
| 
 | ||||
| NOTE: [We forked the minifier](https://www.npmjs.com/package/@sheetjs/uglify-js) | ||||
| and included a patch for ExtendScript's switch statement semicolon issue. | ||||
| 
 | ||||
| ## Demo | ||||
| 
 | ||||
| The demo shows: | ||||
| 
 | ||||
| - loading the library in ExtendScript using `#include`: | ||||
| 
 | ||||
| ```js | ||||
| #include "xlsx.extendscript.js" | ||||
| ``` | ||||
| 
 | ||||
| - opening a file with `XLSX.readFile`: | ||||
| 
 | ||||
| ```js | ||||
| var workbook = XLSX.readFile("sheetjs.xlsx"); | ||||
| ``` | ||||
| 
 | ||||
| - converting a worksheet to an array of arrays: | ||||
| 
 | ||||
| ```js | ||||
| var first_sheet_name = workbook.SheetNames[0]; | ||||
| var first_worksheet = workbook.Sheets[first_sheet_name]; | ||||
| var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1}); | ||||
| 
 | ||||
| alert(data); | ||||
| ``` | ||||
| 
 | ||||
| - writing a new workbook file: | ||||
| 
 | ||||
| ```js | ||||
| XLSX.writeFile(workbook, "sheetjs.slk"); | ||||
| ``` | ||||
| 
 | ||||
| [](https://github.com/SheetJS/js-xlsx) | ||||
|  | ||||
| @ -1,2 +1,45 @@ | ||||
| #target aftereffects | ||||
| var thisFile = new File($.fileName);  
var basePath = thisFile.path;  
#include "shim.js";
#include "xlsx.core.min.js";
var filename = "/sheetjs.xlsx";
var infile = File(basePath+filename);
infile.open("r");
infile.encoding = "binary";
var data = infile.read();
var workbook = XLSX.read(data, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
var first_worksheet = workbook.Sheets[first_sheet_name];
var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1});
alert(data); | ||||
| var thisFile = new File($.fileName); | ||||
| var basePath = thisFile.path; | ||||
| 
 | ||||
| #include "xlsx.extendscript.js"; | ||||
| 
 | ||||
| var filename = "/sheetjs.xlsx"; | ||||
| 
 | ||||
| /* Read file from disk */ | ||||
| var workbook = XLSX.readFile(basePath + filename); | ||||
| 
 | ||||
| /* Display first worksheet */ | ||||
| var first_sheet_name = workbook.SheetNames[0], first_worksheet = workbook.Sheets[first_sheet_name]; | ||||
| var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1}); | ||||
| alert(data); | ||||
| 
 | ||||
| var outfmts = [ | ||||
|   ["xlsb",  "testw.xlsb"], | ||||
|   ["biff8", "testw.xls"], | ||||
|   ["xlml",  "testw.xml"], | ||||
|   ["fods",  "testw.fods"], | ||||
|   ["csv",   "testw.csv"], | ||||
|   ["txt",   "testw.txt"], | ||||
|   ["slk",   "testw.slk"], | ||||
|   ["eth",   "testw.eth"], | ||||
|   ["htm",   "testw.htm"], | ||||
|   ["dif",   "testw.dif"], | ||||
|   ["ods",   "testw.ods"], | ||||
|   ["xlsx",  "testw.xlsx"] | ||||
| ]; | ||||
| for(var i = 0; i < outfmts.length; ++i) { | ||||
|   alert(outfmts[i][0]); | ||||
|   var fname = basePath + "/" + outfmts[i][1]; | ||||
| 
 | ||||
|   /* Write file to disk */ | ||||
|   XLSX.writeFile(workbook, fname); | ||||
| 
 | ||||
|   /* Read new file */ | ||||
|   var wb = XLSX.readFile(fname, {cellDates:true}); | ||||
| 
 | ||||
|   /* Display first worksheet */ | ||||
|   var f_sheet_name = wb.SheetNames[0], f_worksheet = wb.Sheets[f_sheet_name]; | ||||
|   var data = XLSX.utils.sheet_to_json(f_worksheet, {header:1, cellDates:true}); | ||||
|   alert(data); | ||||
| } | ||||
|  | ||||
| @ -1,2 +1,45 @@ | ||||
| #target estoolkit | ||||
| var thisFile = new File($.fileName);  
var basePath = thisFile.path;  
#include "shim.js";
#include "xlsx.core.min.js";
var filename = "/sheetjs.xlsx";
var infile = File(basePath+filename);
infile.open("r");
infile.encoding = "binary";
var data = infile.read();
var workbook = XLSX.read(data, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
var first_worksheet = workbook.Sheets[first_sheet_name];
var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1});
alert(data); | ||||
| var thisFile = new File($.fileName); | ||||
| var basePath = thisFile.path; | ||||
| 
 | ||||
| #include "xlsx.extendscript.js"; | ||||
| 
 | ||||
| var filename = "/sheetjs.xlsx"; | ||||
| 
 | ||||
| /* Read file from disk */ | ||||
| var workbook = XLSX.readFile(basePath + filename); | ||||
| 
 | ||||
| /* Display first worksheet */ | ||||
| var first_sheet_name = workbook.SheetNames[0], first_worksheet = workbook.Sheets[first_sheet_name]; | ||||
| var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1}); | ||||
| alert(data); | ||||
| 
 | ||||
| var outfmts = [ | ||||
|   ["xlsb",  "testw.xlsb"], | ||||
|   ["biff8", "testw.xls"], | ||||
|   ["xlml",  "testw.xml"], | ||||
|   ["fods",  "testw.fods"], | ||||
|   ["csv",   "testw.csv"], | ||||
|   ["txt",   "testw.txt"], | ||||
|   ["slk",   "testw.slk"], | ||||
|   ["eth",   "testw.eth"], | ||||
|   ["htm",   "testw.htm"], | ||||
|   ["dif",   "testw.dif"], | ||||
|   ["ods",   "testw.ods"], | ||||
|   ["xlsx",  "testw.xlsx"] | ||||
| ]; | ||||
| for(var i = 0; i < outfmts.length; ++i) { | ||||
|   alert(outfmts[i][0]); | ||||
|   var fname = basePath + "/" + outfmts[i][1]; | ||||
| 
 | ||||
|   /* Write file to disk */ | ||||
|   XLSX.writeFile(workbook, fname); | ||||
| 
 | ||||
|   /* Read new file */ | ||||
|   var wb = XLSX.readFile(fname, {cellDates:true}); | ||||
| 
 | ||||
|   /* Display first worksheet */ | ||||
|   var f_sheet_name = wb.SheetNames[0], f_worksheet = wb.Sheets[f_sheet_name]; | ||||
|   var data = XLSX.utils.sheet_to_json(f_worksheet, {header:1, cellDates:true}); | ||||
|   alert(data); | ||||
| } | ||||
|  | ||||
| @ -1,2 +1,45 @@ | ||||
| #target illustrator | ||||
| var thisFile = new File($.fileName);  
var basePath = thisFile.path;  
#include "shim.js";
#include "xlsx.core.min.js";
var filename = "/sheetjs.xlsx";
var infile = File(basePath+filename);
infile.open("r");
infile.encoding = "binary";
var data = infile.read();
var workbook = XLSX.read(data, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
var first_worksheet = workbook.Sheets[first_sheet_name];
var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1});
alert(data); | ||||
| var thisFile = new File($.fileName); | ||||
| var basePath = thisFile.path; | ||||
| 
 | ||||
| #include "xlsx.extendscript.js"; | ||||
| 
 | ||||
| var filename = "/sheetjs.xlsx"; | ||||
| 
 | ||||
| /* Read file from disk */ | ||||
| var workbook = XLSX.readFile(basePath + filename); | ||||
| 
 | ||||
| /* Display first worksheet */ | ||||
| var first_sheet_name = workbook.SheetNames[0], first_worksheet = workbook.Sheets[first_sheet_name]; | ||||
| var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1}); | ||||
| alert(data); | ||||
| 
 | ||||
| var outfmts = [ | ||||
|   ["xlsb",  "testw.xlsb"], | ||||
|   ["biff8", "testw.xls"], | ||||
|   ["xlml",  "testw.xml"], | ||||
|   ["fods",  "testw.fods"], | ||||
|   ["csv",   "testw.csv"], | ||||
|   ["txt",   "testw.txt"], | ||||
|   ["slk",   "testw.slk"], | ||||
|   ["eth",   "testw.eth"], | ||||
|   ["htm",   "testw.htm"], | ||||
|   ["dif",   "testw.dif"], | ||||
|   ["ods",   "testw.ods"], | ||||
|   ["xlsx",  "testw.xlsx"] | ||||
| ]; | ||||
| for(var i = 0; i < outfmts.length; ++i) { | ||||
|   alert(outfmts[i][0]); | ||||
|   var fname = basePath + "/" + outfmts[i][1]; | ||||
| 
 | ||||
|   /* Write file to disk */ | ||||
|   XLSX.writeFile(workbook, fname); | ||||
| 
 | ||||
|   /* Read new file */ | ||||
|   var wb = XLSX.readFile(fname, {cellDates:true}); | ||||
| 
 | ||||
|   /* Display first worksheet */ | ||||
|   var f_sheet_name = wb.SheetNames[0], f_worksheet = wb.Sheets[f_sheet_name]; | ||||
|   var data = XLSX.utils.sheet_to_json(f_worksheet, {header:1, cellDates:true}); | ||||
|   alert(data); | ||||
| } | ||||
|  | ||||
| @ -1,2 +1,45 @@ | ||||
| #target indesign | ||||
| var thisFile = new File($.fileName);  
var basePath = thisFile.path;  
#include "shim.js";
#include "xlsx.core.min.js";
var filename = "/sheetjs.xlsx";
var infile = File(basePath+filename);
infile.open("r");
infile.encoding = "binary";
var data = infile.read();
var workbook = XLSX.read(data, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
var first_worksheet = workbook.Sheets[first_sheet_name];
var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1});
alert(data); | ||||
| var thisFile = new File($.fileName); | ||||
| var basePath = thisFile.path; | ||||
| 
 | ||||
| #include "xlsx.extendscript.js"; | ||||
| 
 | ||||
| var filename = "/sheetjs.xlsx"; | ||||
| 
 | ||||
| /* Read file from disk */ | ||||
| var workbook = XLSX.readFile(basePath + filename); | ||||
| 
 | ||||
| /* Display first worksheet */ | ||||
| var first_sheet_name = workbook.SheetNames[0], first_worksheet = workbook.Sheets[first_sheet_name]; | ||||
| var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1}); | ||||
| alert(data); | ||||
| 
 | ||||
| var outfmts = [ | ||||
|   ["xlsb",  "testw.xlsb"], | ||||
|   ["biff8", "testw.xls"], | ||||
|   ["xlml",  "testw.xml"], | ||||
|   ["fods",  "testw.fods"], | ||||
|   ["csv",   "testw.csv"], | ||||
|   ["txt",   "testw.txt"], | ||||
|   ["slk",   "testw.slk"], | ||||
|   ["eth",   "testw.eth"], | ||||
|   ["htm",   "testw.htm"], | ||||
|   ["dif",   "testw.dif"], | ||||
|   ["ods",   "testw.ods"], | ||||
|   ["xlsx",  "testw.xlsx"] | ||||
| ]; | ||||
| for(var i = 0; i < outfmts.length; ++i) { | ||||
|   alert(outfmts[i][0]); | ||||
|   var fname = basePath + "/" + outfmts[i][1]; | ||||
| 
 | ||||
|   /* Write file to disk */ | ||||
|   XLSX.writeFile(workbook, fname); | ||||
| 
 | ||||
|   /* Read new file */ | ||||
|   var wb = XLSX.readFile(fname, {cellDates:true}); | ||||
| 
 | ||||
|   /* Display first worksheet */ | ||||
|   var f_sheet_name = wb.SheetNames[0], f_worksheet = wb.Sheets[f_sheet_name]; | ||||
|   var data = XLSX.utils.sheet_to_json(f_worksheet, {header:1, cellDates:true}); | ||||
|   alert(data); | ||||
| } | ||||
|  | ||||
| @ -1,2 +1,45 @@ | ||||
| #target photoshop | ||||
| var thisFile = new File($.fileName);  
var basePath = thisFile.path;  
#include "shim.js";
#include "xlsx.core.min.js";
var filename = "/sheetjs.xlsx";
var infile = File(basePath+filename);
infile.open("r");
infile.encoding = "binary";
var data = infile.read();
var workbook = XLSX.read(data, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
var first_worksheet = workbook.Sheets[first_sheet_name];
var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1});
alert(data); | ||||
| var thisFile = new File($.fileName); | ||||
| var basePath = thisFile.path; | ||||
| 
 | ||||
| #include "xlsx.extendscript.js"; | ||||
| 
 | ||||
| var filename = "/sheetjs.xlsx"; | ||||
| 
 | ||||
| /* Read file from disk */ | ||||
| var workbook = XLSX.readFile(basePath + filename); | ||||
| 
 | ||||
| /* Display first worksheet */ | ||||
| var first_sheet_name = workbook.SheetNames[0], first_worksheet = workbook.Sheets[first_sheet_name]; | ||||
| var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1}); | ||||
| alert(data); | ||||
| 
 | ||||
| var outfmts = [ | ||||
|   ["xlsb",  "testw.xlsb"], | ||||
|   ["biff8", "testw.xls"], | ||||
|   ["xlml",  "testw.xml"], | ||||
|   ["fods",  "testw.fods"], | ||||
|   ["csv",   "testw.csv"], | ||||
|   ["txt",   "testw.txt"], | ||||
|   ["slk",   "testw.slk"], | ||||
|   ["eth",   "testw.eth"], | ||||
|   ["htm",   "testw.htm"], | ||||
|   ["dif",   "testw.dif"], | ||||
|   ["ods",   "testw.ods"], | ||||
|   ["xlsx",  "testw.xlsx"] | ||||
| ]; | ||||
| for(var i = 0; i < outfmts.length; ++i) { | ||||
|   alert(outfmts[i][0]); | ||||
|   var fname = basePath + "/" + outfmts[i][1]; | ||||
| 
 | ||||
|   /* Write file to disk */ | ||||
|   XLSX.writeFile(workbook, fname); | ||||
| 
 | ||||
|   /* Read new file */ | ||||
|   var wb = XLSX.readFile(fname, {cellDates:true}); | ||||
| 
 | ||||
|   /* Display first worksheet */ | ||||
|   var f_sheet_name = wb.SheetNames[0], f_worksheet = wb.Sheets[f_sheet_name]; | ||||
|   var data = XLSX.utils.sheet_to_json(f_worksheet, {header:1, cellDates:true}); | ||||
|   alert(data); | ||||
| } | ||||
|  | ||||
| @ -1 +1,44 @@ | ||||
| var thisFile = new File($.fileName);  
var basePath = thisFile.path;  
#include "shim.js";
#include "xlsx.core.min.js";
var filename = "/sheetjs.xlsx";
var infile = File(basePath+filename);
infile.open("r");
infile.encoding = "binary";
var data = infile.read();
var workbook = XLSX.read(data, {type:"binary"});
var first_sheet_name = workbook.SheetNames[0];
var first_worksheet = workbook.Sheets[first_sheet_name];
var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1});
alert(data); | ||||
| var thisFile = new File($.fileName); | ||||
| var basePath = thisFile.path; | ||||
| 
 | ||||
| #include "xlsx.extendscript.js"; | ||||
| 
 | ||||
| var filename = "/sheetjs.xlsx"; | ||||
| 
 | ||||
| /* Read file from disk */ | ||||
| var workbook = XLSX.readFile(basePath + filename); | ||||
| 
 | ||||
| /* Display first worksheet */ | ||||
| var first_sheet_name = workbook.SheetNames[0], first_worksheet = workbook.Sheets[first_sheet_name]; | ||||
| var data = XLSX.utils.sheet_to_json(first_worksheet, {header:1}); | ||||
| alert(data); | ||||
| 
 | ||||
| var outfmts = [ | ||||
|   ["xlsb",  "testw.xlsb"], | ||||
|   ["biff8", "testw.xls"], | ||||
|   ["xlml",  "testw.xml"], | ||||
|   ["fods",  "testw.fods"], | ||||
|   ["csv",   "testw.csv"], | ||||
|   ["txt",   "testw.txt"], | ||||
|   ["slk",   "testw.slk"], | ||||
|   ["eth",   "testw.eth"], | ||||
|   ["htm",   "testw.htm"], | ||||
|   ["dif",   "testw.dif"], | ||||
|   ["ods",   "testw.ods"], | ||||
|   ["xlsx",  "testw.xlsx"] | ||||
| ]; | ||||
| for(var i = 0; i < outfmts.length; ++i) { | ||||
|   alert(outfmts[i][0]); | ||||
|   var fname = basePath + "/" + outfmts[i][1]; | ||||
| 
 | ||||
|   /* Write file to disk */ | ||||
|   XLSX.writeFile(workbook, fname); | ||||
| 
 | ||||
|   /* Read new file */ | ||||
|   var wb = XLSX.readFile(fname, {cellDates:true}); | ||||
| 
 | ||||
|   /* Display first worksheet */ | ||||
|   var f_sheet_name = wb.SheetNames[0], f_worksheet = wb.Sheets[f_sheet_name]; | ||||
|   var data = XLSX.utils.sheet_to_json(f_worksheet, {header:1, cellDates:true}); | ||||
|   alert(data); | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								dist/jszip.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								dist/jszip.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -1624,14 +1624,14 @@ var string2buf = function (str) { | ||||
|     // count binary size
 | ||||
|     for (m_pos = 0; m_pos < str_len; m_pos++) { | ||||
|         c = str.charCodeAt(m_pos); | ||||
|         if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { | ||||
|         if (((c & 0xfc00) === 0xd800) && (m_pos+1 < str_len)) { | ||||
|             c2 = str.charCodeAt(m_pos+1); | ||||
|             if ((c2 & 0xfc00) === 0xdc00) { | ||||
|                 c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); | ||||
|                 m_pos++; | ||||
|             } | ||||
|         } | ||||
|         buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; | ||||
|         buf_len += (c < 0x80) ? 1 : ((c < 0x800) ? 2 : ((c < 0x10000) ? 3 : 4)); | ||||
|     } | ||||
| 
 | ||||
|     // allocate buffer
 | ||||
| @ -1661,13 +1661,13 @@ var string2buf = function (str) { | ||||
|         } else if (c < 0x10000) { | ||||
|             /* three bytes */ | ||||
|             buf[i++] = 0xE0 | (c >>> 12); | ||||
|             buf[i++] = 0x80 | (c >>> 6 & 0x3f); | ||||
|             buf[i++] = 0x80 | ((c >>> 6) & 0x3f); | ||||
|             buf[i++] = 0x80 | (c & 0x3f); | ||||
|         } else { | ||||
|             /* four bytes */ | ||||
|             buf[i++] = 0xf0 | (c >>> 18); | ||||
|             buf[i++] = 0x80 | (c >>> 12 & 0x3f); | ||||
|             buf[i++] = 0x80 | (c >>> 6 & 0x3f); | ||||
|             buf[i++] = 0x80 | ((c >>> 12) & 0x3f); | ||||
|             buf[i++] = 0x80 | ((c >>> 6) & 0x3f); | ||||
|             buf[i++] = 0x80 | (c & 0x3f); | ||||
|         } | ||||
|     } | ||||
|  | ||||
							
								
								
									
										28
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										28962
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										28962
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										26
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										163
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										163
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							| @ -4,7 +4,7 @@ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ | ||||
| var XLSX = {}; | ||||
| (function make_xlsx(XLSX){ | ||||
| XLSX.version = '0.11.19'; | ||||
| XLSX.version = '0.12.0'; | ||||
| var current_codepage = 1200, current_ansi = 1252; | ||||
| /*global cptable:true */ | ||||
| if(typeof module !== "undefined" && typeof require !== 'undefined') { | ||||
| @ -1798,7 +1798,7 @@ function blobify(data) { | ||||
| } | ||||
| /* write or download file */ | ||||
| function write_dl(fname, payload, enc) { | ||||
| 	/*global IE_SaveFile, Blob, navigator, saveAs, URL, document */ | ||||
| 	/*global IE_SaveFile, Blob, navigator, saveAs, URL, document, File */ | ||||
| 	if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload); | ||||
| 	var data = (enc == "utf8") ? utf8write(payload) : payload; | ||||
| if(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname); | ||||
| @ -1817,9 +1817,28 @@ document.body.removeChild(a); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	throw new Error("cannot initiate download"); | ||||
| 	// $FlowIgnore
 | ||||
| 	if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
 | ||||
| 		// $FlowIgnore
 | ||||
| 		var out = File(fname); out.open("w"); out.encoding = "binary"; | ||||
| 		if(Array.isArray(payload)) payload = a2s(payload); | ||||
| 		out.write(payload); out.close(); return payload; | ||||
| 	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } | ||||
| 	throw new Error("cannot save file " + fname); | ||||
| } | ||||
| 
 | ||||
| /* read binary data from file */ | ||||
| function read_binary(path) { | ||||
| 	if(typeof _fs !== 'undefined') return _fs.readFileSync(path); | ||||
| 	// $FlowIgnore
 | ||||
| 	if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
 | ||||
| 		// $FlowIgnore
 | ||||
| 		var infile = File(path); infile.open("r"); infile.encoding = "binary"; | ||||
| 		var data = infile.read(); infile.close(); | ||||
| 		return data; | ||||
| 	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } | ||||
| 	throw new Error("Cannot access file " + path); | ||||
| } | ||||
| function keys(o) { return Object.keys(o); } | ||||
| 
 | ||||
| function evert_key(obj, key) { | ||||
| @ -2287,25 +2306,25 @@ function read_double_le(b, idx) { | ||||
| 	var e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f); | ||||
| 	var m = (b[idx+6]&0x0f); | ||||
| 	for(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i]; | ||||
| 	if(e == 0x7ff) return m == 0 ? s * Infinity : NaN; | ||||
| 	if(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN; | ||||
| 	if(e == 0) e = -1022; | ||||
| 	else { e -= 1023; m += Math.pow(2,52); } | ||||
| 	return s * Math.pow(2, e - 52) * m; | ||||
| } | ||||
| 
 | ||||
| function write_double_le(b, v, idx) { | ||||
| 	var bs = ((v < 0 || 1/v == -Infinity) ? 1 : 0) << 7, e = 0, m = 0; | ||||
| 	var av = bs ? -v : v; | ||||
| 	var bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0; | ||||
| 	var av = bs ? (-v) : v; | ||||
| 	if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; } | ||||
| 	else if(av == 0) e = m = 0; | ||||
| 	else { | ||||
| 		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; } | ||||
| 		if((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; } | ||||
| 		else { m -= Math.pow(2,52); e+=1023; } | ||||
| 	} | ||||
| 	for(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff; | ||||
| 	b[idx + 6] = ((e & 0x0f) << 4) | m & 0xf; | ||||
| 	b[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf); | ||||
| 	b[idx + 7] = (e >> 4) | bs; | ||||
| } | ||||
| 
 | ||||
| @ -2357,8 +2376,8 @@ if(typeof cptable !== 'undefined') { | ||||
| } | ||||
| 
 | ||||
| var __readUInt8 = function(b, idx) { return b[idx]; }; | ||||
| var __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; }; | ||||
| var __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; }; | ||||
| var __readUInt16LE = function(b, idx) { return (b[idx+1]*(1<<8))+b[idx]; }; | ||||
| var __readInt16LE = function(b, idx) { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); }; | ||||
| var __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; }; | ||||
| var __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; }; | ||||
| var __readInt32BE = function(b, idx) { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; }; | ||||
| @ -2369,7 +2388,7 @@ function ReadShift(size, t) { | ||||
| 		case 'dbcs': | ||||
| 			loc = this.l; | ||||
| 			if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le"); | ||||
| 			else for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | ||||
| 			else for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | ||||
| 			size *= 2; | ||||
| 			break; | ||||
| 
 | ||||
| @ -2400,7 +2419,7 @@ function ReadShift(size, t) { | ||||
| 
 | ||||
| 		/* sbcs and dbcs support continue records in the SST way TODO codepages */ | ||||
| 		case 'dbcs-cont': o = ""; loc = this.l; | ||||
| 			for(i = 0; i != size; ++i) { | ||||
| 			for(i = 0; i < size; ++i) { | ||||
| 				if(this.lens && this.lens.indexOf(loc) !== -1) { | ||||
| 					w = __readUInt8(this, loc); | ||||
| 					this.l = loc + 1; | ||||
| @ -2434,7 +2453,7 @@ function ReadShift(size, t) { | ||||
| 		case 1: oI = __readUInt8(this, this.l); this.l++; return oI; | ||||
| 		case 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI; | ||||
| 		case 4: case -4: | ||||
| 			if(t === 'i' || (this[this.l+3] & 0x80)===0) { oI = (size > 0 ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } | ||||
| 			if(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } | ||||
| 			else { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR; | ||||
| 		case 8: case -8: | ||||
| 			if(t === 'f') { | ||||
| @ -2460,18 +2479,18 @@ for(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l | ||||
| 	} else if(f === 'sbcs') { | ||||
| 		/* TODO: codepage */ | ||||
| val = val.replace(/[^\x00-\x7F]/g, "_"); | ||||
| for(i = 0; i != val.length; ++i) this[this.l + i] = val.charCodeAt(i) & 0xFF; | ||||
| for(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF); | ||||
| 		size = val.length; | ||||
| 	} else if(f === 'hex') { | ||||
| 		for(; i < t; ++i) { | ||||
| this[this.l++] = parseInt(val.slice(2*i, 2*i+2), 16)||0; | ||||
| this[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0); | ||||
| 		} return this; | ||||
| 	} else if(f === 'utf16le') { | ||||
| var end = this.l + t; | ||||
| 			for(i = 0; i < Math.min(val.length, t); ++i) { | ||||
| 				var cc = val.charCodeAt(i); | ||||
| 				this[this.l++] = cc & 0xff; | ||||
| 				this[this.l++] = cc >> 8; | ||||
| 				this[this.l++] = (cc & 0xff); | ||||
| 				this[this.l++] = (cc >> 8); | ||||
| 			} | ||||
| 			while(this.l < end) this[this.l++] = 0; | ||||
| 			return this; | ||||
| @ -2542,13 +2561,13 @@ function buf_array() { | ||||
| 
 | ||||
| 	var endbuf = function ba_endbuf() { | ||||
| 		if(!curbuf) return; | ||||
| 		if(curbuf.length > curbuf.l) curbuf = curbuf.slice(0, curbuf.l); | ||||
| 		if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } | ||||
| 		if(curbuf.length > 0) bufs.push(curbuf); | ||||
| 		curbuf = null; | ||||
| 	}; | ||||
| 
 | ||||
| 	var next = function ba_next(sz) { | ||||
| 		if(curbuf && sz < curbuf.length - curbuf.l) return curbuf; | ||||
| 		if(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf; | ||||
| 		endbuf(); | ||||
| 		return (curbuf = newblk(Math.max(sz+1, blksz))); | ||||
| 	}; | ||||
| @ -2558,7 +2577,7 @@ function buf_array() { | ||||
| 		return __toBuffer([bufs]); | ||||
| 	}; | ||||
| 
 | ||||
| 	var push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); }; | ||||
| 	var push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); }; | ||||
| 
 | ||||
| 	return ({ next:next, push:push, end:end, _bufs:bufs }); | ||||
| } | ||||
| @ -2906,17 +2925,17 @@ var write_RelID = write_XLNullableWideString; | ||||
| /* [MS-XLS] 2.5.217 */ | ||||
| function parse_RkNumber(data) { | ||||
| 	var b = data.slice(data.l, data.l+4); | ||||
| 	var fX100 = b[0] & 1, fInt = b[0] & 2; | ||||
| 	var fX100 = (b[0] & 1), fInt = (b[0] & 2); | ||||
| 	data.l+=4; | ||||
| 	b[0] &= 0xFC; // b[0] &= ~3;
 | ||||
| 	var RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2; | ||||
| 	return fX100 ? RK/100 : RK; | ||||
| 	return fX100 ? (RK/100) : RK; | ||||
| } | ||||
| function write_RkNumber(data, o) { | ||||
| 	if(o == null) o = new_buf(4); | ||||
| 	var fX100 = 0, fInt = 0, d100 = data * 100; | ||||
| 	if(data == (data | 0) && data >= -(1<<29) && data < (1 << 29)) { fInt = 1; } | ||||
| 	else if(d100 == (d100 | 0) && d100 >= -(1<<29) && d100 < (1 << 29)) { fInt = 1; fX100 = 1; } | ||||
| 	if((data == (data | 0)) && (data >= -(1<<29)) && (data < (1 << 29))) { fInt = 1; } | ||||
| 	else if((d100 == (d100 | 0)) && (d100 >= -(1<<29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; } | ||||
| 	if(fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2)); | ||||
| 	else throw new Error("unsupported RkNumber " + data); // TODO
 | ||||
| } | ||||
| @ -4851,7 +4870,8 @@ function write_BoundSheet8(data, opts) { | ||||
| 	o.write_shift(1, data.name.length); | ||||
| 	if(opts.biff >= 8) o.write_shift(1, 1); | ||||
| 	o.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le'); | ||||
| 	return o.slice(0, o.l); | ||||
| 	var out = o.slice(0, o.l); | ||||
| 	out.l = o.l; return out; | ||||
| } | ||||
| 
 | ||||
| /* 2.4.265 TODO */ | ||||
| @ -4995,10 +5015,10 @@ function parse_Label(blob, length, opts) { | ||||
| 	cell.val = str; | ||||
| 	return cell; | ||||
| } | ||||
| function write_Label(R, C, v, opts) { | ||||
| function write_Label(R, C, v, os, opts) { | ||||
| 	var b8 = !opts || opts.biff == 8; | ||||
| 	var o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	o.write_shift(2, v.length); | ||||
| 	if(b8) o.write_shift(1, 1); | ||||
| 	o.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs'); | ||||
| @ -5012,6 +5032,14 @@ function parse_Format(blob, length, opts) { | ||||
| 	var fmtstr = parse_XLUnicodeString2(blob, 0, opts); | ||||
| 	return [numFmtId, fmtstr]; | ||||
| } | ||||
| function write_Format(i, f, o) { | ||||
| 	if(!o) o = new_buf(6 + 4 * f.length); | ||||
| 	o.write_shift(2, i); | ||||
| 	write_XLUnicodeString(f, null, o); | ||||
| 	var out = (o.length > o.l) ? o.slice(0, o.l) : o; | ||||
| 	if(o.l == null) o.l = o.length; | ||||
| 	return out; | ||||
| } | ||||
| var parse_BIFF2Format = parse_XLUnicodeString2; | ||||
| 
 | ||||
| /* 2.4.90 */ | ||||
| @ -5117,6 +5145,17 @@ function parse_XF(blob, length, opts) { | ||||
| 	o.data = parse_CellStyleXF(blob, length, o.fStyle, opts); | ||||
| 	return o; | ||||
| } | ||||
| function write_XF(data, ixfeP, o) { | ||||
| 	if(!o) o = new_buf(20); | ||||
| 	o.write_shift(2, 0); | ||||
| 	o.write_shift(2, data.numFmtId||0); | ||||
| 	o.write_shift(2, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(2, 0); | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| /* 2.4.134 */ | ||||
| function parse_Guts(blob) { | ||||
| @ -5144,9 +5183,9 @@ function parse_BoolErr(blob, length, opts) { | ||||
| 	cell.t = (val === true || val === false) ? 'b' : 'e'; | ||||
| 	return cell; | ||||
| } | ||||
| function write_BoolErr(R, C, v, opts, t) { | ||||
| function write_BoolErr(R, C, v, os, opts, t) { | ||||
| 	var o = new_buf(8); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	write_Bes(v, t, o); | ||||
| 	return o; | ||||
| } | ||||
| @ -5158,9 +5197,9 @@ function parse_Number(blob) { | ||||
| 	cell.val = xnum; | ||||
| 	return cell; | ||||
| } | ||||
| function write_Number(R, C, v) { | ||||
| function write_Number(R, C, v, os) { | ||||
| 	var o = new_buf(14); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	write_Xnum(v, o); | ||||
| 	return o; | ||||
| } | ||||
| @ -6072,7 +6111,7 @@ var SYLK = (function() { | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C]: ws[coord]; | ||||
| 				if(!cell || cell.v == null && (!cell.f || cell.F)) continue; | ||||
| 				if(!cell || (cell.v == null && (!cell.f || cell.F))) continue; | ||||
| 				o.push(write_ws_cell_sylk(cell, ws, R, C, opts)); | ||||
| 			} | ||||
| 		} | ||||
| @ -7969,7 +8008,9 @@ function write_BrtFmt(i, f, o) { | ||||
| 	if(!o) o = new_buf(6 + 4 * f.length); | ||||
| 	o.write_shift(2, i); | ||||
| 	write_XLWideString(f, o); | ||||
| 	return o.length > o.l ? o.slice(0, o.l) : o; | ||||
| 	var out = (o.length > o.l) ? o.slice(0, o.l) : o; | ||||
| 	if(o.l == null) o.l = o.length; | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.4.653 BrtFont TODO */ | ||||
| @ -9081,11 +9122,12 @@ function write_comments_bin(data) { | ||||
| 	write_record(ba, "BrtEndComments"); | ||||
| 	return ba.end(); | ||||
| } | ||||
| var CT_VBA = "application/vnd.ms-office.vbaProject"; | ||||
| function make_vba_xls(cfb) { | ||||
| 	var newcfb = CFB.utils.cfb_new({root:"R"}); | ||||
| 	cfb.FullPaths.forEach(function(p, i) { | ||||
| 		if(p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/)) return; | ||||
| 		var newpath = p.replace(/^[^/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); | ||||
| 		var newpath = p.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); | ||||
| 		CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content); | ||||
| 	}); | ||||
| 	return CFB.write(newcfb); | ||||
| @ -9094,7 +9136,7 @@ function make_vba_xls(cfb) { | ||||
| function fill_vba_xls(cfb, vba) { | ||||
| 	vba.FullPaths.forEach(function(p, i) { | ||||
| 		if(i == 0) return; | ||||
| 		var newpath = p.replace(/[^/]*[/]/, "/_VBA_PROJECT_CUR/"); | ||||
| 		var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/"); | ||||
| 		if(newpath.slice(-1) !== "/") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content); | ||||
| 	}); | ||||
| } | ||||
| @ -12058,7 +12100,7 @@ function write_ws_xml_data(ws, opts, idx, wb) { | ||||
| 			if(_cell === undefined) continue; | ||||
| 			if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell); | ||||
| 		} | ||||
| 		if(r.length > 0 || rows && rows[R]) { | ||||
| 		if(r.length > 0 || (rows && rows[R])) { | ||||
| 			params = ({r:rr}); | ||||
| 			if(rows && rows[R]) { | ||||
| 				row = rows[R]; | ||||
| @ -12246,7 +12288,7 @@ function write_BrtRowHdr(R, range, ws) { | ||||
| 
 | ||||
| 	var caddr = {r:R, c:0}; | ||||
| 	for(var i = 0; i < 16; ++i) { | ||||
| 		if(range.s.c > ((i+1) << 10) || range.e.c < (i << 10)) continue; | ||||
| 		if((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue; | ||||
| 		var first = -1, last = -1; | ||||
| 		for(var j = (i<<10); j < ((i+1)<<10); ++j) { | ||||
| 			caddr.c = j; | ||||
| @ -12268,7 +12310,7 @@ function write_BrtRowHdr(R, range, ws) { | ||||
| } | ||||
| function write_row_header(ba, ws, range, R) { | ||||
| 	var o = write_BrtRowHdr(R, range, ws); | ||||
| 	if(o.length > 17 || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o); | ||||
| 	if((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o); | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.4.812 BrtWsDim */ | ||||
| @ -14938,7 +14980,7 @@ function write_ws_xlml_comment(comments) { | ||||
| 	}).join(""); | ||||
| } | ||||
| function write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){ | ||||
| 	if(!cell || cell.v == undefined && cell.f == undefined) return ""; | ||||
| 	if(!cell || (cell.v == undefined && cell.f == undefined)) return ""; | ||||
| 
 | ||||
| 	var attr = {}; | ||||
| 	if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); | ||||
| @ -17326,6 +17368,18 @@ function write_biff2_buf(wb, opts) { | ||||
| 	return ba.end(); | ||||
| } | ||||
| 
 | ||||
| function write_FMTS_biff8(ba, NF) { | ||||
| 	if(!NF) return; | ||||
| 	[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) { | ||||
| for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_biff_rec(ba, "Format", write_Format(i, NF[i])); | ||||
| 	}); | ||||
| } | ||||
| function write_CELLXFS_biff8(ba, data) { | ||||
| 	data.forEach(function(c) { | ||||
| 		write_biff_rec(ba, "XF", write_XF(c,0)); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff8_hlinks(ba, ws) { | ||||
| 	for(var R=0; R<ws['!links'].length; ++R) { | ||||
| 		var HL = ws['!links'][R]; | ||||
| @ -17336,19 +17390,20 @@ function write_ws_biff8_hlinks(ba, ws) { | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff8_cell(ba, cell, R, C, opts) { | ||||
| 	var os = get_cell_style(opts.cellXfs, cell, opts); | ||||
| 	if(cell.v != null) switch(cell.t) { | ||||
| 		case 'd': case 'n': | ||||
| 			var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v; | ||||
| 			/* TODO: emit RK as appropriate */ | ||||
| 			write_biff_rec(ba, "Number", write_Number(R, C, v, opts)); | ||||
| 			write_biff_rec(ba, "Number", write_Number(R, C, v, os, opts)); | ||||
| 			return; | ||||
| 		case 'b': case 'e': write_biff_rec(ba, "BoolErr", write_BoolErr(R, C, cell.v, opts, cell.t)); return; | ||||
| 		case 'b': case 'e': write_biff_rec(ba, "BoolErr", write_BoolErr(R, C, cell.v, os, opts, cell.t)); return; | ||||
| 		/* TODO: codepage, sst */ | ||||
| 		case 's': case 'str': | ||||
| 			write_biff_rec(ba, "Label", write_Label(R, C, cell.v, opts)); | ||||
| 			write_biff_rec(ba, "Label", write_Label(R, C, cell.v, os, opts)); | ||||
| 			return; | ||||
| 	} | ||||
| 	write_biff_rec(ba, "Blank", write_XLSCell(R, C)); | ||||
| 	write_biff_rec(ba, "Blank", write_XLSCell(R, C, os)); | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLS] 2.1.7.20.5 */ | ||||
| @ -17443,6 +17498,9 @@ function write_biff8_global(wb, bufs, opts) { | ||||
| 	if(b8) write_biff_rec(A, "RefreshAll", writebool(false)); | ||||
| 	write_biff_rec(A, "BookBool", writeuint16(0)); | ||||
| 	/* ... */ | ||||
| 	if(b8) write_FMTS_biff8(A, wb.SSF); | ||||
| 	if(b8) write_CELLXFS_biff8(A, opts.cellXfs); | ||||
| 	/* ... */ | ||||
| 	if(b8) write_biff_rec(A, "UsesELFs", writebool(false)); | ||||
| 	var a = A.end(); | ||||
| 
 | ||||
| @ -17475,6 +17533,20 @@ function write_biff8_global(wb, bufs, opts) { | ||||
| function write_biff8_buf(wb, opts) { | ||||
| 	var o = opts || {}; | ||||
| 	var bufs = []; | ||||
| 
 | ||||
| 	if(wb && !wb.SSF) { | ||||
| 		wb.SSF = SSF.get_table(); | ||||
| 	} | ||||
| 	if(wb && wb.SSF) { | ||||
| 		make_ssf(SSF); SSF.load_table(wb.SSF); | ||||
| 		// $FlowIgnore
 | ||||
| 		o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0; | ||||
| 		o.ssf = wb.SSF; | ||||
| 	} | ||||
| 	o.cellXfs = []; | ||||
| 	o.Strings = []; o.Strings.Count = 0; o.Strings.Unique = 0; | ||||
| 	get_cell_style(o.cellXfs, {}, {revssf:{"General":0}}); | ||||
| 
 | ||||
| 	for(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb); | ||||
| 	bufs.unshift(write_biff8_global(wb, bufs, o)); | ||||
| 	return __toBuffer([bufs]); | ||||
| @ -18665,7 +18737,7 @@ function parse_zip(zip, opts) { | ||||
| 	} | ||||
| 	if(opts.bookVBA) { | ||||
| 		if(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true); | ||||
| 		else if(dir.defaults && dir.defaults.bin === 'application/vnd.ms-office.vbaProject') out.vbaraw = getzipdata(zip,'xl/vbaProject.bin',true); | ||||
| 		else if(dir.defaults && dir.defaults.bin === CT_VBA) out.vbaraw = getzipdata(zip, 'xl/vbaProject.bin',true); | ||||
| 	} | ||||
| 	return out; | ||||
| } | ||||
| @ -18914,7 +18986,7 @@ function readSync(data, opts) { | ||||
| 	_ssfopts = {}; | ||||
| 	if(o.dateNF) _ssfopts.dateNF = o.dateNF; | ||||
| 	if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64"; | ||||
| 	if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); } | ||||
| 	if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); } | ||||
| 	if(o.type == "string") { str = true; o.type = "binary"; d = bstrify(data); } | ||||
| 	if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') { | ||||
| 		// $FlowIgnore
 | ||||
| @ -19031,6 +19103,7 @@ function writeSync(wb, opts) { | ||||
| 		case 'xlml': return write_string_type(write_xlml(wb, o), o); | ||||
| 		case 'slk': | ||||
| 		case 'sylk': return write_string_type(write_slk_str(wb, o), o); | ||||
| 		case 'htm': | ||||
| 		case 'html': return write_string_type(write_htm_str(wb, o), o); | ||||
| 		case 'txt': return write_stxt_type(write_txt_str(wb, o), o); | ||||
| 		case 'csv': return write_string_type(write_csv_str(wb, o), o, "\ufeff"); | ||||
|  | ||||
							
								
								
									
										24
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -17,6 +17,23 @@ var workbook = XLSX.readFile('test.xlsx'); | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Photoshop ExtendScript read a file</b> (click to show)</summary> | ||||
| 
 | ||||
| `readFile` wraps the `File` logic in Photoshop and other ExtendScript targets. | ||||
| The specified path should be an absolute path: | ||||
| 
 | ||||
| ```js | ||||
| #include "xlsx.extendscript.js" | ||||
| /* Read test.xlsx from the Documents folder */ | ||||
| var workbook = XLSX.readFile(Folder.myDocuments + '/' + 'test.xlsx'); | ||||
| /* DO SOMETHING WITH workbook HERE */ | ||||
| ``` | ||||
| 
 | ||||
| The [`extendscript` demo](demos/extendscript/) includes a more complex example. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Browser read TABLE element from page</b> (click to show)</summary> | ||||
| 
 | ||||
|  | ||||
| @ -19,6 +19,23 @@ XLSX.writeFile(workbook, 'out.xlsb'); | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Photoshop ExtendScript write a file</b> (click to show)</summary> | ||||
| 
 | ||||
| `writeFile` wraps the `File` logic in Photoshop and other ExtendScript targets. | ||||
| The specified path should be an absolute path: | ||||
| 
 | ||||
| ```js | ||||
| #include "xlsx.extendscript.js" | ||||
| /* output format determined by filename */ | ||||
| XLSX.writeFile(workbook, 'out.xlsx'); | ||||
| /* at this point, out.xlsx is a file that you can distribute */ | ||||
| ``` | ||||
| 
 | ||||
| The [`extendscript` demo](demos/extendscript/) includes a more complex example. | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|   <summary><b>Browser add TABLE element to page</b> (click to show)</summary> | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										10
									
								
								jszip.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								jszip.js
									
									
									
									
									
								
							| @ -1624,14 +1624,14 @@ var string2buf = function (str) { | ||||
|     // count binary size
 | ||||
|     for (m_pos = 0; m_pos < str_len; m_pos++) { | ||||
|         c = str.charCodeAt(m_pos); | ||||
|         if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { | ||||
|         if (((c & 0xfc00) === 0xd800) && (m_pos+1 < str_len)) { | ||||
|             c2 = str.charCodeAt(m_pos+1); | ||||
|             if ((c2 & 0xfc00) === 0xdc00) { | ||||
|                 c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); | ||||
|                 m_pos++; | ||||
|             } | ||||
|         } | ||||
|         buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; | ||||
|         buf_len += (c < 0x80) ? 1 : ((c < 0x800) ? 2 : ((c < 0x10000) ? 3 : 4)); | ||||
|     } | ||||
| 
 | ||||
|     // allocate buffer
 | ||||
| @ -1661,13 +1661,13 @@ var string2buf = function (str) { | ||||
|         } else if (c < 0x10000) { | ||||
|             /* three bytes */ | ||||
|             buf[i++] = 0xE0 | (c >>> 12); | ||||
|             buf[i++] = 0x80 | (c >>> 6 & 0x3f); | ||||
|             buf[i++] = 0x80 | ((c >>> 6) & 0x3f); | ||||
|             buf[i++] = 0x80 | (c & 0x3f); | ||||
|         } else { | ||||
|             /* four bytes */ | ||||
|             buf[i++] = 0xf0 | (c >>> 18); | ||||
|             buf[i++] = 0x80 | (c >>> 12 & 0x3f); | ||||
|             buf[i++] = 0x80 | (c >>> 6 & 0x3f); | ||||
|             buf[i++] = 0x80 | ((c >>> 12) & 0x3f); | ||||
|             buf[i++] = 0x80 | ((c >>> 6) & 0x3f); | ||||
|             buf[i++] = 0x80 | (c & 0x3f); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -299,6 +299,20 @@ var workbook = XLSX.readFile('test.xlsx'); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| `readFile` wraps the `File` logic in Photoshop and other ExtendScript targets. | ||||
| The specified path should be an absolute path: | ||||
| 
 | ||||
| ```js | ||||
| #include "xlsx.extendscript.js" | ||||
| /* Read test.xlsx from the Documents folder */ | ||||
| var workbook = XLSX.readFile(Folder.myDocuments + '/' + 'test.xlsx'); | ||||
| /* DO SOMETHING WITH workbook HERE */ | ||||
| ``` | ||||
| 
 | ||||
| The [`extendscript` demo](demos/extendscript/) includes a more complex example. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| The `table_to_book` and `table_to_sheet` utility functions take a DOM TABLE | ||||
| element and iterate through the child nodes. | ||||
| 
 | ||||
| @ -554,6 +568,20 @@ XLSX.writeFile(workbook, 'out.xlsb'); | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| `writeFile` wraps the `File` logic in Photoshop and other ExtendScript targets. | ||||
| The specified path should be an absolute path: | ||||
| 
 | ||||
| ```js | ||||
| #include "xlsx.extendscript.js" | ||||
| /* output format determined by filename */ | ||||
| XLSX.writeFile(workbook, 'out.xlsx'); | ||||
| /* at this point, out.xlsx is a file that you can distribute */ | ||||
| ``` | ||||
| 
 | ||||
| The [`extendscript` demo](demos/extendscript/) includes a more complex example. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| The `sheet_to_html` utility function generates HTML code that can be added to | ||||
| any DOM element. | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "xlsx", | ||||
| 	"version": "0.11.19", | ||||
| 	"version": "0.12.0", | ||||
| 	"author": "sheetjs", | ||||
| 	"description": "SheetJS Spreadsheet data parser and writer", | ||||
| 	"keywords": [ | ||||
|  | ||||
							
								
								
									
										161
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										161
									
								
								xlsx.flow.js
									
									
									
									
									
								
							| @ -4,7 +4,7 @@ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ | ||||
| var XLSX = {}; | ||||
| (function make_xlsx(XLSX){ | ||||
| XLSX.version = '0.11.19'; | ||||
| XLSX.version = '0.12.0'; | ||||
| var current_codepage = 1200, current_ansi = 1252; | ||||
| /*:: declare var cptable:any; */ | ||||
| /*global cptable:true */ | ||||
| @ -1869,7 +1869,7 @@ function blobify(data) { | ||||
| } | ||||
| /* write or download file */ | ||||
| function write_dl(fname/*:string*/, payload/*:any*/, enc/*:?string*/) { | ||||
| 	/*global IE_SaveFile, Blob, navigator, saveAs, URL, document */ | ||||
| 	/*global IE_SaveFile, Blob, navigator, saveAs, URL, document, File */ | ||||
| 	if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload); | ||||
| 	var data = (enc == "utf8") ? utf8write(payload) : payload; | ||||
| 	/*:: declare var IE_SaveFile: any; */ | ||||
| @ -1892,9 +1892,28 @@ function write_dl(fname/*:string*/, payload/*:any*/, enc/*:?string*/) { | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	throw new Error("cannot initiate download"); | ||||
| 	// $FlowIgnore
 | ||||
| 	if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
 | ||||
| 		// $FlowIgnore
 | ||||
| 		var out = File(fname); out.open("w"); out.encoding = "binary"; | ||||
| 		if(Array.isArray(payload)) payload = a2s(payload); | ||||
| 		out.write(payload); out.close(); return payload; | ||||
| 	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } | ||||
| 	throw new Error("cannot save file " + fname); | ||||
| } | ||||
| 
 | ||||
| /* read binary data from file */ | ||||
| function read_binary(path/*:string*/) { | ||||
| 	if(typeof _fs !== 'undefined') return _fs.readFileSync(path); | ||||
| 	// $FlowIgnore
 | ||||
| 	if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
 | ||||
| 		// $FlowIgnore
 | ||||
| 		var infile = File(path); infile.open("r"); infile.encoding = "binary"; | ||||
| 		var data = infile.read(); infile.close(); | ||||
| 		return data; | ||||
| 	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } | ||||
| 	throw new Error("Cannot access file " + path); | ||||
| } | ||||
| function keys(o/*:any*/)/*:Array<any>*/ { return Object.keys(o); } | ||||
| 
 | ||||
| function evert_key(obj/*:any*/, key/*:string*/)/*:EvertType*/ { | ||||
| @ -2364,25 +2383,25 @@ function read_double_le(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { | ||||
| 	var e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f); | ||||
| 	var m = (b[idx+6]&0x0f); | ||||
| 	for(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i]; | ||||
| 	if(e == 0x7ff) return m == 0 ? s * Infinity : NaN; | ||||
| 	if(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN; | ||||
| 	if(e == 0) e = -1022; | ||||
| 	else { e -= 1023; m += Math.pow(2,52); } | ||||
| 	return s * Math.pow(2, e - 52) * m; | ||||
| } | ||||
| 
 | ||||
| function write_double_le(b/*:RawBytes|CFBlob*/, v/*:number*/, idx/*:number*/) { | ||||
| 	var bs = ((v < 0 || 1/v == -Infinity) ? 1 : 0) << 7, e = 0, m = 0; | ||||
| 	var av = bs ? -v : v; | ||||
| 	var bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0; | ||||
| 	var av = bs ? (-v) : v; | ||||
| 	if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; } | ||||
| 	else if(av == 0) e = m = 0; | ||||
| 	else { | ||||
| 		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; } | ||||
| 		if((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; } | ||||
| 		else { m -= Math.pow(2,52); e+=1023; } | ||||
| 	} | ||||
| 	for(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff; | ||||
| 	b[idx + 6] = ((e & 0x0f) << 4) | m & 0xf; | ||||
| 	b[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf); | ||||
| 	b[idx + 7] = (e >> 4) | bs; | ||||
| } | ||||
| 
 | ||||
| @ -2434,8 +2453,8 @@ if(typeof cptable !== 'undefined') { | ||||
| } | ||||
| 
 | ||||
| var __readUInt8 = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx]; }; | ||||
| var __readUInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx+1]*(1<<8)+b[idx]; }; | ||||
| var __readInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; }; | ||||
| var __readUInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+1]*(1<<8))+b[idx]; }; | ||||
| var __readInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); }; | ||||
| var __readUInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; }; | ||||
| var __readInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; }; | ||||
| var __readInt32BE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; }; | ||||
| @ -2446,7 +2465,7 @@ function ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ { | ||||
| 		case 'dbcs': | ||||
| 			loc = this.l; | ||||
| 			if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le"); | ||||
| 			else for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | ||||
| 			else for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | ||||
| 			size *= 2; | ||||
| 			break; | ||||
| 
 | ||||
| @ -2477,7 +2496,7 @@ function ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ { | ||||
| 
 | ||||
| 		/* sbcs and dbcs support continue records in the SST way TODO codepages */ | ||||
| 		case 'dbcs-cont': o = ""; loc = this.l; | ||||
| 			for(i = 0; i != size; ++i) { | ||||
| 			for(i = 0; i < size; ++i) { | ||||
| 				if(this.lens && this.lens.indexOf(loc) !== -1) { | ||||
| 					w = __readUInt8(this, loc); | ||||
| 					this.l = loc + 1; | ||||
| @ -2511,7 +2530,7 @@ function ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ { | ||||
| 		case 1: oI = __readUInt8(this, this.l); this.l++; return oI; | ||||
| 		case 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI; | ||||
| 		case 4: case -4: | ||||
| 			if(t === 'i' || (this[this.l+3] & 0x80)===0) { oI = (size > 0 ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } | ||||
| 			if(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } | ||||
| 			else { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR; | ||||
| 		case 8: case -8: | ||||
| 			if(t === 'f') { | ||||
| @ -2540,20 +2559,20 @@ function WriteShift(t/*:number*/, val/*:string|number*/, f/*:?string*/)/*:any*/ | ||||
| 		/*:: if(typeof val !== 'string') throw new Error("unreachable"); */ | ||||
| 		val = val.replace(/[^\x00-\x7F]/g, "_"); | ||||
| 		/*:: if(typeof val !== 'string') throw new Error("unreachable"); */ | ||||
| 		for(i = 0; i != val.length; ++i) this[this.l + i] = val.charCodeAt(i) & 0xFF; | ||||
| 		for(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF); | ||||
| 		size = val.length; | ||||
| 	} else if(f === 'hex') { | ||||
| 		for(; i < t; ++i) { | ||||
| 			/*:: if(typeof val !== "string") throw new Error("unreachable"); */ | ||||
| 			this[this.l++] = parseInt(val.slice(2*i, 2*i+2), 16)||0; | ||||
| 			this[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0); | ||||
| 		} return this; | ||||
| 	} else if(f === 'utf16le') { | ||||
| 			/*:: if(typeof val !== "string") throw new Error("unreachable"); */ | ||||
| 			var end/*:number*/ = this.l + t; | ||||
| 			for(i = 0; i < Math.min(val.length, t); ++i) { | ||||
| 				var cc = val.charCodeAt(i); | ||||
| 				this[this.l++] = cc & 0xff; | ||||
| 				this[this.l++] = cc >> 8; | ||||
| 				this[this.l++] = (cc & 0xff); | ||||
| 				this[this.l++] = (cc >> 8); | ||||
| 			} | ||||
| 			while(this.l < end) this[this.l++] = 0; | ||||
| 			return this; | ||||
| @ -2624,13 +2643,13 @@ function buf_array()/*:BufArray*/ { | ||||
| 
 | ||||
| 	var endbuf = function ba_endbuf() { | ||||
| 		if(!curbuf) return; | ||||
| 		if(curbuf.length > curbuf.l) curbuf = curbuf.slice(0, curbuf.l); | ||||
| 		if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } | ||||
| 		if(curbuf.length > 0) bufs.push(curbuf); | ||||
| 		curbuf = null; | ||||
| 	}; | ||||
| 
 | ||||
| 	var next = function ba_next(sz/*:number*/)/*:Block*/ { | ||||
| 		if(curbuf && sz < curbuf.length - curbuf.l) return curbuf; | ||||
| 		if(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf; | ||||
| 		endbuf(); | ||||
| 		return (curbuf = newblk(Math.max(sz+1, blksz))); | ||||
| 	}; | ||||
| @ -2640,7 +2659,7 @@ function buf_array()/*:BufArray*/ { | ||||
| 		return __toBuffer([bufs]); | ||||
| 	}; | ||||
| 
 | ||||
| 	var push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); }; | ||||
| 	var push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); }; | ||||
| 
 | ||||
| 	return ({ next:next, push:push, end:end, _bufs:bufs }/*:any*/); | ||||
| } | ||||
| @ -2994,17 +3013,17 @@ var write_RelID = write_XLNullableWideString; | ||||
| /* [MS-XLS] 2.5.217 */ | ||||
| function parse_RkNumber(data)/*:number*/ { | ||||
| 	var b = data.slice(data.l, data.l+4); | ||||
| 	var fX100 = b[0] & 1, fInt = b[0] & 2; | ||||
| 	var fX100 = (b[0] & 1), fInt = (b[0] & 2); | ||||
| 	data.l+=4; | ||||
| 	b[0] &= 0xFC; // b[0] &= ~3;
 | ||||
| 	var RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2; | ||||
| 	return fX100 ? RK/100 : RK; | ||||
| 	return fX100 ? (RK/100) : RK; | ||||
| } | ||||
| function write_RkNumber(data/*:number*/, o) { | ||||
| 	if(o == null) o = new_buf(4); | ||||
| 	var fX100 = 0, fInt = 0, d100 = data * 100; | ||||
| 	if(data == (data | 0) && data >= -(1<<29) && data < (1 << 29)) { fInt = 1; } | ||||
| 	else if(d100 == (d100 | 0) && d100 >= -(1<<29) && d100 < (1 << 29)) { fInt = 1; fX100 = 1; } | ||||
| 	if((data == (data | 0)) && (data >= -(1<<29)) && (data < (1 << 29))) { fInt = 1; } | ||||
| 	else if((d100 == (d100 | 0)) && (d100 >= -(1<<29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; } | ||||
| 	if(fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2)); | ||||
| 	else throw new Error("unsupported RkNumber " + data); // TODO
 | ||||
| } | ||||
| @ -4941,7 +4960,8 @@ function write_BoundSheet8(data, opts) { | ||||
| 	o.write_shift(1, data.name.length); | ||||
| 	if(opts.biff >= 8) o.write_shift(1, 1); | ||||
| 	o.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le'); | ||||
| 	return o.slice(0, o.l); | ||||
| 	var out = o.slice(0, o.l); | ||||
| 	out.l = o.l; return out; | ||||
| } | ||||
| 
 | ||||
| /* 2.4.265 TODO */ | ||||
| @ -5085,10 +5105,10 @@ function parse_Label(blob, length, opts) { | ||||
| 	cell.val = str; | ||||
| 	return cell; | ||||
| } | ||||
| function write_Label(R/*:number*/, C/*:number*/, v/*:string*/, opts) { | ||||
| function write_Label(R/*:number*/, C/*:number*/, v/*:string*/, os/*:number*/, opts) { | ||||
| 	var b8 = !opts || opts.biff == 8; | ||||
| 	var o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	o.write_shift(2, v.length); | ||||
| 	if(b8) o.write_shift(1, 1); | ||||
| 	o.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs'); | ||||
| @ -5102,6 +5122,14 @@ function parse_Format(blob, length, opts) { | ||||
| 	var fmtstr = parse_XLUnicodeString2(blob, 0, opts); | ||||
| 	return [numFmtId, fmtstr]; | ||||
| } | ||||
| function write_Format(i/*:number*/, f/*:string*/, o) { | ||||
| 	if(!o) o = new_buf(6 + 4 * f.length); | ||||
| 	o.write_shift(2, i); | ||||
| 	write_XLUnicodeString(f, null, o); | ||||
| 	var out = (o.length > o.l) ? o.slice(0, o.l) : o; | ||||
| 	if(o.l == null) o.l = o.length; | ||||
| 	return out; | ||||
| } | ||||
| var parse_BIFF2Format = parse_XLUnicodeString2; | ||||
| 
 | ||||
| /* 2.4.90 */ | ||||
| @ -5207,6 +5235,17 @@ function parse_XF(blob, length, opts) { | ||||
| 	o.data = parse_CellStyleXF(blob, length, o.fStyle, opts); | ||||
| 	return o; | ||||
| } | ||||
| function write_XF(data, ixfeP, o) { | ||||
| 	if(!o) o = new_buf(20); | ||||
| 	o.write_shift(2, 0); | ||||
| 	o.write_shift(2, data.numFmtId||0); | ||||
| 	o.write_shift(2, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(2, 0); | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| /* 2.4.134 */ | ||||
| function parse_Guts(blob) { | ||||
| @ -5234,9 +5273,9 @@ function parse_BoolErr(blob, length, opts) { | ||||
| 	cell.t = (val === true || val === false) ? 'b' : 'e'; | ||||
| 	return cell; | ||||
| } | ||||
| function write_BoolErr(R/*:number*/, C/*:number*/, v, opts, t/*:string*/) { | ||||
| function write_BoolErr(R/*:number*/, C/*:number*/, v, os/*:number*/, opts, t/*:string*/) { | ||||
| 	var o = new_buf(8); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	write_Bes(v, t, o); | ||||
| 	return o; | ||||
| } | ||||
| @ -5248,9 +5287,9 @@ function parse_Number(blob) { | ||||
| 	cell.val = xnum; | ||||
| 	return cell; | ||||
| } | ||||
| function write_Number(R/*:number*/, C/*:number*/, v/*::, opts*/) { | ||||
| function write_Number(R/*:number*/, C/*:number*/, v, os/*:: :number, opts*/) { | ||||
| 	var o = new_buf(14); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	write_Xnum(v, o); | ||||
| 	return o; | ||||
| } | ||||
| @ -6163,7 +6202,7 @@ var SYLK = (function() { | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C]: ws[coord]; | ||||
| 				if(!cell || cell.v == null && (!cell.f || cell.F)) continue; | ||||
| 				if(!cell || (cell.v == null && (!cell.f || cell.F))) continue; | ||||
| 				o.push(write_ws_cell_sylk(cell, ws, R, C, opts)); | ||||
| 			} | ||||
| 		} | ||||
| @ -8061,7 +8100,9 @@ function write_BrtFmt(i/*:number*/, f/*:string*/, o) { | ||||
| 	if(!o) o = new_buf(6 + 4 * f.length); | ||||
| 	o.write_shift(2, i); | ||||
| 	write_XLWideString(f, o); | ||||
| 	return o.length > o.l ? o.slice(0, o.l) : o; | ||||
| 	var out = (o.length > o.l) ? o.slice(0, o.l) : o; | ||||
| 	if(o.l == null) o.l = o.length; | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.4.653 BrtFont TODO */ | ||||
| @ -9180,7 +9221,7 @@ function make_vba_xls(cfb/*:CFBContainer*/) { | ||||
| 	var newcfb = CFB.utils.cfb_new({root:"R"}); | ||||
| 	cfb.FullPaths.forEach(function(p, i) { | ||||
| 		if(p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/)) return; | ||||
| 		var newpath = p.replace(/^[^/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); | ||||
| 		var newpath = p.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); | ||||
| 		CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content); | ||||
| 	}); | ||||
| 	return CFB.write(newcfb); | ||||
| @ -9189,7 +9230,7 @@ function make_vba_xls(cfb/*:CFBContainer*/) { | ||||
| function fill_vba_xls(cfb/*:CFBContainer*/, vba/*:CFBContainer*/)/*:void*/ { | ||||
| 	vba.FullPaths.forEach(function(p, i) { | ||||
| 		if(i == 0) return; | ||||
| 		var newpath = p.replace(/[^/]*[/]/, "/_VBA_PROJECT_CUR/"); | ||||
| 		var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/"); | ||||
| 		if(newpath.slice(-1) !== "/") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content); | ||||
| 	}); | ||||
| } | ||||
| @ -12154,7 +12195,7 @@ function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook | ||||
| 			if(_cell === undefined) continue; | ||||
| 			if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell); | ||||
| 		} | ||||
| 		if(r.length > 0 || rows && rows[R]) { | ||||
| 		if(r.length > 0 || (rows && rows[R])) { | ||||
| 			params = ({r:rr}/*:any*/); | ||||
| 			if(rows && rows[R]) { | ||||
| 				row = rows[R]; | ||||
| @ -12342,7 +12383,7 @@ function write_BrtRowHdr(R/*:number*/, range, ws) { | ||||
| 
 | ||||
| 	var caddr = {r:R, c:0}; | ||||
| 	for(var i = 0; i < 16; ++i) { | ||||
| 		if(range.s.c > ((i+1) << 10) || range.e.c < (i << 10)) continue; | ||||
| 		if((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue; | ||||
| 		var first = -1, last = -1; | ||||
| 		for(var j = (i<<10); j < ((i+1)<<10); ++j) { | ||||
| 			caddr.c = j; | ||||
| @ -12364,7 +12405,7 @@ function write_BrtRowHdr(R/*:number*/, range, ws) { | ||||
| } | ||||
| function write_row_header(ba, ws, range, R) { | ||||
| 	var o = write_BrtRowHdr(R, range, ws); | ||||
| 	if(o.length > 17 || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o); | ||||
| 	if((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o); | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.4.812 BrtWsDim */ | ||||
| @ -15044,7 +15085,7 @@ function write_ws_xlml_comment(comments/*:Array<any>*/)/*:string*/ { | ||||
| 	}).join(""); | ||||
| } | ||||
| function write_ws_xlml_cell(cell, ref/*:string*/, ws, opts, idx/*:number*/, wb, addr)/*:string*/{ | ||||
| 	if(!cell || cell.v == undefined && cell.f == undefined) return ""; | ||||
| 	if(!cell || (cell.v == undefined && cell.f == undefined)) return ""; | ||||
| 
 | ||||
| 	var attr = {}; | ||||
| 	if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); | ||||
| @ -17436,6 +17477,19 @@ function write_biff2_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) { | ||||
| 	return ba.end(); | ||||
| } | ||||
| 
 | ||||
| function write_FMTS_biff8(ba, NF/*:?SSFTable*/) { | ||||
| 	if(!NF) return; | ||||
| 	[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) { | ||||
| 		/*:: if(!NF) return; */ | ||||
| 		for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_biff_rec(ba, "Format", write_Format(i, NF[i])); | ||||
| 	}); | ||||
| } | ||||
| function write_CELLXFS_biff8(ba, data) { | ||||
| 	data.forEach(function(c) { | ||||
| 		write_biff_rec(ba, "XF", write_XF(c,0)); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff8_hlinks(ba/*:BufArray*/, ws) { | ||||
| 	for(var R=0; R<ws['!links'].length; ++R) { | ||||
| 		var HL = ws['!links'][R]; | ||||
| @ -17446,19 +17500,20 @@ function write_ws_biff8_hlinks(ba/*:BufArray*/, ws) { | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff8_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*/, opts) { | ||||
| 	var os = get_cell_style(opts.cellXfs, cell, opts); | ||||
| 	if(cell.v != null) switch(cell.t) { | ||||
| 		case 'd': case 'n': | ||||
| 			var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v; | ||||
| 			/* TODO: emit RK as appropriate */ | ||||
| 			write_biff_rec(ba, "Number", write_Number(R, C, v, opts)); | ||||
| 			write_biff_rec(ba, "Number", write_Number(R, C, v, os, opts)); | ||||
| 			return; | ||||
| 		case 'b': case 'e': write_biff_rec(ba, "BoolErr", write_BoolErr(R, C, cell.v, opts, cell.t)); return; | ||||
| 		case 'b': case 'e': write_biff_rec(ba, "BoolErr", write_BoolErr(R, C, cell.v, os, opts, cell.t)); return; | ||||
| 		/* TODO: codepage, sst */ | ||||
| 		case 's': case 'str': | ||||
| 			write_biff_rec(ba, "Label", write_Label(R, C, cell.v, opts)); | ||||
| 			write_biff_rec(ba, "Label", write_Label(R, C, cell.v, os, opts)); | ||||
| 			return; | ||||
| 	} | ||||
| 	write_biff_rec(ba, "Blank", write_XLSCell(R, C)); | ||||
| 	write_biff_rec(ba, "Blank", write_XLSCell(R, C, os)); | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLS] 2.1.7.20.5 */ | ||||
| @ -17553,6 +17608,9 @@ function write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) { | ||||
| 	if(b8) write_biff_rec(A, "RefreshAll", writebool(false)); | ||||
| 	write_biff_rec(A, "BookBool", writeuint16(0)); | ||||
| 	/* ... */ | ||||
| 	if(b8) write_FMTS_biff8(A, wb.SSF); | ||||
| 	if(b8) write_CELLXFS_biff8(A, opts.cellXfs); | ||||
| 	/* ... */ | ||||
| 	if(b8) write_biff_rec(A, "UsesELFs", writebool(false)); | ||||
| 	var a = A.end(); | ||||
| 
 | ||||
| @ -17585,6 +17643,20 @@ function write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) { | ||||
| function write_biff8_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) { | ||||
| 	var o = opts || {}; | ||||
| 	var bufs = []; | ||||
| 
 | ||||
| 	if(wb && !wb.SSF) { | ||||
| 		wb.SSF = SSF.get_table(); | ||||
| 	} | ||||
| 	if(wb && wb.SSF) { | ||||
| 		make_ssf(SSF); SSF.load_table(wb.SSF); | ||||
| 		// $FlowIgnore
 | ||||
| 		o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0; | ||||
| 		o.ssf = wb.SSF; | ||||
| 	} | ||||
| 	o.cellXfs = []; | ||||
| 	o.Strings = /*::((*/[]/*:: :any):SST)*/; o.Strings.Count = 0; o.Strings.Unique = 0; | ||||
| 	get_cell_style(o.cellXfs, {}, {revssf:{"General":0}}); | ||||
| 
 | ||||
| 	for(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb); | ||||
| 	bufs.unshift(write_biff8_global(wb, bufs, o)); | ||||
| 	return __toBuffer([bufs]); | ||||
| @ -19030,7 +19102,7 @@ function readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ { | ||||
| 	_ssfopts = {}; | ||||
| 	if(o.dateNF) _ssfopts.dateNF = o.dateNF; | ||||
| 	if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64"; | ||||
| 	if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); } | ||||
| 	if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); } | ||||
| 	if(o.type == "string") { str = true; o.type = "binary"; d = bstrify(data); } | ||||
| 	if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') { | ||||
| 		// $FlowIgnore
 | ||||
| @ -19147,6 +19219,7 @@ function writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) { | ||||
| 		case 'xlml': return write_string_type(write_xlml(wb, o), o); | ||||
| 		case 'slk': | ||||
| 		case 'sylk': return write_string_type(write_slk_str(wb, o), o); | ||||
| 		case 'htm': | ||||
| 		case 'html': return write_string_type(write_htm_str(wb, o), o); | ||||
| 		case 'txt': return write_stxt_type(write_txt_str(wb, o), o); | ||||
| 		case 'csv': return write_string_type(write_csv_str(wb, o), o, "\ufeff"); | ||||
|  | ||||
							
								
								
									
										160
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										160
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							| @ -4,7 +4,7 @@ | ||||
| /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ | ||||
| var XLSX = {}; | ||||
| (function make_xlsx(XLSX){ | ||||
| XLSX.version = '0.11.19'; | ||||
| XLSX.version = '0.12.0'; | ||||
| var current_codepage = 1200, current_ansi = 1252; | ||||
| /*global cptable:true */ | ||||
| if(typeof module !== "undefined" && typeof require !== 'undefined') { | ||||
| @ -1798,7 +1798,7 @@ function blobify(data) { | ||||
| } | ||||
| /* write or download file */ | ||||
| function write_dl(fname, payload, enc) { | ||||
| 	/*global IE_SaveFile, Blob, navigator, saveAs, URL, document */ | ||||
| 	/*global IE_SaveFile, Blob, navigator, saveAs, URL, document, File */ | ||||
| 	if(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload); | ||||
| 	var data = (enc == "utf8") ? utf8write(payload) : payload; | ||||
| if(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname); | ||||
| @ -1817,9 +1817,28 @@ document.body.removeChild(a); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	throw new Error("cannot initiate download"); | ||||
| 	// $FlowIgnore
 | ||||
| 	if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
 | ||||
| 		// $FlowIgnore
 | ||||
| 		var out = File(fname); out.open("w"); out.encoding = "binary"; | ||||
| 		if(Array.isArray(payload)) payload = a2s(payload); | ||||
| 		out.write(payload); out.close(); return payload; | ||||
| 	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } | ||||
| 	throw new Error("cannot save file " + fname); | ||||
| } | ||||
| 
 | ||||
| /* read binary data from file */ | ||||
| function read_binary(path) { | ||||
| 	if(typeof _fs !== 'undefined') return _fs.readFileSync(path); | ||||
| 	// $FlowIgnore
 | ||||
| 	if(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript
 | ||||
| 		// $FlowIgnore
 | ||||
| 		var infile = File(path); infile.open("r"); infile.encoding = "binary"; | ||||
| 		var data = infile.read(); infile.close(); | ||||
| 		return data; | ||||
| 	} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; } | ||||
| 	throw new Error("Cannot access file " + path); | ||||
| } | ||||
| function keys(o) { return Object.keys(o); } | ||||
| 
 | ||||
| function evert_key(obj, key) { | ||||
| @ -2287,25 +2306,25 @@ function read_double_le(b, idx) { | ||||
| 	var e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f); | ||||
| 	var m = (b[idx+6]&0x0f); | ||||
| 	for(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i]; | ||||
| 	if(e == 0x7ff) return m == 0 ? s * Infinity : NaN; | ||||
| 	if(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN; | ||||
| 	if(e == 0) e = -1022; | ||||
| 	else { e -= 1023; m += Math.pow(2,52); } | ||||
| 	return s * Math.pow(2, e - 52) * m; | ||||
| } | ||||
| 
 | ||||
| function write_double_le(b, v, idx) { | ||||
| 	var bs = ((v < 0 || 1/v == -Infinity) ? 1 : 0) << 7, e = 0, m = 0; | ||||
| 	var av = bs ? -v : v; | ||||
| 	var bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0; | ||||
| 	var av = bs ? (-v) : v; | ||||
| 	if(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; } | ||||
| 	else if(av == 0) e = m = 0; | ||||
| 	else { | ||||
| 		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; } | ||||
| 		if((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; } | ||||
| 		else { m -= Math.pow(2,52); e+=1023; } | ||||
| 	} | ||||
| 	for(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff; | ||||
| 	b[idx + 6] = ((e & 0x0f) << 4) | m & 0xf; | ||||
| 	b[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf); | ||||
| 	b[idx + 7] = (e >> 4) | bs; | ||||
| } | ||||
| 
 | ||||
| @ -2357,8 +2376,8 @@ if(typeof cptable !== 'undefined') { | ||||
| } | ||||
| 
 | ||||
| var __readUInt8 = function(b, idx) { return b[idx]; }; | ||||
| var __readUInt16LE = function(b, idx) { return b[idx+1]*(1<<8)+b[idx]; }; | ||||
| var __readInt16LE = function(b, idx) { var u = b[idx+1]*(1<<8)+b[idx]; return (u < 0x8000) ? u : (0xffff - u + 1) * -1; }; | ||||
| var __readUInt16LE = function(b, idx) { return (b[idx+1]*(1<<8))+b[idx]; }; | ||||
| var __readInt16LE = function(b, idx) { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); }; | ||||
| var __readUInt32LE = function(b, idx) { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; }; | ||||
| var __readInt32LE = function(b, idx) { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; }; | ||||
| var __readInt32BE = function(b, idx) { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; }; | ||||
| @ -2369,7 +2388,7 @@ function ReadShift(size, t) { | ||||
| 		case 'dbcs': | ||||
| 			loc = this.l; | ||||
| 			if(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString("utf16le"); | ||||
| 			else for(i = 0; i != size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | ||||
| 			else for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; } | ||||
| 			size *= 2; | ||||
| 			break; | ||||
| 
 | ||||
| @ -2400,7 +2419,7 @@ function ReadShift(size, t) { | ||||
| 
 | ||||
| 		/* sbcs and dbcs support continue records in the SST way TODO codepages */ | ||||
| 		case 'dbcs-cont': o = ""; loc = this.l; | ||||
| 			for(i = 0; i != size; ++i) { | ||||
| 			for(i = 0; i < size; ++i) { | ||||
| 				if(this.lens && this.lens.indexOf(loc) !== -1) { | ||||
| 					w = __readUInt8(this, loc); | ||||
| 					this.l = loc + 1; | ||||
| @ -2434,7 +2453,7 @@ function ReadShift(size, t) { | ||||
| 		case 1: oI = __readUInt8(this, this.l); this.l++; return oI; | ||||
| 		case 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI; | ||||
| 		case 4: case -4: | ||||
| 			if(t === 'i' || (this[this.l+3] & 0x80)===0) { oI = (size > 0 ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } | ||||
| 			if(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; } | ||||
| 			else { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR; | ||||
| 		case 8: case -8: | ||||
| 			if(t === 'f') { | ||||
| @ -2460,18 +2479,18 @@ for(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l | ||||
| 	} else if(f === 'sbcs') { | ||||
| 		/* TODO: codepage */ | ||||
| val = val.replace(/[^\x00-\x7F]/g, "_"); | ||||
| for(i = 0; i != val.length; ++i) this[this.l + i] = val.charCodeAt(i) & 0xFF; | ||||
| for(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF); | ||||
| 		size = val.length; | ||||
| 	} else if(f === 'hex') { | ||||
| 		for(; i < t; ++i) { | ||||
| this[this.l++] = parseInt(val.slice(2*i, 2*i+2), 16)||0; | ||||
| this[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0); | ||||
| 		} return this; | ||||
| 	} else if(f === 'utf16le') { | ||||
| var end = this.l + t; | ||||
| 			for(i = 0; i < Math.min(val.length, t); ++i) { | ||||
| 				var cc = val.charCodeAt(i); | ||||
| 				this[this.l++] = cc & 0xff; | ||||
| 				this[this.l++] = cc >> 8; | ||||
| 				this[this.l++] = (cc & 0xff); | ||||
| 				this[this.l++] = (cc >> 8); | ||||
| 			} | ||||
| 			while(this.l < end) this[this.l++] = 0; | ||||
| 			return this; | ||||
| @ -2542,13 +2561,13 @@ function buf_array() { | ||||
| 
 | ||||
| 	var endbuf = function ba_endbuf() { | ||||
| 		if(!curbuf) return; | ||||
| 		if(curbuf.length > curbuf.l) curbuf = curbuf.slice(0, curbuf.l); | ||||
| 		if(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; } | ||||
| 		if(curbuf.length > 0) bufs.push(curbuf); | ||||
| 		curbuf = null; | ||||
| 	}; | ||||
| 
 | ||||
| 	var next = function ba_next(sz) { | ||||
| 		if(curbuf && sz < curbuf.length - curbuf.l) return curbuf; | ||||
| 		if(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf; | ||||
| 		endbuf(); | ||||
| 		return (curbuf = newblk(Math.max(sz+1, blksz))); | ||||
| 	}; | ||||
| @ -2558,7 +2577,7 @@ function buf_array() { | ||||
| 		return __toBuffer([bufs]); | ||||
| 	}; | ||||
| 
 | ||||
| 	var push = function ba_push(buf) { endbuf(); curbuf = buf; next(blksz); }; | ||||
| 	var push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); }; | ||||
| 
 | ||||
| 	return ({ next:next, push:push, end:end, _bufs:bufs }); | ||||
| } | ||||
| @ -2906,17 +2925,17 @@ var write_RelID = write_XLNullableWideString; | ||||
| /* [MS-XLS] 2.5.217 */ | ||||
| function parse_RkNumber(data) { | ||||
| 	var b = data.slice(data.l, data.l+4); | ||||
| 	var fX100 = b[0] & 1, fInt = b[0] & 2; | ||||
| 	var fX100 = (b[0] & 1), fInt = (b[0] & 2); | ||||
| 	data.l+=4; | ||||
| 	b[0] &= 0xFC; // b[0] &= ~3;
 | ||||
| 	var RK = fInt === 0 ? __double([0,0,0,0,b[0],b[1],b[2],b[3]],0) : __readInt32LE(b,0)>>2; | ||||
| 	return fX100 ? RK/100 : RK; | ||||
| 	return fX100 ? (RK/100) : RK; | ||||
| } | ||||
| function write_RkNumber(data, o) { | ||||
| 	if(o == null) o = new_buf(4); | ||||
| 	var fX100 = 0, fInt = 0, d100 = data * 100; | ||||
| 	if(data == (data | 0) && data >= -(1<<29) && data < (1 << 29)) { fInt = 1; } | ||||
| 	else if(d100 == (d100 | 0) && d100 >= -(1<<29) && d100 < (1 << 29)) { fInt = 1; fX100 = 1; } | ||||
| 	if((data == (data | 0)) && (data >= -(1<<29)) && (data < (1 << 29))) { fInt = 1; } | ||||
| 	else if((d100 == (d100 | 0)) && (d100 >= -(1<<29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; } | ||||
| 	if(fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2)); | ||||
| 	else throw new Error("unsupported RkNumber " + data); // TODO
 | ||||
| } | ||||
| @ -4851,7 +4870,8 @@ function write_BoundSheet8(data, opts) { | ||||
| 	o.write_shift(1, data.name.length); | ||||
| 	if(opts.biff >= 8) o.write_shift(1, 1); | ||||
| 	o.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le'); | ||||
| 	return o.slice(0, o.l); | ||||
| 	var out = o.slice(0, o.l); | ||||
| 	out.l = o.l; return out; | ||||
| } | ||||
| 
 | ||||
| /* 2.4.265 TODO */ | ||||
| @ -4995,10 +5015,10 @@ function parse_Label(blob, length, opts) { | ||||
| 	cell.val = str; | ||||
| 	return cell; | ||||
| } | ||||
| function write_Label(R, C, v, opts) { | ||||
| function write_Label(R, C, v, os, opts) { | ||||
| 	var b8 = !opts || opts.biff == 8; | ||||
| 	var o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	o.write_shift(2, v.length); | ||||
| 	if(b8) o.write_shift(1, 1); | ||||
| 	o.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs'); | ||||
| @ -5012,6 +5032,14 @@ function parse_Format(blob, length, opts) { | ||||
| 	var fmtstr = parse_XLUnicodeString2(blob, 0, opts); | ||||
| 	return [numFmtId, fmtstr]; | ||||
| } | ||||
| function write_Format(i, f, o) { | ||||
| 	if(!o) o = new_buf(6 + 4 * f.length); | ||||
| 	o.write_shift(2, i); | ||||
| 	write_XLUnicodeString(f, null, o); | ||||
| 	var out = (o.length > o.l) ? o.slice(0, o.l) : o; | ||||
| 	if(o.l == null) o.l = o.length; | ||||
| 	return out; | ||||
| } | ||||
| var parse_BIFF2Format = parse_XLUnicodeString2; | ||||
| 
 | ||||
| /* 2.4.90 */ | ||||
| @ -5117,6 +5145,17 @@ function parse_XF(blob, length, opts) { | ||||
| 	o.data = parse_CellStyleXF(blob, length, o.fStyle, opts); | ||||
| 	return o; | ||||
| } | ||||
| function write_XF(data, ixfeP, o) { | ||||
| 	if(!o) o = new_buf(20); | ||||
| 	o.write_shift(2, 0); | ||||
| 	o.write_shift(2, data.numFmtId||0); | ||||
| 	o.write_shift(2, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(4, 0); | ||||
| 	o.write_shift(2, 0); | ||||
| 	return o; | ||||
| } | ||||
| 
 | ||||
| /* 2.4.134 */ | ||||
| function parse_Guts(blob) { | ||||
| @ -5144,9 +5183,9 @@ function parse_BoolErr(blob, length, opts) { | ||||
| 	cell.t = (val === true || val === false) ? 'b' : 'e'; | ||||
| 	return cell; | ||||
| } | ||||
| function write_BoolErr(R, C, v, opts, t) { | ||||
| function write_BoolErr(R, C, v, os, opts, t) { | ||||
| 	var o = new_buf(8); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	write_Bes(v, t, o); | ||||
| 	return o; | ||||
| } | ||||
| @ -5158,9 +5197,9 @@ function parse_Number(blob) { | ||||
| 	cell.val = xnum; | ||||
| 	return cell; | ||||
| } | ||||
| function write_Number(R, C, v) { | ||||
| function write_Number(R, C, v, os) { | ||||
| 	var o = new_buf(14); | ||||
| 	write_XLSCell(R, C, 0, o); | ||||
| 	write_XLSCell(R, C, os, o); | ||||
| 	write_Xnum(v, o); | ||||
| 	return o; | ||||
| } | ||||
| @ -6072,7 +6111,7 @@ var SYLK = (function() { | ||||
| 			for(var C = r.s.c; C <= r.e.c; ++C) { | ||||
| 				var coord = encode_cell({r:R,c:C}); | ||||
| 				cell = dense ? (ws[R]||[])[C]: ws[coord]; | ||||
| 				if(!cell || cell.v == null && (!cell.f || cell.F)) continue; | ||||
| 				if(!cell || (cell.v == null && (!cell.f || cell.F))) continue; | ||||
| 				o.push(write_ws_cell_sylk(cell, ws, R, C, opts)); | ||||
| 			} | ||||
| 		} | ||||
| @ -7969,7 +8008,9 @@ function write_BrtFmt(i, f, o) { | ||||
| 	if(!o) o = new_buf(6 + 4 * f.length); | ||||
| 	o.write_shift(2, i); | ||||
| 	write_XLWideString(f, o); | ||||
| 	return o.length > o.l ? o.slice(0, o.l) : o; | ||||
| 	var out = (o.length > o.l) ? o.slice(0, o.l) : o; | ||||
| 	if(o.l == null) o.l = o.length; | ||||
| 	return out; | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.4.653 BrtFont TODO */ | ||||
| @ -9086,7 +9127,7 @@ function make_vba_xls(cfb) { | ||||
| 	var newcfb = CFB.utils.cfb_new({root:"R"}); | ||||
| 	cfb.FullPaths.forEach(function(p, i) { | ||||
| 		if(p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/)) return; | ||||
| 		var newpath = p.replace(/^[^/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); | ||||
| 		var newpath = p.replace(/^[^\/]*/,"R").replace(/\/_VBA_PROJECT_CUR\u0000*/, ""); | ||||
| 		CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content); | ||||
| 	}); | ||||
| 	return CFB.write(newcfb); | ||||
| @ -9095,7 +9136,7 @@ function make_vba_xls(cfb) { | ||||
| function fill_vba_xls(cfb, vba) { | ||||
| 	vba.FullPaths.forEach(function(p, i) { | ||||
| 		if(i == 0) return; | ||||
| 		var newpath = p.replace(/[^/]*[/]/, "/_VBA_PROJECT_CUR/"); | ||||
| 		var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/"); | ||||
| 		if(newpath.slice(-1) !== "/") CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content); | ||||
| 	}); | ||||
| } | ||||
| @ -12059,7 +12100,7 @@ function write_ws_xml_data(ws, opts, idx, wb) { | ||||
| 			if(_cell === undefined) continue; | ||||
| 			if((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell); | ||||
| 		} | ||||
| 		if(r.length > 0 || rows && rows[R]) { | ||||
| 		if(r.length > 0 || (rows && rows[R])) { | ||||
| 			params = ({r:rr}); | ||||
| 			if(rows && rows[R]) { | ||||
| 				row = rows[R]; | ||||
| @ -12247,7 +12288,7 @@ function write_BrtRowHdr(R, range, ws) { | ||||
| 
 | ||||
| 	var caddr = {r:R, c:0}; | ||||
| 	for(var i = 0; i < 16; ++i) { | ||||
| 		if(range.s.c > ((i+1) << 10) || range.e.c < (i << 10)) continue; | ||||
| 		if((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue; | ||||
| 		var first = -1, last = -1; | ||||
| 		for(var j = (i<<10); j < ((i+1)<<10); ++j) { | ||||
| 			caddr.c = j; | ||||
| @ -12269,7 +12310,7 @@ function write_BrtRowHdr(R, range, ws) { | ||||
| } | ||||
| function write_row_header(ba, ws, range, R) { | ||||
| 	var o = write_BrtRowHdr(R, range, ws); | ||||
| 	if(o.length > 17 || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o); | ||||
| 	if((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 'BrtRowHdr', o); | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLSB] 2.4.812 BrtWsDim */ | ||||
| @ -14939,7 +14980,7 @@ function write_ws_xlml_comment(comments) { | ||||
| 	}).join(""); | ||||
| } | ||||
| function write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){ | ||||
| 	if(!cell || cell.v == undefined && cell.f == undefined) return ""; | ||||
| 	if(!cell || (cell.v == undefined && cell.f == undefined)) return ""; | ||||
| 
 | ||||
| 	var attr = {}; | ||||
| 	if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); | ||||
| @ -17327,6 +17368,18 @@ function write_biff2_buf(wb, opts) { | ||||
| 	return ba.end(); | ||||
| } | ||||
| 
 | ||||
| function write_FMTS_biff8(ba, NF) { | ||||
| 	if(!NF) return; | ||||
| 	[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) { | ||||
| for(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_biff_rec(ba, "Format", write_Format(i, NF[i])); | ||||
| 	}); | ||||
| } | ||||
| function write_CELLXFS_biff8(ba, data) { | ||||
| 	data.forEach(function(c) { | ||||
| 		write_biff_rec(ba, "XF", write_XF(c,0)); | ||||
| 	}); | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff8_hlinks(ba, ws) { | ||||
| 	for(var R=0; R<ws['!links'].length; ++R) { | ||||
| 		var HL = ws['!links'][R]; | ||||
| @ -17337,19 +17390,20 @@ function write_ws_biff8_hlinks(ba, ws) { | ||||
| } | ||||
| 
 | ||||
| function write_ws_biff8_cell(ba, cell, R, C, opts) { | ||||
| 	var os = get_cell_style(opts.cellXfs, cell, opts); | ||||
| 	if(cell.v != null) switch(cell.t) { | ||||
| 		case 'd': case 'n': | ||||
| 			var v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v; | ||||
| 			/* TODO: emit RK as appropriate */ | ||||
| 			write_biff_rec(ba, "Number", write_Number(R, C, v, opts)); | ||||
| 			write_biff_rec(ba, "Number", write_Number(R, C, v, os, opts)); | ||||
| 			return; | ||||
| 		case 'b': case 'e': write_biff_rec(ba, "BoolErr", write_BoolErr(R, C, cell.v, opts, cell.t)); return; | ||||
| 		case 'b': case 'e': write_biff_rec(ba, "BoolErr", write_BoolErr(R, C, cell.v, os, opts, cell.t)); return; | ||||
| 		/* TODO: codepage, sst */ | ||||
| 		case 's': case 'str': | ||||
| 			write_biff_rec(ba, "Label", write_Label(R, C, cell.v, opts)); | ||||
| 			write_biff_rec(ba, "Label", write_Label(R, C, cell.v, os, opts)); | ||||
| 			return; | ||||
| 	} | ||||
| 	write_biff_rec(ba, "Blank", write_XLSCell(R, C)); | ||||
| 	write_biff_rec(ba, "Blank", write_XLSCell(R, C, os)); | ||||
| } | ||||
| 
 | ||||
| /* [MS-XLS] 2.1.7.20.5 */ | ||||
| @ -17444,6 +17498,9 @@ function write_biff8_global(wb, bufs, opts) { | ||||
| 	if(b8) write_biff_rec(A, "RefreshAll", writebool(false)); | ||||
| 	write_biff_rec(A, "BookBool", writeuint16(0)); | ||||
| 	/* ... */ | ||||
| 	if(b8) write_FMTS_biff8(A, wb.SSF); | ||||
| 	if(b8) write_CELLXFS_biff8(A, opts.cellXfs); | ||||
| 	/* ... */ | ||||
| 	if(b8) write_biff_rec(A, "UsesELFs", writebool(false)); | ||||
| 	var a = A.end(); | ||||
| 
 | ||||
| @ -17476,6 +17533,20 @@ function write_biff8_global(wb, bufs, opts) { | ||||
| function write_biff8_buf(wb, opts) { | ||||
| 	var o = opts || {}; | ||||
| 	var bufs = []; | ||||
| 
 | ||||
| 	if(wb && !wb.SSF) { | ||||
| 		wb.SSF = SSF.get_table(); | ||||
| 	} | ||||
| 	if(wb && wb.SSF) { | ||||
| 		make_ssf(SSF); SSF.load_table(wb.SSF); | ||||
| 		// $FlowIgnore
 | ||||
| 		o.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0; | ||||
| 		o.ssf = wb.SSF; | ||||
| 	} | ||||
| 	o.cellXfs = []; | ||||
| 	o.Strings = []; o.Strings.Count = 0; o.Strings.Unique = 0; | ||||
| 	get_cell_style(o.cellXfs, {}, {revssf:{"General":0}}); | ||||
| 
 | ||||
| 	for(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb); | ||||
| 	bufs.unshift(write_biff8_global(wb, bufs, o)); | ||||
| 	return __toBuffer([bufs]); | ||||
| @ -18915,7 +18986,7 @@ function readSync(data, opts) { | ||||
| 	_ssfopts = {}; | ||||
| 	if(o.dateNF) _ssfopts.dateNF = o.dateNF; | ||||
| 	if(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? "buffer" : "base64"; | ||||
| 	if(o.type == "file") { o.type = "buffer"; d = _fs.readFileSync(data); } | ||||
| 	if(o.type == "file") { o.type = has_buf ? "buffer" : "binary"; d = read_binary(data); } | ||||
| 	if(o.type == "string") { str = true; o.type = "binary"; d = bstrify(data); } | ||||
| 	if(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') { | ||||
| 		// $FlowIgnore
 | ||||
| @ -19032,6 +19103,7 @@ function writeSync(wb, opts) { | ||||
| 		case 'xlml': return write_string_type(write_xlml(wb, o), o); | ||||
| 		case 'slk': | ||||
| 		case 'sylk': return write_string_type(write_slk_str(wb, o), o); | ||||
| 		case 'htm': | ||||
| 		case 'html': return write_string_type(write_htm_str(wb, o), o); | ||||
| 		case 'txt': return write_stxt_type(write_txt_str(wb, o), o); | ||||
| 		case 'csv': return write_string_type(write_csv_str(wb, o), o, "\ufeff"); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user