forked from sheetjs/sheetjs
		
	version bump 0.12.8: sheetRows multiformat support
- all formats accept `sheetRows` option (fixes #1062 h/t @prog666) - `table_to_*` support for `sheetRows` - demo cleanup
This commit is contained in:
		
							parent
							
								
									3592efa77b
								
							
						
					
					
						commit
						93f7749bec
					
				@ -107,6 +107,12 @@ AngularJS
 | 
			
		||||
NativeScript
 | 
			
		||||
angular-cli
 | 
			
		||||
 | 
			
		||||
 - demos/array/README.md
 | 
			
		||||
WebGL
 | 
			
		||||
WebAssembly
 | 
			
		||||
dataset
 | 
			
		||||
TensorFlow
 | 
			
		||||
 | 
			
		||||
 - demos/database/README.md
 | 
			
		||||
Knex
 | 
			
		||||
LowDB
 | 
			
		||||
 | 
			
		||||
@ -198,6 +198,7 @@ The [`demos` directory](demos/) includes sample projects for:
 | 
			
		||||
- [`XMLHttpRequest and fetch`](demos/xhr/)
 | 
			
		||||
- [`nodejs server`](demos/server/)
 | 
			
		||||
- [`databases and key/value stores`](demos/database/)
 | 
			
		||||
- [`typed arrays and math`](demos/array/)
 | 
			
		||||
 | 
			
		||||
**Bundlers and Tooling**
 | 
			
		||||
- [`browserify`](demos/browserify/)
 | 
			
		||||
@ -2045,9 +2046,10 @@ Both functions accept options arguments:
 | 
			
		||||
 | 
			
		||||
| Option Name |  Default | Description                                         |
 | 
			
		||||
| :---------- | :------: | :-------------------------------------------------- |
 | 
			
		||||
|`raw`        |          | If true, every cell will hold raw strings           |
 | 
			
		||||
|`dateNF`     |  FMT 14  | Use specified date format in string output          |
 | 
			
		||||
|`cellDates`  |  false   | Store dates as type `d` (default is `n`)            |
 | 
			
		||||
|`raw`        |          | If true, every cell will hold raw strings           |
 | 
			
		||||
|`sheetRows`  |    0     | If >0, read the first `sheetRows` rows of the table |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<details>
 | 
			
		||||
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
XLSX.version = '0.12.7';
 | 
			
		||||
XLSX.version = '0.12.8';
 | 
			
		||||
 | 
			
		||||
@ -180,6 +180,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 | 
			
		||||
	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -206,7 +207,8 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 | 
			
		||||
	for(i = 0; i < headers.length; ++i) {
 | 
			
		||||
		if(i == null) continue;
 | 
			
		||||
		++hcnt;
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name");
 | 
			
		||||
		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
 | 
			
		||||
		if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)
 | 
			
		||||
			if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; }
 | 
			
		||||
	}
 | 
			
		||||
@ -394,6 +396,7 @@ var SYLK = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		if(rowinfo.length > 0) sht['!rows'] = rowinfo;
 | 
			
		||||
		if(colinfo.length > 0) sht['!cols'] = colinfo;
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return [arr, sht];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -484,7 +487,7 @@ var DIF = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		throw new Error("Unrecognized type " + opts.type);
 | 
			
		||||
	}
 | 
			
		||||
	function dif_to_aoa_str(str/*:string*//*::, opts*/)/*:AOA*/ {
 | 
			
		||||
	function dif_to_aoa_str(str/*:string*/, opts)/*:AOA*/ {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
 | 
			
		||||
@ -512,6 +515,7 @@ var DIF = (function() {
 | 
			
		||||
			}
 | 
			
		||||
			if (data === 'EOD') break;
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -585,7 +589,7 @@ var ETH = (function() {
 | 
			
		||||
	function decode(s/*:string*/)/*:string*/ { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
 | 
			
		||||
	function encode(s/*:string*/)/*:string*/ { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
 | 
			
		||||
 | 
			
		||||
	function eth_to_aoa(str/*:string*//*::, opts*/)/*:AOA*/ {
 | 
			
		||||
	function eth_to_aoa(str/*:string*/, opts)/*:AOA*/ {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			var record = records[ri].trim().split(":");
 | 
			
		||||
@ -606,6 +610,7 @@ var ETH = (function() {
 | 
			
		||||
					if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -713,6 +718,7 @@ var PRN = (function() {
 | 
			
		||||
			for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)
 | 
			
		||||
				set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);
 | 
			
		||||
		}
 | 
			
		||||
		if(o.sheetRows) arr = arr.slice(0, o.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -799,11 +805,11 @@ var PRN = (function() {
 | 
			
		||||
			start = end+1;
 | 
			
		||||
			if(range.e.c < C) range.e.c = C;
 | 
			
		||||
			if(range.e.r < R) range.e.r = R;
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; }
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }
 | 
			
		||||
		}
 | 
			
		||||
		for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
		outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
			case 0x22: instr = !instr; break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr) finish_cell(); break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;
 | 
			
		||||
			default: break;
 | 
			
		||||
		}
 | 
			
		||||
		if(end - start > 0) finish_cell();
 | 
			
		||||
 | 
			
		||||
@ -24,7 +24,7 @@ var WK_ = (function() {
 | 
			
		||||
		throw "Unsupported type " + opts.type;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function lotus_to_workbook_buf(d,opts)/*:Workbook*/ {
 | 
			
		||||
	function lotus_to_workbook_buf(d, opts)/*:Workbook*/ {
 | 
			
		||||
		if(!d) return d;
 | 
			
		||||
		var o = opts || {};
 | 
			
		||||
		if(DENSE != null && o.dense == null) o.dense = DENSE;
 | 
			
		||||
@ -32,6 +32,7 @@ var WK_ = (function() {
 | 
			
		||||
		var sheets = {}, snames = [n];
 | 
			
		||||
 | 
			
		||||
		var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
 | 
			
		||||
		var sheetRows = o.sheetRows || 0;
 | 
			
		||||
 | 
			
		||||
		if(d[2] == 0x02) o.Enum = WK1Enum;
 | 
			
		||||
		else if(d[2] == 0x1a) o.Enum = WK3Enum;
 | 
			
		||||
@ -79,6 +80,7 @@ var WK_ = (function() {
 | 
			
		||||
						sidx = val[3]; n = "Sheet" + (sidx + 1);
 | 
			
		||||
						snames.push(n);
 | 
			
		||||
					}
 | 
			
		||||
					if(sheetRows > 0 && val[0].r >= sheetRows) break;
 | 
			
		||||
					if(o.dense) {
 | 
			
		||||
						if(!s[val[0].r]) s[val[0].r] = [];
 | 
			
		||||
						s[val[0].r][val[0].c] = val[1];
 | 
			
		||||
 | 
			
		||||
@ -75,7 +75,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro
 | 
			
		||||
	if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
 | 
			
		||||
	if(opts.sheetRows > 0 && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
 | 
			
		||||
@ -645,7 +645,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
 | 
			
		||||
	if(!s["!ref"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s["!ref"] = encode_range(ref || refguess);
 | 
			
		||||
	if(opts.sheetRows && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
 | 
			
		||||
@ -276,7 +276,14 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
 | 
			
		||||
			if(Rn[1]==='/'){
 | 
			
		||||
				if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
 | 
			
		||||
				sheetnames.push(sheetname);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
 | 
			
		||||
					cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					if(opts.sheetRows && opts.sheetRows <= refguess.e.r) {
 | 
			
		||||
						cursheet["!fullref"] = cursheet["!ref"];
 | 
			
		||||
						refguess.e.r = opts.sheetRows - 1;
 | 
			
		||||
						cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if(merges.length) cursheet["!merges"] = merges;
 | 
			
		||||
				if(cstys.length > 0) cursheet["!cols"] = cstys;
 | 
			
		||||
				if(rowinfo.length > 0) cursheet["!rows"] = rowinfo;
 | 
			
		||||
 | 
			
		||||
@ -129,6 +129,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	};
 | 
			
		||||
	var addcell = function addcell(cell/*:any*/, line/*:any*/, options/*:any*/) {
 | 
			
		||||
		if(file_depth > 1) return;
 | 
			
		||||
		if(options.sheetRows && cell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		if(!cell_valid) return;
 | 
			
		||||
		if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
 | 
			
		||||
		delete line.ixfe; delete line.XF;
 | 
			
		||||
@ -152,8 +153,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		else {
 | 
			
		||||
		{
 | 
			
		||||
			if(options.dense) {
 | 
			
		||||
				if(!out[cell.r]) out[cell.r] = [];
 | 
			
		||||
				out[cell.r][cell.c] = line;
 | 
			
		||||
@ -319,6 +319,13 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
						if(range.e.r > 0 && range.e.c > 0) {
 | 
			
		||||
							range.e.r--; range.e.c--;
 | 
			
		||||
							out["!ref"] = encode_range(range);
 | 
			
		||||
							if(options.sheetRows && options.sheetRows <= range.e.r) {
 | 
			
		||||
								var tmpri = range.e.r;
 | 
			
		||||
								range.e.r = options.sheetRows - 1;
 | 
			
		||||
								out["!fullref"] = out["!ref"];
 | 
			
		||||
								out["!ref"] = encode_range(range);
 | 
			
		||||
								range.e.r = tmpri;
 | 
			
		||||
							}
 | 
			
		||||
							range.e.r++; range.e.c++;
 | 
			
		||||
						}
 | 
			
		||||
						if(merges.length > 0) out["!merges"] = merges;
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ var HTML_ = (function() {
 | 
			
		||||
		for(i = 0; i < rows.length; ++i) {
 | 
			
		||||
			var row = rows[i].trim();
 | 
			
		||||
			var hd = row.slice(0,3).toLowerCase();
 | 
			
		||||
			if(hd == "<tr") { ++R; C = 0; continue; }
 | 
			
		||||
			if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
 | 
			
		||||
			if(hd != "<td") continue;
 | 
			
		||||
			var cells = row.split(/<\/td>/i);
 | 
			
		||||
			for(j = 0; j < cells.length; ++j) {
 | 
			
		||||
@ -119,10 +119,11 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
 | 
			
		||||
	if(DENSE != null) opts.dense = DENSE;
 | 
			
		||||
	var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/);
 | 
			
		||||
	var rows/*:HTMLCollection<HTMLTableRowElement>*/ = table.getElementsByTagName('tr');
 | 
			
		||||
	var range/*:Range*/ = {s:{r:0,c:0},e:{r:rows.length - 1,c:0}};
 | 
			
		||||
	var sheetRows = Math.min(opts.sheetRows||10000000, rows.length);
 | 
			
		||||
	var range/*:Range*/ = {s:{r:0,c:0},e:{r:sheetRows - 1,c:0}};
 | 
			
		||||
	var merges/*:Array<Range>*/ = [], midx = 0;
 | 
			
		||||
	var R = 0, _C = 0, C = 0, RS = 0, CS = 0;
 | 
			
		||||
	for(; R < rows.length; ++R) {
 | 
			
		||||
	for(; R < sheetRows; ++R) {
 | 
			
		||||
		var row/*:HTMLTableRowElement*/ = rows[R];
 | 
			
		||||
		var elts/*:HTMLCollection<HTMLTableCellElement>*/ = (row.children/*:any*/);
 | 
			
		||||
		for(_C = C = 0; _C < elts.length; ++_C) {
 | 
			
		||||
@ -156,6 +157,7 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
 | 
			
		||||
	}
 | 
			
		||||
	ws['!merges'] = merges;
 | 
			
		||||
	ws['!ref'] = encode_range(range);
 | 
			
		||||
	if(sheetRows < rows.length) ws['!fullref'] = encode_range((range.e.r = rows.length-1,range));
 | 
			
		||||
	return ws;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -62,6 +62,11 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'table': case '工作表': // 9.1.2 <table:table>
 | 
			
		||||
				if(Rn[1]==='/') {
 | 
			
		||||
					if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);
 | 
			
		||||
					if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
 | 
			
		||||
						ws['!fullref'] = ws['!ref'];
 | 
			
		||||
						range.e.r = opts.sheetRows - 1;
 | 
			
		||||
						ws['!ref'] = encode_range(range);
 | 
			
		||||
					}
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
@ -178,7 +183,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(comments.length > 0) { q.c = comments; comments = []; }
 | 
			
		||||
					if(textp && opts.cellText !== false) q.w = textp;
 | 
			
		||||
					if(!isstub || opts.sheetStubs) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows < R)) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows <= R)) {
 | 
			
		||||
							for(var rpt = 0; rpt < rowpeat; ++rpt) {
 | 
			
		||||
								colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
								if(opts.dense) {
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@ can be installed with Bash on Windows or with `cygwin`.
 | 
			
		||||
- [`XMLHttpRequest and fetch`](xhr/)
 | 
			
		||||
- [`nodejs server`](server/)
 | 
			
		||||
- [`databases and key/value stores`](database/)
 | 
			
		||||
- [`typed arrays and math`](array/)
 | 
			
		||||
 | 
			
		||||
**Bundlers and Tooling**
 | 
			
		||||
- [`browserify`](browserify/)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										8
									
								
								demos/array/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										8
									
								
								demos/array/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,8 @@
 | 
			
		||||
.PHONY: tfjs
 | 
			
		||||
tfjs:
 | 
			
		||||
	npm install @tensorflow/tfjs
 | 
			
		||||
	node tf.js
 | 
			
		||||
 | 
			
		||||
.PHONY: propel
 | 
			
		||||
propel:
 | 
			
		||||
	node propel.js
 | 
			
		||||
							
								
								
									
										155
									
								
								demos/array/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										155
									
								
								demos/array/README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,155 @@
 | 
			
		||||
# Typed Arrays and Math
 | 
			
		||||
 | 
			
		||||
ECMAScript version 6 introduced Typed Arrays, array-like objects designed for
 | 
			
		||||
low-level optimizations and predictable operations.  They are supported in most
 | 
			
		||||
modern browsers and form the basis of various APIs, including NodeJS Buffers,
 | 
			
		||||
WebGL buffers, WebAssembly, and tensors in linear algebra and math libraries.
 | 
			
		||||
 | 
			
		||||
This demo covers conversions between worksheets and Typed Arrays.  It also tries
 | 
			
		||||
to cover common numerical libraries that work with data arrays.
 | 
			
		||||
 | 
			
		||||
Excel supports a subset of the IEEE754 Double precision floating point numbers,
 | 
			
		||||
but many libraries only support `Float32` Single precision values. `Math.fround`
 | 
			
		||||
rounds `Number` values to the nearest single-precision floating point value.
 | 
			
		||||
 | 
			
		||||
## Working with Data in Typed Arrays
 | 
			
		||||
 | 
			
		||||
Typed arrays are not true Array objects.  The array of array utility functions
 | 
			
		||||
like `aoa_to_sheet` will not handle arrays of Typed Arrays.
 | 
			
		||||
 | 
			
		||||
#### Exporting Typed Arrays to a Worksheet
 | 
			
		||||
 | 
			
		||||
A single typed array can be converted to a pure JS array with `Array.from`:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var column = Array.from(dataset_typedarray);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
`aoa_to_sheet` expects a row-major array of arrays.  To export multiple data
 | 
			
		||||
sets, "transpose" the data:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* assuming data is an array of typed arrays */
 | 
			
		||||
var aoa = [];
 | 
			
		||||
for(var i = 0; i < data.length; ++i) {
 | 
			
		||||
  for(var j = 0; j < data[i].length; ++j) {
 | 
			
		||||
    if(!aoa[j]) aoa[j] = [];
 | 
			
		||||
    aoa[j][i] = data[i][j];
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
/* aoa can be directly converted to a worksheet object */
 | 
			
		||||
var ws = XLSX.utils.aoa_to_sheet(aoa);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Importing Data from a Spreadsheet
 | 
			
		||||
 | 
			
		||||
`sheet_to_json` with the option `header:1` will generate a row-major array of
 | 
			
		||||
arrays that can be transposed.  However, it is more efficient to walk the sheet
 | 
			
		||||
manually:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* find worksheet range */
 | 
			
		||||
var range = XLSX.utils.decode_range(ws['!ref']);
 | 
			
		||||
var out = []
 | 
			
		||||
/* walk the columns */
 | 
			
		||||
for(var C = range.s.c; C <= range.e.c; ++C) {
 | 
			
		||||
  /* create the typed array */
 | 
			
		||||
  var ta = new Float32Array(range.e.r - range.s.r + 1);
 | 
			
		||||
  /* walk the rows */
 | 
			
		||||
  for(var R = range.s.r; R <= range.e.r; ++R) {
 | 
			
		||||
    /* find the cell, skip it if the cell isn't numeric or boolean */
 | 
			
		||||
    var cell = ws[XLSX.utils.encode_cell({r:R, c:C})];
 | 
			
		||||
    if(!cell || cell.t != 'n' && cell.t != 'b') continue;
 | 
			
		||||
    /* assign to the typed array */
 | 
			
		||||
    ta[R - range.s.r] = cell.v;
 | 
			
		||||
  }
 | 
			
		||||
  out.push(ta);
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If the data set has a header row, the loop can be adjusted to skip those rows.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Demos
 | 
			
		||||
 | 
			
		||||
Each example focuses on single-variable linear regression.  Sample worksheets
 | 
			
		||||
will start with a label row.  The first column is the x-value and the second
 | 
			
		||||
column is the y-value.  A sample spreadsheet can be generated randomly:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var aoo = [];
 | 
			
		||||
for(var i = 0; i < 100; ++i) aoo.push({x:i, y:2 * i + Math.random()});
 | 
			
		||||
var ws = XLSX.utils.json_to_sheet(aoo);
 | 
			
		||||
var wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
 | 
			
		||||
XLSX.writeFile(wb, "linreg.xlsx");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Some libraries provide utility functions that work with plain arrays of numbers.
 | 
			
		||||
When possible, they should be preferred over manual conversion.
 | 
			
		||||
 | 
			
		||||
Reshaping raw float arrays and exporting to a worksheet is straightforward:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
function array_to_sheet(farray, shape, headers) {
 | 
			
		||||
  /* generate new AOA from the float array */
 | 
			
		||||
  var aoa = [];
 | 
			
		||||
  for(var j = 0; j < shape[0]; ++j) {
 | 
			
		||||
    aoa[j] = [];
 | 
			
		||||
    for(var i = 0; i < shape[1]; ++i) aoa[j][i] = farray[j * shape[1] + i];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* add headers and generate worksheet */
 | 
			
		||||
  if(headers) aoa.unshift(headers);
 | 
			
		||||
  return XLSX.utils.aoa_to_sheet(aoa);
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Tensor Operations with Propel ML
 | 
			
		||||
 | 
			
		||||
[Propel ML](http://propelml.org/) `tensor` objects can be transposed:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var tensor = pr.tensor(aoa).transpose();
 | 
			
		||||
var col1 = tensor.slice(0, 1);
 | 
			
		||||
var col2 = tensor.slice(1, 1);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
To export to a worksheet, `dataSync` generates a `Float32Array` that can be
 | 
			
		||||
re-shaped in JS:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
/* extract shape and float array */
 | 
			
		||||
var tensor = pr.concat([col1, col2]).transpose();
 | 
			
		||||
var shape = tensor.shape;
 | 
			
		||||
var farray = tensor.dataSync();
 | 
			
		||||
var ws = array_to_sheet(farray, shape, ["header1", "header2"]);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The demo generates a sample dataset and uses Propel to calculate the OLS linear
 | 
			
		||||
regression coefficients.  Afterwards, the tensors are exported to a new file.
 | 
			
		||||
 | 
			
		||||
#### TensorFlow
 | 
			
		||||
 | 
			
		||||
[TensorFlow](https://js.tensorflow.org/) `tensor` objects can be created from
 | 
			
		||||
arrays of arrays:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var tensor = tf.tensor2d(aoa).transpose();
 | 
			
		||||
var col1 = tensor.slice([0,0], [1,tensor.shape[1]]).flatten();
 | 
			
		||||
var col2 = tensor.slice([1,0], [1,tensor.shape[1]]).flatten();
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
`stack` should be used to create the 2-d tensor for export:
 | 
			
		||||
 | 
			
		||||
```js
 | 
			
		||||
var tensor = tf.stack([col1, col2]).transpose();
 | 
			
		||||
var shape = tensor.shape;
 | 
			
		||||
var farray = tensor.dataSync();
 | 
			
		||||
var ws = array_to_sheet(farray, shape, ["header1", "header2"]);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The demo generates a sample dataset and uses a simple linear predictor with
 | 
			
		||||
least-squares scoring to calculate regression coefficients.  The tensors are
 | 
			
		||||
exported to a new file.
 | 
			
		||||
 | 
			
		||||
[](https://github.com/SheetJS/js-xlsx)
 | 
			
		||||
							
								
								
									
										27
									
								
								demos/array/linest.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										27
									
								
								demos/array/linest.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/*global module, require, XLSX:true */
 | 
			
		||||
if(typeof require !== 'undefined' && typeof XLSX === 'undefined') XLSX = require('xlsx');
 | 
			
		||||
 | 
			
		||||
function generate_random_file(n) {
 | 
			
		||||
	if(!n) n = 100;
 | 
			
		||||
	var aoo = [];
 | 
			
		||||
	var x_ = 0, y_ = 0, xx = 0, xy = 0;
 | 
			
		||||
	for(var i = 0; i < n; ++i) {
 | 
			
		||||
		var y = Math.fround(2 * i + Math.random());
 | 
			
		||||
		aoo.push({x:i, y:y});
 | 
			
		||||
		x_ += i / n; y_ += y / n; xx += i*i; xy += i * y;
 | 
			
		||||
	}
 | 
			
		||||
	var m = Math.fround((xy - n * x_ * y_)/(xx - n * x_ * x_));
 | 
			
		||||
	console.log(m, Math.fround(y_ - m * x_), "JS Pre");
 | 
			
		||||
	var ws = XLSX.utils.json_to_sheet(aoo);
 | 
			
		||||
	var wb = XLSX.utils.book_new();
 | 
			
		||||
	XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
 | 
			
		||||
	ws = XLSX.utils.aoa_to_sheet([[2, 0]]);
 | 
			
		||||
	XLSX.utils.sheet_set_array_formula(ws, "A1:B1", "LINEST(Sheet1!B2:B101,Sheet1!A2:A101)");
 | 
			
		||||
	XLSX.utils.book_append_sheet(wb, ws, "Sheet2");
 | 
			
		||||
 | 
			
		||||
	XLSX.writeFile(wb, "linreg.xlsx");
 | 
			
		||||
}
 | 
			
		||||
if(typeof module !== 'undefined') module.exports = {
 | 
			
		||||
	generate_random_file: generate_random_file
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										59
									
								
								demos/array/propel.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										59
									
								
								demos/array/propel.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,59 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* eslint-env node */
 | 
			
		||||
var XLSX = require('xlsx');
 | 
			
		||||
var pr = require('propel');
 | 
			
		||||
var linest = require('./linest');
 | 
			
		||||
 | 
			
		||||
/* generate linreg.xlsx with 100 random points */
 | 
			
		||||
linest.generate_random_file(100);
 | 
			
		||||
 | 
			
		||||
/* get the first worksheet as an array of arrays, skip the first row */
 | 
			
		||||
var wb = XLSX.readFile('linreg.xlsx');
 | 
			
		||||
var ws = wb.Sheets[wb.SheetNames[0]];
 | 
			
		||||
var aoa = XLSX.utils.sheet_to_json(ws, {header:1, raw:true}).slice(1);
 | 
			
		||||
 | 
			
		||||
/* calculate the coefficients in JS */
 | 
			
		||||
(function(aoa) {
 | 
			
		||||
	var x_ = 0, y_ = 0, xx = 0, xy = 0, n = aoa.length;
 | 
			
		||||
	for(var i = 0; i < n; ++i) {
 | 
			
		||||
		x_ += aoa[i][0] / n;
 | 
			
		||||
		y_ += aoa[i][1] / n;
 | 
			
		||||
		xx += aoa[i][0] * aoa[i][0];
 | 
			
		||||
		xy += aoa[i][0] * aoa[i][1];
 | 
			
		||||
	}
 | 
			
		||||
	var m = Math.fround((xy - n * x_ * y_)/(xx - n * x_ * x_));
 | 
			
		||||
	console.log(m, Math.fround(y_ - m * x_), "JS Post");
 | 
			
		||||
})(aoa);
 | 
			
		||||
 | 
			
		||||
/* build X and Y vectors */
 | 
			
		||||
var tensor = pr.tensor(aoa).transpose();
 | 
			
		||||
var xs = tensor.slice(0, 1);
 | 
			
		||||
var ys = tensor.slice(1, 1);
 | 
			
		||||
 | 
			
		||||
/* compute the coefficient */
 | 
			
		||||
var n = xs.size;
 | 
			
		||||
var x_ = Math.fround(xs.reduceMean().dataSync()[0]);
 | 
			
		||||
var y_ = Math.fround(ys.reduceMean().dataSync()[0]);
 | 
			
		||||
var xx = Math.fround(xs.dot(xs.transpose()).dataSync()[0]);
 | 
			
		||||
var xy = Math.fround(xs.dot(ys.transpose()).dataSync()[0]);
 | 
			
		||||
var m = Math.fround((xy - n * x_ * y_)/(xx - n * x_ * x_));
 | 
			
		||||
var b_ = Math.fround(y_ - m * x_);
 | 
			
		||||
console.log(m, b_, "Propel");
 | 
			
		||||
var yh = xs.mul(m).add(b_);
 | 
			
		||||
 | 
			
		||||
/* export data to aoa */
 | 
			
		||||
var prdata = pr.concat([xs, ys, yh]).transpose();
 | 
			
		||||
var shape = prdata.shape;
 | 
			
		||||
var prarr = prdata.dataSync();
 | 
			
		||||
var praoa = [];
 | 
			
		||||
for(var j = 0; j < shape[0]; ++j) {
 | 
			
		||||
	praoa[j] = [];
 | 
			
		||||
	for(var i = 0; i < shape[1]; ++i) praoa[j][i] = prarr[j * shape[1] + i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* add headers and export */
 | 
			
		||||
praoa.unshift(["x", "y", "pred"]);
 | 
			
		||||
var new_ws = XLSX.utils.aoa_to_sheet(praoa);
 | 
			
		||||
var new_wb = XLSX.utils.book_new();
 | 
			
		||||
XLSX.utils.book_append_sheet(new_wb, new_ws, "Sheet1");
 | 
			
		||||
XLSX.writeFile(new_wb, "propel.xls");
 | 
			
		||||
							
								
								
									
										78
									
								
								demos/array/tf.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										78
									
								
								demos/array/tf.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,78 @@
 | 
			
		||||
/* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
 | 
			
		||||
/* eslint-env node */
 | 
			
		||||
var XLSX = require('xlsx');
 | 
			
		||||
var tf = require('@tensorflow/tfjs');
 | 
			
		||||
var linest = require('./linest');
 | 
			
		||||
 | 
			
		||||
/* generate linreg.xlsx with 100 random points */
 | 
			
		||||
var N = 100;
 | 
			
		||||
linest.generate_random_file(N);
 | 
			
		||||
 | 
			
		||||
/* get the first worksheet as an array of arrays, skip the first row */
 | 
			
		||||
var wb = XLSX.readFile('linreg.xlsx');
 | 
			
		||||
var ws = wb.Sheets[wb.SheetNames[0]];
 | 
			
		||||
var aoa = XLSX.utils.sheet_to_json(ws, {header:1, raw:true}).slice(1);
 | 
			
		||||
 | 
			
		||||
/* calculate the coefficients in JS */
 | 
			
		||||
(function(aoa) {
 | 
			
		||||
	var x_ = 0, y_ = 0, xx = 0, xy = 0, n = aoa.length;
 | 
			
		||||
	for(var i = 0; i < n; ++i) {
 | 
			
		||||
		x_ += aoa[i][0] / n;
 | 
			
		||||
		y_ += aoa[i][1] / n;
 | 
			
		||||
		xx += aoa[i][0] * aoa[i][0];
 | 
			
		||||
		xy += aoa[i][0] * aoa[i][1];
 | 
			
		||||
	}
 | 
			
		||||
	var m = Math.fround((xy - n * x_ * y_)/(xx - n * x_ * x_));
 | 
			
		||||
	console.log(m, Math.fround(y_ - m * x_), "JS Post");
 | 
			
		||||
})(aoa);
 | 
			
		||||
 | 
			
		||||
/* build X and Y vectors */
 | 
			
		||||
var tensor = tf.tensor2d(aoa).transpose();
 | 
			
		||||
console.log(tensor.shape);
 | 
			
		||||
var xs = tensor.slice([0,0], [1,tensor.shape[1]]).flatten();
 | 
			
		||||
var ys = tensor.slice([1,0], [1,tensor.shape[1]]).flatten();
 | 
			
		||||
 | 
			
		||||
/* set up variables with initial guess */
 | 
			
		||||
var x_ = xs.mean().dataSync()[0];
 | 
			
		||||
var y_ = ys.mean().dataSync()[0];
 | 
			
		||||
var a = tf.variable(tf.scalar(y_/x_));
 | 
			
		||||
var b = tf.variable(tf.scalar(Math.random()));
 | 
			
		||||
 | 
			
		||||
/* linear predictor */
 | 
			
		||||
function predict(x) { return tf.tidy(function() { return a.mul(x).add(b); }); }
 | 
			
		||||
/* mean square scoring */
 | 
			
		||||
function loss(yh, y) { return yh.sub(y).square().mean(); }
 | 
			
		||||
 | 
			
		||||
/* train */
 | 
			
		||||
for(var j = 0; j < 5; ++j) {
 | 
			
		||||
	var learning_rate = 0.0001 /(j+1), iterations = 1000;
 | 
			
		||||
	var optimizer = tf.train.sgd(learning_rate);
 | 
			
		||||
 | 
			
		||||
	for(var i = 0; i < iterations; ++i) optimizer.minimize(function() {
 | 
			
		||||
		var pred = predict(xs);
 | 
			
		||||
		var L = loss(pred, ys);
 | 
			
		||||
		return L
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/* compute the coefficient */
 | 
			
		||||
	var m = a.dataSync()[0], b_ = b.dataSync()[0];
 | 
			
		||||
	console.log(m, b_, "TF " + iterations * (j+1));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* export data to aoa */
 | 
			
		||||
var yh = predict(xs);
 | 
			
		||||
var tfdata = tf.stack([xs, ys, yh]).transpose();
 | 
			
		||||
var shape = tfdata.shape;
 | 
			
		||||
var tfarr = tfdata.dataSync();
 | 
			
		||||
var tfaoa = [];
 | 
			
		||||
for(j = 0; j < shape[0]; ++j) {
 | 
			
		||||
	tfaoa[j] = [];
 | 
			
		||||
	for(i = 0; i < shape[1]; ++i) tfaoa[j][i] = tfarr[j * shape[1] + i];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* add headers and export */
 | 
			
		||||
tfaoa.unshift(["x", "y", "pred"]);
 | 
			
		||||
var new_ws = XLSX.utils.aoa_to_sheet(tfaoa);
 | 
			
		||||
var new_wb = XLSX.utils.book_new();
 | 
			
		||||
XLSX.utils.book_append_sheet(new_wb, new_ws, "Sheet1");
 | 
			
		||||
XLSX.writeFile(new_wb, "tfjs.xls");
 | 
			
		||||
@ -28,4 +28,4 @@ document.getElementById('sjsdownload').addEventListener('click', function() {
 | 
			
		||||
    XLSX.utils.book_append_sheet(wb, ws, 'Bookmarks');
 | 
			
		||||
    XLSX.writeFile(wb, "bookmarks.xlsx");
 | 
			
		||||
  });
 | 
			
		||||
});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -38,6 +38,6 @@ chrome.runtime.onInstalled.addListener(function() {
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
function sjsexport_cb(wb) {
 | 
			
		||||
	if(!wb || !wb.SheetNames || !wb.Sheets) { console.log(wb); return alert("Error in exporting table"); }
 | 
			
		||||
	if(!wb || !wb.SheetNames || !wb.Sheets) { return alert("Error in exporting table"); }
 | 
			
		||||
	XLSX.writeFile(wb, "export.xlsx");
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										30
									
								
								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
											
										
									
								
							
							
								
								
									
										63
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										63
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -9141,7 +9141,7 @@ module.exports = ZStream;
 | 
			
		||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
(function make_xlsx(XLSX){
 | 
			
		||||
XLSX.version = '0.12.7';
 | 
			
		||||
XLSX.version = '0.12.8';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -15055,6 +15055,7 @@ var fields = [], field = ({});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 | 
			
		||||
	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -15081,7 +15082,8 @@ function sheet_to_dbf(ws, opts) {
 | 
			
		||||
	for(i = 0; i < headers.length; ++i) {
 | 
			
		||||
		if(i == null) continue;
 | 
			
		||||
		++hcnt;
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name");
 | 
			
		||||
		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
 | 
			
		||||
		if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)
 | 
			
		||||
			if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; }
 | 
			
		||||
	}
 | 
			
		||||
@ -15269,6 +15271,7 @@ var SYLK = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		if(rowinfo.length > 0) sht['!rows'] = rowinfo;
 | 
			
		||||
		if(colinfo.length > 0) sht['!cols'] = colinfo;
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return [arr, sht];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -15359,7 +15362,7 @@ var DIF = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		throw new Error("Unrecognized type " + opts.type);
 | 
			
		||||
	}
 | 
			
		||||
	function dif_to_aoa_str(str) {
 | 
			
		||||
	function dif_to_aoa_str(str, opts) {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
 | 
			
		||||
@ -15387,6 +15390,7 @@ var DIF = (function() {
 | 
			
		||||
			}
 | 
			
		||||
			if (data === 'EOD') break;
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -15460,7 +15464,7 @@ var ETH = (function() {
 | 
			
		||||
	function decode(s) { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
 | 
			
		||||
	function encode(s) { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
 | 
			
		||||
 | 
			
		||||
	function eth_to_aoa(str) {
 | 
			
		||||
	function eth_to_aoa(str, opts) {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			var record = records[ri].trim().split(":");
 | 
			
		||||
@ -15481,6 +15485,7 @@ var ETH = (function() {
 | 
			
		||||
					if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -15588,6 +15593,7 @@ var PRN = (function() {
 | 
			
		||||
			for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)
 | 
			
		||||
				set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);
 | 
			
		||||
		}
 | 
			
		||||
		if(o.sheetRows) arr = arr.slice(0, o.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -15674,11 +15680,11 @@ var PRN = (function() {
 | 
			
		||||
			start = end+1;
 | 
			
		||||
			if(range.e.c < C) range.e.c = C;
 | 
			
		||||
			if(range.e.r < R) range.e.r = R;
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; }
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }
 | 
			
		||||
		}
 | 
			
		||||
		for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
		outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
			case 0x22: instr = !instr; break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr) finish_cell(); break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;
 | 
			
		||||
			default: break;
 | 
			
		||||
		}
 | 
			
		||||
		if(end - start > 0) finish_cell();
 | 
			
		||||
@ -15777,7 +15783,7 @@ var WK_ = (function() {
 | 
			
		||||
		throw "Unsupported type " + opts.type;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function lotus_to_workbook_buf(d,opts) {
 | 
			
		||||
	function lotus_to_workbook_buf(d, opts) {
 | 
			
		||||
		if(!d) return d;
 | 
			
		||||
		var o = opts || {};
 | 
			
		||||
		if(DENSE != null && o.dense == null) o.dense = DENSE;
 | 
			
		||||
@ -15785,6 +15791,7 @@ var WK_ = (function() {
 | 
			
		||||
		var sheets = {}, snames = [n];
 | 
			
		||||
 | 
			
		||||
		var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
 | 
			
		||||
		var sheetRows = o.sheetRows || 0;
 | 
			
		||||
 | 
			
		||||
		if(d[2] == 0x02) o.Enum = WK1Enum;
 | 
			
		||||
		else if(d[2] == 0x1a) o.Enum = WK3Enum;
 | 
			
		||||
@ -15832,6 +15839,7 @@ var WK_ = (function() {
 | 
			
		||||
						sidx = val[3]; n = "Sheet" + (sidx + 1);
 | 
			
		||||
						snames.push(n);
 | 
			
		||||
					}
 | 
			
		||||
					if(sheetRows > 0 && val[0].r >= sheetRows) break;
 | 
			
		||||
					if(o.dense) {
 | 
			
		||||
						if(!s[val[0].r]) s[val[0].r] = [];
 | 
			
		||||
						s[val[0].r][val[0].c] = val[1];
 | 
			
		||||
@ -21033,7 +21041,7 @@ function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
 | 
			
		||||
	if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
 | 
			
		||||
	if(opts.sheetRows > 0 && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
@ -22181,7 +22189,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
 | 
			
		||||
	if(!s["!ref"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s["!ref"] = encode_range(ref || refguess);
 | 
			
		||||
	if(opts.sheetRows && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
@ -23556,7 +23564,14 @@ for(var cma = c; cma <= cc; ++cma) {
 | 
			
		||||
			if(Rn[1]==='/'){
 | 
			
		||||
				if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
 | 
			
		||||
				sheetnames.push(sheetname);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
 | 
			
		||||
					cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					if(opts.sheetRows && opts.sheetRows <= refguess.e.r) {
 | 
			
		||||
						cursheet["!fullref"] = cursheet["!ref"];
 | 
			
		||||
						refguess.e.r = opts.sheetRows - 1;
 | 
			
		||||
						cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if(merges.length) cursheet["!merges"] = merges;
 | 
			
		||||
				if(cstys.length > 0) cursheet["!cols"] = cstys;
 | 
			
		||||
				if(rowinfo.length > 0) cursheet["!rows"] = rowinfo;
 | 
			
		||||
@ -24555,6 +24570,7 @@ function parse_workbook(blob, options) {
 | 
			
		||||
	};
 | 
			
		||||
	var addcell = function addcell(cell, line, options) {
 | 
			
		||||
		if(file_depth > 1) return;
 | 
			
		||||
		if(options.sheetRows && cell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		if(!cell_valid) return;
 | 
			
		||||
		if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
 | 
			
		||||
		delete line.ixfe; delete line.XF;
 | 
			
		||||
@ -24578,8 +24594,7 @@ function parse_workbook(blob, options) {
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		else {
 | 
			
		||||
		{
 | 
			
		||||
			if(options.dense) {
 | 
			
		||||
				if(!out[cell.r]) out[cell.r] = [];
 | 
			
		||||
				out[cell.r][cell.c] = line;
 | 
			
		||||
@ -24744,6 +24759,13 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
 | 
			
		||||
						if(range.e.r > 0 && range.e.c > 0) {
 | 
			
		||||
							range.e.r--; range.e.c--;
 | 
			
		||||
							out["!ref"] = encode_range(range);
 | 
			
		||||
							if(options.sheetRows && options.sheetRows <= range.e.r) {
 | 
			
		||||
								var tmpri = range.e.r;
 | 
			
		||||
								range.e.r = options.sheetRows - 1;
 | 
			
		||||
								out["!fullref"] = out["!ref"];
 | 
			
		||||
								out["!ref"] = encode_range(range);
 | 
			
		||||
								range.e.r = tmpri;
 | 
			
		||||
							}
 | 
			
		||||
							range.e.r++; range.e.c++;
 | 
			
		||||
						}
 | 
			
		||||
						if(merges.length > 0) out["!merges"] = merges;
 | 
			
		||||
@ -26933,7 +26955,7 @@ var HTML_ = (function() {
 | 
			
		||||
		for(i = 0; i < rows.length; ++i) {
 | 
			
		||||
			var row = rows[i].trim();
 | 
			
		||||
			var hd = row.slice(0,3).toLowerCase();
 | 
			
		||||
			if(hd == "<tr") { ++R; C = 0; continue; }
 | 
			
		||||
			if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
 | 
			
		||||
			if(hd != "<td") continue;
 | 
			
		||||
			var cells = row.split(/<\/td>/i);
 | 
			
		||||
			for(j = 0; j < cells.length; ++j) {
 | 
			
		||||
@ -27037,10 +27059,11 @@ function parse_dom_table(table, _opts) {
 | 
			
		||||
	if(DENSE != null) opts.dense = DENSE;
 | 
			
		||||
	var ws = opts.dense ? ([]) : ({});
 | 
			
		||||
	var rows = table.getElementsByTagName('tr');
 | 
			
		||||
	var range = {s:{r:0,c:0},e:{r:rows.length - 1,c:0}};
 | 
			
		||||
	var sheetRows = Math.min(opts.sheetRows||10000000, rows.length);
 | 
			
		||||
	var range = {s:{r:0,c:0},e:{r:sheetRows - 1,c:0}};
 | 
			
		||||
	var merges = [], midx = 0;
 | 
			
		||||
	var R = 0, _C = 0, C = 0, RS = 0, CS = 0;
 | 
			
		||||
	for(; R < rows.length; ++R) {
 | 
			
		||||
	for(; R < sheetRows; ++R) {
 | 
			
		||||
		var row = rows[R];
 | 
			
		||||
		var elts = (row.children);
 | 
			
		||||
		for(_C = C = 0; _C < elts.length; ++_C) {
 | 
			
		||||
@ -27074,6 +27097,7 @@ function parse_dom_table(table, _opts) {
 | 
			
		||||
	}
 | 
			
		||||
	ws['!merges'] = merges;
 | 
			
		||||
	ws['!ref'] = encode_range(range);
 | 
			
		||||
	if(sheetRows < rows.length) ws['!fullref'] = encode_range((range.e.r = rows.length-1,range));
 | 
			
		||||
	return ws;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -27144,6 +27168,11 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'table': case '工作表': // 9.1.2 <table:table>
 | 
			
		||||
				if(Rn[1]==='/') {
 | 
			
		||||
					if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);
 | 
			
		||||
					if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
 | 
			
		||||
						ws['!fullref'] = ws['!ref'];
 | 
			
		||||
						range.e.r = opts.sheetRows - 1;
 | 
			
		||||
						ws['!ref'] = encode_range(range);
 | 
			
		||||
					}
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
@ -27260,7 +27289,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(comments.length > 0) { q.c = comments; comments = []; }
 | 
			
		||||
					if(textp && opts.cellText !== false) q.w = textp;
 | 
			
		||||
					if(!isstub || opts.sheetStubs) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows < R)) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows <= R)) {
 | 
			
		||||
							for(var rpt = 0; rpt < rowpeat; ++rpt) {
 | 
			
		||||
								colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
								if(opts.dense) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										20
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										20
									
								
								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
											
										
									
								
							
							
								
								
									
										63
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										63
									
								
								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.12.7';
 | 
			
		||||
XLSX.version = '0.12.8';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -5918,6 +5918,7 @@ var fields = [], field = ({});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 | 
			
		||||
	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5944,7 +5945,8 @@ function sheet_to_dbf(ws, opts) {
 | 
			
		||||
	for(i = 0; i < headers.length; ++i) {
 | 
			
		||||
		if(i == null) continue;
 | 
			
		||||
		++hcnt;
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name");
 | 
			
		||||
		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
 | 
			
		||||
		if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)
 | 
			
		||||
			if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; }
 | 
			
		||||
	}
 | 
			
		||||
@ -6132,6 +6134,7 @@ var SYLK = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		if(rowinfo.length > 0) sht['!rows'] = rowinfo;
 | 
			
		||||
		if(colinfo.length > 0) sht['!cols'] = colinfo;
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return [arr, sht];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6222,7 +6225,7 @@ var DIF = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		throw new Error("Unrecognized type " + opts.type);
 | 
			
		||||
	}
 | 
			
		||||
	function dif_to_aoa_str(str) {
 | 
			
		||||
	function dif_to_aoa_str(str, opts) {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
 | 
			
		||||
@ -6250,6 +6253,7 @@ var DIF = (function() {
 | 
			
		||||
			}
 | 
			
		||||
			if (data === 'EOD') break;
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6323,7 +6327,7 @@ var ETH = (function() {
 | 
			
		||||
	function decode(s) { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
 | 
			
		||||
	function encode(s) { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
 | 
			
		||||
 | 
			
		||||
	function eth_to_aoa(str) {
 | 
			
		||||
	function eth_to_aoa(str, opts) {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			var record = records[ri].trim().split(":");
 | 
			
		||||
@ -6344,6 +6348,7 @@ var ETH = (function() {
 | 
			
		||||
					if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6451,6 +6456,7 @@ var PRN = (function() {
 | 
			
		||||
			for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)
 | 
			
		||||
				set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);
 | 
			
		||||
		}
 | 
			
		||||
		if(o.sheetRows) arr = arr.slice(0, o.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6537,11 +6543,11 @@ var PRN = (function() {
 | 
			
		||||
			start = end+1;
 | 
			
		||||
			if(range.e.c < C) range.e.c = C;
 | 
			
		||||
			if(range.e.r < R) range.e.r = R;
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; }
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }
 | 
			
		||||
		}
 | 
			
		||||
		for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
		outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
			case 0x22: instr = !instr; break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr) finish_cell(); break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;
 | 
			
		||||
			default: break;
 | 
			
		||||
		}
 | 
			
		||||
		if(end - start > 0) finish_cell();
 | 
			
		||||
@ -6640,7 +6646,7 @@ var WK_ = (function() {
 | 
			
		||||
		throw "Unsupported type " + opts.type;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function lotus_to_workbook_buf(d,opts) {
 | 
			
		||||
	function lotus_to_workbook_buf(d, opts) {
 | 
			
		||||
		if(!d) return d;
 | 
			
		||||
		var o = opts || {};
 | 
			
		||||
		if(DENSE != null && o.dense == null) o.dense = DENSE;
 | 
			
		||||
@ -6648,6 +6654,7 @@ var WK_ = (function() {
 | 
			
		||||
		var sheets = {}, snames = [n];
 | 
			
		||||
 | 
			
		||||
		var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
 | 
			
		||||
		var sheetRows = o.sheetRows || 0;
 | 
			
		||||
 | 
			
		||||
		if(d[2] == 0x02) o.Enum = WK1Enum;
 | 
			
		||||
		else if(d[2] == 0x1a) o.Enum = WK3Enum;
 | 
			
		||||
@ -6695,6 +6702,7 @@ var WK_ = (function() {
 | 
			
		||||
						sidx = val[3]; n = "Sheet" + (sidx + 1);
 | 
			
		||||
						snames.push(n);
 | 
			
		||||
					}
 | 
			
		||||
					if(sheetRows > 0 && val[0].r >= sheetRows) break;
 | 
			
		||||
					if(o.dense) {
 | 
			
		||||
						if(!s[val[0].r]) s[val[0].r] = [];
 | 
			
		||||
						s[val[0].r][val[0].c] = val[1];
 | 
			
		||||
@ -11896,7 +11904,7 @@ function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
 | 
			
		||||
	if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
 | 
			
		||||
	if(opts.sheetRows > 0 && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
@ -13044,7 +13052,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
 | 
			
		||||
	if(!s["!ref"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s["!ref"] = encode_range(ref || refguess);
 | 
			
		||||
	if(opts.sheetRows && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
@ -14419,7 +14427,14 @@ for(var cma = c; cma <= cc; ++cma) {
 | 
			
		||||
			if(Rn[1]==='/'){
 | 
			
		||||
				if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
 | 
			
		||||
				sheetnames.push(sheetname);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
 | 
			
		||||
					cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					if(opts.sheetRows && opts.sheetRows <= refguess.e.r) {
 | 
			
		||||
						cursheet["!fullref"] = cursheet["!ref"];
 | 
			
		||||
						refguess.e.r = opts.sheetRows - 1;
 | 
			
		||||
						cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if(merges.length) cursheet["!merges"] = merges;
 | 
			
		||||
				if(cstys.length > 0) cursheet["!cols"] = cstys;
 | 
			
		||||
				if(rowinfo.length > 0) cursheet["!rows"] = rowinfo;
 | 
			
		||||
@ -15418,6 +15433,7 @@ function parse_workbook(blob, options) {
 | 
			
		||||
	};
 | 
			
		||||
	var addcell = function addcell(cell, line, options) {
 | 
			
		||||
		if(file_depth > 1) return;
 | 
			
		||||
		if(options.sheetRows && cell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		if(!cell_valid) return;
 | 
			
		||||
		if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
 | 
			
		||||
		delete line.ixfe; delete line.XF;
 | 
			
		||||
@ -15441,8 +15457,7 @@ function parse_workbook(blob, options) {
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		else {
 | 
			
		||||
		{
 | 
			
		||||
			if(options.dense) {
 | 
			
		||||
				if(!out[cell.r]) out[cell.r] = [];
 | 
			
		||||
				out[cell.r][cell.c] = line;
 | 
			
		||||
@ -15607,6 +15622,13 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
 | 
			
		||||
						if(range.e.r > 0 && range.e.c > 0) {
 | 
			
		||||
							range.e.r--; range.e.c--;
 | 
			
		||||
							out["!ref"] = encode_range(range);
 | 
			
		||||
							if(options.sheetRows && options.sheetRows <= range.e.r) {
 | 
			
		||||
								var tmpri = range.e.r;
 | 
			
		||||
								range.e.r = options.sheetRows - 1;
 | 
			
		||||
								out["!fullref"] = out["!ref"];
 | 
			
		||||
								out["!ref"] = encode_range(range);
 | 
			
		||||
								range.e.r = tmpri;
 | 
			
		||||
							}
 | 
			
		||||
							range.e.r++; range.e.c++;
 | 
			
		||||
						}
 | 
			
		||||
						if(merges.length > 0) out["!merges"] = merges;
 | 
			
		||||
@ -17796,7 +17818,7 @@ var HTML_ = (function() {
 | 
			
		||||
		for(i = 0; i < rows.length; ++i) {
 | 
			
		||||
			var row = rows[i].trim();
 | 
			
		||||
			var hd = row.slice(0,3).toLowerCase();
 | 
			
		||||
			if(hd == "<tr") { ++R; C = 0; continue; }
 | 
			
		||||
			if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
 | 
			
		||||
			if(hd != "<td") continue;
 | 
			
		||||
			var cells = row.split(/<\/td>/i);
 | 
			
		||||
			for(j = 0; j < cells.length; ++j) {
 | 
			
		||||
@ -17900,10 +17922,11 @@ function parse_dom_table(table, _opts) {
 | 
			
		||||
	if(DENSE != null) opts.dense = DENSE;
 | 
			
		||||
	var ws = opts.dense ? ([]) : ({});
 | 
			
		||||
	var rows = table.getElementsByTagName('tr');
 | 
			
		||||
	var range = {s:{r:0,c:0},e:{r:rows.length - 1,c:0}};
 | 
			
		||||
	var sheetRows = Math.min(opts.sheetRows||10000000, rows.length);
 | 
			
		||||
	var range = {s:{r:0,c:0},e:{r:sheetRows - 1,c:0}};
 | 
			
		||||
	var merges = [], midx = 0;
 | 
			
		||||
	var R = 0, _C = 0, C = 0, RS = 0, CS = 0;
 | 
			
		||||
	for(; R < rows.length; ++R) {
 | 
			
		||||
	for(; R < sheetRows; ++R) {
 | 
			
		||||
		var row = rows[R];
 | 
			
		||||
		var elts = (row.children);
 | 
			
		||||
		for(_C = C = 0; _C < elts.length; ++_C) {
 | 
			
		||||
@ -17937,6 +17960,7 @@ function parse_dom_table(table, _opts) {
 | 
			
		||||
	}
 | 
			
		||||
	ws['!merges'] = merges;
 | 
			
		||||
	ws['!ref'] = encode_range(range);
 | 
			
		||||
	if(sheetRows < rows.length) ws['!fullref'] = encode_range((range.e.r = rows.length-1,range));
 | 
			
		||||
	return ws;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18007,6 +18031,11 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'table': case '工作表': // 9.1.2 <table:table>
 | 
			
		||||
				if(Rn[1]==='/') {
 | 
			
		||||
					if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);
 | 
			
		||||
					if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
 | 
			
		||||
						ws['!fullref'] = ws['!ref'];
 | 
			
		||||
						range.e.r = opts.sheetRows - 1;
 | 
			
		||||
						ws['!ref'] = encode_range(range);
 | 
			
		||||
					}
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
@ -18123,7 +18152,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(comments.length > 0) { q.c = comments; comments = []; }
 | 
			
		||||
					if(textp && opts.cellText !== false) q.w = textp;
 | 
			
		||||
					if(!isstub || opts.sheetStubs) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows < R)) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows <= R)) {
 | 
			
		||||
							for(var rpt = 0; rpt < rowpeat; ++rpt) {
 | 
			
		||||
								colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
								if(opts.dense) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										21
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										21
									
								
								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
											
										
									
								
							@ -11,6 +11,7 @@ The [`demos` directory](demos/) includes sample projects for:
 | 
			
		||||
- [`XMLHttpRequest and fetch`](demos/xhr/)
 | 
			
		||||
- [`nodejs server`](demos/server/)
 | 
			
		||||
- [`databases and key/value stores`](demos/database/)
 | 
			
		||||
- [`typed arrays and math`](demos/array/)
 | 
			
		||||
 | 
			
		||||
**Bundlers and Tooling**
 | 
			
		||||
- [`browserify`](demos/browserify/)
 | 
			
		||||
 | 
			
		||||
@ -212,9 +212,10 @@ Both functions accept options arguments:
 | 
			
		||||
 | 
			
		||||
| Option Name |  Default | Description                                         |
 | 
			
		||||
| :---------- | :------: | :-------------------------------------------------- |
 | 
			
		||||
|`raw`        |          | If true, every cell will hold raw strings           |
 | 
			
		||||
|`dateNF`     |  FMT 14  | Use specified date format in string output          |
 | 
			
		||||
|`cellDates`  |  false   | Store dates as type `d` (default is `n`)            |
 | 
			
		||||
|`raw`        |          | If true, every cell will hold raw strings           |
 | 
			
		||||
|`sheetRows`  |    0     | If >0, read the first `sheetRows` rows of the table |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<details>
 | 
			
		||||
 | 
			
		||||
@ -189,6 +189,7 @@ The [`demos` directory](demos/) includes sample projects for:
 | 
			
		||||
- [`XMLHttpRequest and fetch`](demos/xhr/)
 | 
			
		||||
- [`nodejs server`](demos/server/)
 | 
			
		||||
- [`databases and key/value stores`](demos/database/)
 | 
			
		||||
- [`typed arrays and math`](demos/array/)
 | 
			
		||||
 | 
			
		||||
**Bundlers and Tooling**
 | 
			
		||||
- [`browserify`](demos/browserify/)
 | 
			
		||||
@ -1886,9 +1887,10 @@ Both functions accept options arguments:
 | 
			
		||||
 | 
			
		||||
| Option Name |  Default | Description                                         |
 | 
			
		||||
| :---------- | :------: | :-------------------------------------------------- |
 | 
			
		||||
|`raw`        |          | If true, every cell will hold raw strings           |
 | 
			
		||||
|`dateNF`     |  FMT 14  | Use specified date format in string output          |
 | 
			
		||||
|`cellDates`  |  false   | Store dates as type `d` (default is `n`)            |
 | 
			
		||||
|`raw`        |          | If true, every cell will hold raw strings           |
 | 
			
		||||
|`sheetRows`  |    0     | If >0, read the first `sheetRows` rows of the table |
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "xlsx",
 | 
			
		||||
	"version": "0.12.7",
 | 
			
		||||
	"version": "0.12.8",
 | 
			
		||||
	"author": "sheetjs",
 | 
			
		||||
	"description": "SheetJS Spreadsheet data parser and writer",
 | 
			
		||||
	"keywords": [
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										54
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										54
									
								
								test.js
									
									
									
									
									
								
							@ -26,7 +26,7 @@ var opts = ({cellNF: true}/*:any*/);
 | 
			
		||||
var TYPE = browser ? "binary" : "buffer";
 | 
			
		||||
opts.type = TYPE;
 | 
			
		||||
var fullex = [".xlsb", /*".xlsm",*/ ".xlsx"/*, ".xlml", ".xls"*/];
 | 
			
		||||
var ofmt = ["xlsb", "xlsm", "xlsx", "ods", "biff2", "biff5", "biff8", "xlml", "sylk", "dif", "dbf", "eth"];
 | 
			
		||||
var ofmt = ["xlsb", "xlsm", "xlsx", "ods", "biff2", "biff5", "biff8", "xlml", "sylk", "dif", "dbf", "eth", "fods", "csv", "txt", "html"];
 | 
			
		||||
var ex = fullex.slice(); ex = ex.concat([".ods", ".xls", ".xml", ".fods"]);
 | 
			
		||||
if(typeof process != 'undefined' && ((process||{}).env)) {
 | 
			
		||||
	opts.WTF = true;
 | 
			
		||||
@ -540,6 +540,45 @@ describe('parse options', function() {
 | 
			
		||||
		it('sheetRows n=10', function() { FSTPaths.forEach(function(p) {
 | 
			
		||||
			checkcells(X.read(fs.readFileSync(p), {type:TYPE, sheetRows:10}), false, false, false, true);
 | 
			
		||||
		}); });
 | 
			
		||||
		it('sheetRows n=1', function() { ofmt.forEach(function(fmt) {
 | 
			
		||||
			var data = [[1,2],[3,4],[5,6]];
 | 
			
		||||
			var ws = X.utils.aoa_to_sheet(data);
 | 
			
		||||
			assert(ws['!ref'] === "A1:B3");
 | 
			
		||||
			var wb = X.utils.book_new();
 | 
			
		||||
			X.utils.book_append_sheet(wb, ws, "Sheet1");
 | 
			
		||||
			var bs = X.write(wb, { bookType: fmt, type: "binary" });
 | 
			
		||||
 | 
			
		||||
			var wb0 = X.read(bs, { type: "binary" });
 | 
			
		||||
			var ws0 = wb0.Sheets.Sheet1;
 | 
			
		||||
			assert.equal(ws0['!ref'], "A1:B3");
 | 
			
		||||
			assert.equal(get_cell(ws0, "A1").v, 1);
 | 
			
		||||
			assert.equal(get_cell(ws0, "B2").v, 4);
 | 
			
		||||
			assert.equal(get_cell(ws0, "A3").v, 5);
 | 
			
		||||
 | 
			
		||||
			var wb1 = X.read(bs, { type: "binary", sheetRows: 1 });
 | 
			
		||||
			var ws1 = wb1.Sheets.Sheet1;
 | 
			
		||||
			assert.equal(ws1['!ref'], "A1:B1");
 | 
			
		||||
			assert.equal(get_cell(ws1, "A1").v, 1);
 | 
			
		||||
			assert(!get_cell(ws1, "B2"));
 | 
			
		||||
			assert(!get_cell(ws1, "A3"));
 | 
			
		||||
			if(ws1['!fullref']) assert.equal(ws1['!fullref'], "A1:B3");
 | 
			
		||||
 | 
			
		||||
			var wb2 = X.read(bs, { type: "binary", sheetRows: 2 });
 | 
			
		||||
			var ws2 = wb2.Sheets.Sheet1;
 | 
			
		||||
			assert.equal(ws2['!ref'], "A1:B2");
 | 
			
		||||
			assert.equal(get_cell(ws2, "A1").v, 1);
 | 
			
		||||
			assert.equal(get_cell(ws2, "B2").v, 4);
 | 
			
		||||
			assert(!get_cell(ws2, "A3"));
 | 
			
		||||
			if(ws2['!fullref']) assert.equal(ws2['!fullref'], "A1:B3");
 | 
			
		||||
 | 
			
		||||
			var wb3 = X.read(bs, { type: "binary", sheetRows: 3 });
 | 
			
		||||
			var ws3 = wb3.Sheets.Sheet1;
 | 
			
		||||
			assert.equal(ws3['!ref'], "A1:B3");
 | 
			
		||||
			assert.equal(get_cell(ws3, "A1").v, 1);
 | 
			
		||||
			assert.equal(get_cell(ws3, "B2").v, 4);
 | 
			
		||||
			assert.equal(get_cell(ws3, "A3").v, 5);
 | 
			
		||||
			if(ws3['!fullref']) assert.equal(ws3['!fullref'], "A1:B3");
 | 
			
		||||
		}); });
 | 
			
		||||
	});
 | 
			
		||||
	describe('book', function() {
 | 
			
		||||
		it('bookSheets should not generate sheets', function() {
 | 
			
		||||
@ -1981,6 +2020,17 @@ describe('HTML', function() {
 | 
			
		||||
		assert.equal(get_cell(ws, "A1").v, "A&B");
 | 
			
		||||
		assert.equal(get_cell(ws, "B1").v, "A·B");
 | 
			
		||||
	});
 | 
			
		||||
	if(domtest) it('should honor sheetRows', function() {
 | 
			
		||||
		var html = X.utils.sheet_to_html(X.utils.aoa_to_sheet([[1,2],[3,4],[5,6]]));
 | 
			
		||||
		var ws = X.utils.table_to_sheet(get_dom_element(html));
 | 
			
		||||
		assert.equal(ws['!ref'], "A1:B3");
 | 
			
		||||
		ws = X.utils.table_to_sheet(get_dom_element(html), {sheetRows:1});
 | 
			
		||||
		assert.equal(ws['!ref'], "A1:B1");
 | 
			
		||||
		assert.equal(ws['!fullref'], "A1:B3");
 | 
			
		||||
		ws = X.utils.table_to_sheet(get_dom_element(html), {sheetRows:2});
 | 
			
		||||
		assert.equal(ws['!ref'], "A1:B2");
 | 
			
		||||
		assert.equal(ws['!fullref'], "A1:B3");
 | 
			
		||||
	});
 | 
			
		||||
	describe('type override', function() {
 | 
			
		||||
		function chk(ws) {
 | 
			
		||||
			assert.equal(get_cell(ws, "A1").t, "s");
 | 
			
		||||
@ -2025,7 +2075,7 @@ describe('js -> file -> js', function() {
 | 
			
		||||
			['C2', 'C3'].forEach(cb); /* string */
 | 
			
		||||
			if(!DIF_XL) cb('D4'); /* date */
 | 
			
		||||
			if(DIF_XL && f == "dif") assert.equal(get_cell(newwb.Sheets.Sheet1, 'C5').v, '=""0.3""');// dif forces string formula
 | 
			
		||||
			else eqcell(wb, newwb, 'Sheet1', 'C5');
 | 
			
		||||
			else if(f != 'csv' && f != 'txt') eqcell(wb, newwb, 'Sheet1', 'C5');
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										54
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										54
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							@ -26,7 +26,7 @@ var opts = ({cellNF: true}/*:any*/);
 | 
			
		||||
var TYPE = browser ? "binary" : "buffer";
 | 
			
		||||
opts.type = TYPE;
 | 
			
		||||
var fullex = [".xlsb", /*".xlsm",*/ ".xlsx"/*, ".xlml", ".xls"*/];
 | 
			
		||||
var ofmt = ["xlsb", "xlsm", "xlsx", "ods", "biff2", "biff5", "biff8", "xlml", "sylk", "dif", "dbf", "eth"];
 | 
			
		||||
var ofmt = ["xlsb", "xlsm", "xlsx", "ods", "biff2", "biff5", "biff8", "xlml", "sylk", "dif", "dbf", "eth", "fods", "csv", "txt", "html"];
 | 
			
		||||
var ex = fullex.slice(); ex = ex.concat([".ods", ".xls", ".xml", ".fods"]);
 | 
			
		||||
if(typeof process != 'undefined' && ((process||{}).env)) {
 | 
			
		||||
	opts.WTF = true;
 | 
			
		||||
@ -540,6 +540,45 @@ describe('parse options', function() {
 | 
			
		||||
		it('sheetRows n=10', function() { FSTPaths.forEach(function(p) {
 | 
			
		||||
			checkcells(X.read(fs.readFileSync(p), {type:TYPE, sheetRows:10}), false, false, false, true);
 | 
			
		||||
		}); });
 | 
			
		||||
		it('sheetRows n=1', function() { ofmt.forEach(function(fmt) {
 | 
			
		||||
			var data = [[1,2],[3,4],[5,6]];
 | 
			
		||||
			var ws = X.utils.aoa_to_sheet(data);
 | 
			
		||||
			assert(ws['!ref'] === "A1:B3");
 | 
			
		||||
			var wb = X.utils.book_new();
 | 
			
		||||
			X.utils.book_append_sheet(wb, ws, "Sheet1");
 | 
			
		||||
			var bs = X.write(wb, { bookType: fmt, type: "binary" });
 | 
			
		||||
 | 
			
		||||
			var wb0 = X.read(bs, { type: "binary" });
 | 
			
		||||
			var ws0 = wb0.Sheets.Sheet1;
 | 
			
		||||
			assert.equal(ws0['!ref'], "A1:B3");
 | 
			
		||||
			assert.equal(get_cell(ws0, "A1").v, 1);
 | 
			
		||||
			assert.equal(get_cell(ws0, "B2").v, 4);
 | 
			
		||||
			assert.equal(get_cell(ws0, "A3").v, 5);
 | 
			
		||||
 | 
			
		||||
			var wb1 = X.read(bs, { type: "binary", sheetRows: 1 });
 | 
			
		||||
			var ws1 = wb1.Sheets.Sheet1;
 | 
			
		||||
			assert.equal(ws1['!ref'], "A1:B1");
 | 
			
		||||
			assert.equal(get_cell(ws1, "A1").v, 1);
 | 
			
		||||
			assert(!get_cell(ws1, "B2"));
 | 
			
		||||
			assert(!get_cell(ws1, "A3"));
 | 
			
		||||
			if(ws1['!fullref']) assert.equal(ws1['!fullref'], "A1:B3");
 | 
			
		||||
 | 
			
		||||
			var wb2 = X.read(bs, { type: "binary", sheetRows: 2 });
 | 
			
		||||
			var ws2 = wb2.Sheets.Sheet1;
 | 
			
		||||
			assert.equal(ws2['!ref'], "A1:B2");
 | 
			
		||||
			assert.equal(get_cell(ws2, "A1").v, 1);
 | 
			
		||||
			assert.equal(get_cell(ws2, "B2").v, 4);
 | 
			
		||||
			assert(!get_cell(ws2, "A3"));
 | 
			
		||||
			if(ws2['!fullref']) assert.equal(ws2['!fullref'], "A1:B3");
 | 
			
		||||
 | 
			
		||||
			var wb3 = X.read(bs, { type: "binary", sheetRows: 3 });
 | 
			
		||||
			var ws3 = wb3.Sheets.Sheet1;
 | 
			
		||||
			assert.equal(ws3['!ref'], "A1:B3");
 | 
			
		||||
			assert.equal(get_cell(ws3, "A1").v, 1);
 | 
			
		||||
			assert.equal(get_cell(ws3, "B2").v, 4);
 | 
			
		||||
			assert.equal(get_cell(ws3, "A3").v, 5);
 | 
			
		||||
			if(ws3['!fullref']) assert.equal(ws3['!fullref'], "A1:B3");
 | 
			
		||||
		}); });
 | 
			
		||||
	});
 | 
			
		||||
	describe('book', function() {
 | 
			
		||||
		it('bookSheets should not generate sheets', function() {
 | 
			
		||||
@ -1981,6 +2020,17 @@ describe('HTML', function() {
 | 
			
		||||
		assert.equal(get_cell(ws, "A1").v, "A&B");
 | 
			
		||||
		assert.equal(get_cell(ws, "B1").v, "A·B");
 | 
			
		||||
	});
 | 
			
		||||
	if(domtest) it('should honor sheetRows', function() {
 | 
			
		||||
		var html = X.utils.sheet_to_html(X.utils.aoa_to_sheet([[1,2],[3,4],[5,6]]));
 | 
			
		||||
		var ws = X.utils.table_to_sheet(get_dom_element(html));
 | 
			
		||||
		assert.equal(ws['!ref'], "A1:B3");
 | 
			
		||||
		ws = X.utils.table_to_sheet(get_dom_element(html), {sheetRows:1});
 | 
			
		||||
		assert.equal(ws['!ref'], "A1:B1");
 | 
			
		||||
		assert.equal(ws['!fullref'], "A1:B3");
 | 
			
		||||
		ws = X.utils.table_to_sheet(get_dom_element(html), {sheetRows:2});
 | 
			
		||||
		assert.equal(ws['!ref'], "A1:B2");
 | 
			
		||||
		assert.equal(ws['!fullref'], "A1:B3");
 | 
			
		||||
	});
 | 
			
		||||
	describe('type override', function() {
 | 
			
		||||
		function chk(ws) {
 | 
			
		||||
			assert.equal(get_cell(ws, "A1").t, "s");
 | 
			
		||||
@ -2025,7 +2075,7 @@ describe('js -> file -> js', function() {
 | 
			
		||||
			['C2', 'C3'].forEach(cb); /* string */
 | 
			
		||||
			if(!DIF_XL) cb('D4'); /* date */
 | 
			
		||||
			if(DIF_XL && f == "dif") assert.equal(get_cell(newwb.Sheets.Sheet1, 'C5').v, '=""0.3""');// dif forces string formula
 | 
			
		||||
			else eqcell(wb, newwb, 'Sheet1', 'C5');
 | 
			
		||||
			else if(f != 'csv' && f != 'txt') eqcell(wb, newwb, 'Sheet1', 'C5');
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -101,7 +101,8 @@ const tbl = {}; /* document.getElementById('table'); */
 | 
			
		||||
const ws3 = XLSX.utils.table_to_sheet(tbl, {
 | 
			
		||||
	raw: true,
 | 
			
		||||
	cellDates: true,
 | 
			
		||||
	dateNF: "yyyy-mm-dd"
 | 
			
		||||
	dateNF: "yyyy-mm-dd",
 | 
			
		||||
	sheetRows: 1
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const obj1 = XLSX.utils.sheet_to_formulae(ws1);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								types/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								types/index.d.ts
									
									
									
									
										vendored
									
									
								
							@ -657,6 +657,12 @@ export interface SheetJSONOpts extends JSON2SheetOpts, OriginOption {}
 | 
			
		||||
export interface Table2SheetOpts extends CommonOptions, DateNFOption {
 | 
			
		||||
    /* If true, plaintext parsing will not parse values */
 | 
			
		||||
    raw?: boolean;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * If >0, read the first sheetRows rows
 | 
			
		||||
     * @default 0
 | 
			
		||||
     */
 | 
			
		||||
    sheetRows?: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** General utilities */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										63
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										63
									
								
								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.12.7';
 | 
			
		||||
XLSX.version = '0.12.8';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*:: declare var cptable:any; */
 | 
			
		||||
/*global cptable:true */
 | 
			
		||||
@ -6010,6 +6010,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 | 
			
		||||
	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -6036,7 +6037,8 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
 | 
			
		||||
	for(i = 0; i < headers.length; ++i) {
 | 
			
		||||
		if(i == null) continue;
 | 
			
		||||
		++hcnt;
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name");
 | 
			
		||||
		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
 | 
			
		||||
		if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)
 | 
			
		||||
			if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; }
 | 
			
		||||
	}
 | 
			
		||||
@ -6224,6 +6226,7 @@ var SYLK = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		if(rowinfo.length > 0) sht['!rows'] = rowinfo;
 | 
			
		||||
		if(colinfo.length > 0) sht['!cols'] = colinfo;
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return [arr, sht];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6314,7 +6317,7 @@ var DIF = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		throw new Error("Unrecognized type " + opts.type);
 | 
			
		||||
	}
 | 
			
		||||
	function dif_to_aoa_str(str/*:string*//*::, opts*/)/*:AOA*/ {
 | 
			
		||||
	function dif_to_aoa_str(str/*:string*/, opts)/*:AOA*/ {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
 | 
			
		||||
@ -6342,6 +6345,7 @@ var DIF = (function() {
 | 
			
		||||
			}
 | 
			
		||||
			if (data === 'EOD') break;
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6415,7 +6419,7 @@ var ETH = (function() {
 | 
			
		||||
	function decode(s/*:string*/)/*:string*/ { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
 | 
			
		||||
	function encode(s/*:string*/)/*:string*/ { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
 | 
			
		||||
 | 
			
		||||
	function eth_to_aoa(str/*:string*//*::, opts*/)/*:AOA*/ {
 | 
			
		||||
	function eth_to_aoa(str/*:string*/, opts)/*:AOA*/ {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			var record = records[ri].trim().split(":");
 | 
			
		||||
@ -6436,6 +6440,7 @@ var ETH = (function() {
 | 
			
		||||
					if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6543,6 +6548,7 @@ var PRN = (function() {
 | 
			
		||||
			for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)
 | 
			
		||||
				set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);
 | 
			
		||||
		}
 | 
			
		||||
		if(o.sheetRows) arr = arr.slice(0, o.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6629,11 +6635,11 @@ var PRN = (function() {
 | 
			
		||||
			start = end+1;
 | 
			
		||||
			if(range.e.c < C) range.e.c = C;
 | 
			
		||||
			if(range.e.r < R) range.e.r = R;
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; }
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }
 | 
			
		||||
		}
 | 
			
		||||
		for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
		outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
			case 0x22: instr = !instr; break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr) finish_cell(); break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;
 | 
			
		||||
			default: break;
 | 
			
		||||
		}
 | 
			
		||||
		if(end - start > 0) finish_cell();
 | 
			
		||||
@ -6732,7 +6738,7 @@ var WK_ = (function() {
 | 
			
		||||
		throw "Unsupported type " + opts.type;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function lotus_to_workbook_buf(d,opts)/*:Workbook*/ {
 | 
			
		||||
	function lotus_to_workbook_buf(d, opts)/*:Workbook*/ {
 | 
			
		||||
		if(!d) return d;
 | 
			
		||||
		var o = opts || {};
 | 
			
		||||
		if(DENSE != null && o.dense == null) o.dense = DENSE;
 | 
			
		||||
@ -6740,6 +6746,7 @@ var WK_ = (function() {
 | 
			
		||||
		var sheets = {}, snames = [n];
 | 
			
		||||
 | 
			
		||||
		var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
 | 
			
		||||
		var sheetRows = o.sheetRows || 0;
 | 
			
		||||
 | 
			
		||||
		if(d[2] == 0x02) o.Enum = WK1Enum;
 | 
			
		||||
		else if(d[2] == 0x1a) o.Enum = WK3Enum;
 | 
			
		||||
@ -6787,6 +6794,7 @@ var WK_ = (function() {
 | 
			
		||||
						sidx = val[3]; n = "Sheet" + (sidx + 1);
 | 
			
		||||
						snames.push(n);
 | 
			
		||||
					}
 | 
			
		||||
					if(sheetRows > 0 && val[0].r >= sheetRows) break;
 | 
			
		||||
					if(o.dense) {
 | 
			
		||||
						if(!s[val[0].r]) s[val[0].r] = [];
 | 
			
		||||
						s[val[0].r][val[0].c] = val[1];
 | 
			
		||||
@ -11992,7 +12000,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro
 | 
			
		||||
	if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
 | 
			
		||||
	if(opts.sheetRows > 0 && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
@ -13141,7 +13149,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
 | 
			
		||||
	if(!s["!ref"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s["!ref"] = encode_range(ref || refguess);
 | 
			
		||||
	if(opts.sheetRows && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
@ -14521,7 +14529,14 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
 | 
			
		||||
			if(Rn[1]==='/'){
 | 
			
		||||
				if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
 | 
			
		||||
				sheetnames.push(sheetname);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
 | 
			
		||||
					cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					if(opts.sheetRows && opts.sheetRows <= refguess.e.r) {
 | 
			
		||||
						cursheet["!fullref"] = cursheet["!ref"];
 | 
			
		||||
						refguess.e.r = opts.sheetRows - 1;
 | 
			
		||||
						cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if(merges.length) cursheet["!merges"] = merges;
 | 
			
		||||
				if(cstys.length > 0) cursheet["!cols"] = cstys;
 | 
			
		||||
				if(rowinfo.length > 0) cursheet["!rows"] = rowinfo;
 | 
			
		||||
@ -15526,6 +15541,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
	};
 | 
			
		||||
	var addcell = function addcell(cell/*:any*/, line/*:any*/, options/*:any*/) {
 | 
			
		||||
		if(file_depth > 1) return;
 | 
			
		||||
		if(options.sheetRows && cell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		if(!cell_valid) return;
 | 
			
		||||
		if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
 | 
			
		||||
		delete line.ixfe; delete line.XF;
 | 
			
		||||
@ -15549,8 +15565,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		else {
 | 
			
		||||
		{
 | 
			
		||||
			if(options.dense) {
 | 
			
		||||
				if(!out[cell.r]) out[cell.r] = [];
 | 
			
		||||
				out[cell.r][cell.c] = line;
 | 
			
		||||
@ -15716,6 +15731,13 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
						if(range.e.r > 0 && range.e.c > 0) {
 | 
			
		||||
							range.e.r--; range.e.c--;
 | 
			
		||||
							out["!ref"] = encode_range(range);
 | 
			
		||||
							if(options.sheetRows && options.sheetRows <= range.e.r) {
 | 
			
		||||
								var tmpri = range.e.r;
 | 
			
		||||
								range.e.r = options.sheetRows - 1;
 | 
			
		||||
								out["!fullref"] = out["!ref"];
 | 
			
		||||
								out["!ref"] = encode_range(range);
 | 
			
		||||
								range.e.r = tmpri;
 | 
			
		||||
							}
 | 
			
		||||
							range.e.r++; range.e.c++;
 | 
			
		||||
						}
 | 
			
		||||
						if(merges.length > 0) out["!merges"] = merges;
 | 
			
		||||
@ -17907,7 +17929,7 @@ var HTML_ = (function() {
 | 
			
		||||
		for(i = 0; i < rows.length; ++i) {
 | 
			
		||||
			var row = rows[i].trim();
 | 
			
		||||
			var hd = row.slice(0,3).toLowerCase();
 | 
			
		||||
			if(hd == "<tr") { ++R; C = 0; continue; }
 | 
			
		||||
			if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
 | 
			
		||||
			if(hd != "<td") continue;
 | 
			
		||||
			var cells = row.split(/<\/td>/i);
 | 
			
		||||
			for(j = 0; j < cells.length; ++j) {
 | 
			
		||||
@ -18011,10 +18033,11 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
 | 
			
		||||
	if(DENSE != null) opts.dense = DENSE;
 | 
			
		||||
	var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/);
 | 
			
		||||
	var rows/*:HTMLCollection<HTMLTableRowElement>*/ = table.getElementsByTagName('tr');
 | 
			
		||||
	var range/*:Range*/ = {s:{r:0,c:0},e:{r:rows.length - 1,c:0}};
 | 
			
		||||
	var sheetRows = Math.min(opts.sheetRows||10000000, rows.length);
 | 
			
		||||
	var range/*:Range*/ = {s:{r:0,c:0},e:{r:sheetRows - 1,c:0}};
 | 
			
		||||
	var merges/*:Array<Range>*/ = [], midx = 0;
 | 
			
		||||
	var R = 0, _C = 0, C = 0, RS = 0, CS = 0;
 | 
			
		||||
	for(; R < rows.length; ++R) {
 | 
			
		||||
	for(; R < sheetRows; ++R) {
 | 
			
		||||
		var row/*:HTMLTableRowElement*/ = rows[R];
 | 
			
		||||
		var elts/*:HTMLCollection<HTMLTableCellElement>*/ = (row.children/*:any*/);
 | 
			
		||||
		for(_C = C = 0; _C < elts.length; ++_C) {
 | 
			
		||||
@ -18048,6 +18071,7 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
 | 
			
		||||
	}
 | 
			
		||||
	ws['!merges'] = merges;
 | 
			
		||||
	ws['!ref'] = encode_range(range);
 | 
			
		||||
	if(sheetRows < rows.length) ws['!fullref'] = encode_range((range.e.r = rows.length-1,range));
 | 
			
		||||
	return ws;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18118,6 +18142,11 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'table': case '工作表': // 9.1.2 <table:table>
 | 
			
		||||
				if(Rn[1]==='/') {
 | 
			
		||||
					if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);
 | 
			
		||||
					if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
 | 
			
		||||
						ws['!fullref'] = ws['!ref'];
 | 
			
		||||
						range.e.r = opts.sheetRows - 1;
 | 
			
		||||
						ws['!ref'] = encode_range(range);
 | 
			
		||||
					}
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
@ -18234,7 +18263,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(comments.length > 0) { q.c = comments; comments = []; }
 | 
			
		||||
					if(textp && opts.cellText !== false) q.w = textp;
 | 
			
		||||
					if(!isstub || opts.sheetStubs) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows < R)) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows <= R)) {
 | 
			
		||||
							for(var rpt = 0; rpt < rowpeat; ++rpt) {
 | 
			
		||||
								colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
								if(opts.dense) {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										63
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										63
									
								
								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.12.7';
 | 
			
		||||
XLSX.version = '0.12.8';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -5918,6 +5918,7 @@ var fields = [], field = ({});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error("DBF EOF Marker missing " + (d.l-1) + " of " + d.length + " " + d[d.l-1].toString(16));
 | 
			
		||||
	if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5944,7 +5945,8 @@ function sheet_to_dbf(ws, opts) {
 | 
			
		||||
	for(i = 0; i < headers.length; ++i) {
 | 
			
		||||
		if(i == null) continue;
 | 
			
		||||
		++hcnt;
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name");
 | 
			
		||||
		if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
 | 
			
		||||
		if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
 | 
			
		||||
		if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)
 | 
			
		||||
			if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; }
 | 
			
		||||
	}
 | 
			
		||||
@ -6132,6 +6134,7 @@ var SYLK = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		if(rowinfo.length > 0) sht['!rows'] = rowinfo;
 | 
			
		||||
		if(colinfo.length > 0) sht['!cols'] = colinfo;
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return [arr, sht];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6222,7 +6225,7 @@ var DIF = (function() {
 | 
			
		||||
		}
 | 
			
		||||
		throw new Error("Unrecognized type " + opts.type);
 | 
			
		||||
	}
 | 
			
		||||
	function dif_to_aoa_str(str) {
 | 
			
		||||
	function dif_to_aoa_str(str, opts) {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
 | 
			
		||||
@ -6250,6 +6253,7 @@ var DIF = (function() {
 | 
			
		||||
			}
 | 
			
		||||
			if (data === 'EOD') break;
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6323,7 +6327,7 @@ var ETH = (function() {
 | 
			
		||||
	function decode(s) { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
 | 
			
		||||
	function encode(s) { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
 | 
			
		||||
 | 
			
		||||
	function eth_to_aoa(str) {
 | 
			
		||||
	function eth_to_aoa(str, opts) {
 | 
			
		||||
		var records = str.split('\n'), R = -1, C = -1, ri = 0, arr = [];
 | 
			
		||||
		for (; ri !== records.length; ++ri) {
 | 
			
		||||
			var record = records[ri].trim().split(":");
 | 
			
		||||
@ -6344,6 +6348,7 @@ var ETH = (function() {
 | 
			
		||||
					if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6451,6 +6456,7 @@ var PRN = (function() {
 | 
			
		||||
			for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)
 | 
			
		||||
				set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);
 | 
			
		||||
		}
 | 
			
		||||
		if(o.sheetRows) arr = arr.slice(0, o.sheetRows);
 | 
			
		||||
		return arr;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -6537,11 +6543,11 @@ var PRN = (function() {
 | 
			
		||||
			start = end+1;
 | 
			
		||||
			if(range.e.c < C) range.e.c = C;
 | 
			
		||||
			if(range.e.r < R) range.e.r = R;
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; }
 | 
			
		||||
			if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }
 | 
			
		||||
		}
 | 
			
		||||
		for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
		outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
 | 
			
		||||
			case 0x22: instr = !instr; break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr) finish_cell(); break;
 | 
			
		||||
			case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;
 | 
			
		||||
			default: break;
 | 
			
		||||
		}
 | 
			
		||||
		if(end - start > 0) finish_cell();
 | 
			
		||||
@ -6640,7 +6646,7 @@ var WK_ = (function() {
 | 
			
		||||
		throw "Unsupported type " + opts.type;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function lotus_to_workbook_buf(d,opts) {
 | 
			
		||||
	function lotus_to_workbook_buf(d, opts) {
 | 
			
		||||
		if(!d) return d;
 | 
			
		||||
		var o = opts || {};
 | 
			
		||||
		if(DENSE != null && o.dense == null) o.dense = DENSE;
 | 
			
		||||
@ -6648,6 +6654,7 @@ var WK_ = (function() {
 | 
			
		||||
		var sheets = {}, snames = [n];
 | 
			
		||||
 | 
			
		||||
		var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
 | 
			
		||||
		var sheetRows = o.sheetRows || 0;
 | 
			
		||||
 | 
			
		||||
		if(d[2] == 0x02) o.Enum = WK1Enum;
 | 
			
		||||
		else if(d[2] == 0x1a) o.Enum = WK3Enum;
 | 
			
		||||
@ -6695,6 +6702,7 @@ var WK_ = (function() {
 | 
			
		||||
						sidx = val[3]; n = "Sheet" + (sidx + 1);
 | 
			
		||||
						snames.push(n);
 | 
			
		||||
					}
 | 
			
		||||
					if(sheetRows > 0 && val[0].r >= sheetRows) break;
 | 
			
		||||
					if(o.dense) {
 | 
			
		||||
						if(!s[val[0].r]) s[val[0].r] = [];
 | 
			
		||||
						s[val[0].r][val[0].c] = val[1];
 | 
			
		||||
@ -11896,7 +11904,7 @@ function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
 | 
			
		||||
	if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
 | 
			
		||||
	if(opts.sheetRows > 0 && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
@ -13044,7 +13052,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
 | 
			
		||||
	if(!s["!ref"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s["!ref"] = encode_range(ref || refguess);
 | 
			
		||||
	if(opts.sheetRows && s["!ref"]) {
 | 
			
		||||
		var tmpref = safe_decode_range(s["!ref"]);
 | 
			
		||||
		if(opts.sheetRows < +tmpref.e.r) {
 | 
			
		||||
		if(opts.sheetRows <= +tmpref.e.r) {
 | 
			
		||||
			tmpref.e.r = opts.sheetRows - 1;
 | 
			
		||||
			if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
 | 
			
		||||
			if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;
 | 
			
		||||
@ -14419,7 +14427,14 @@ for(var cma = c; cma <= cc; ++cma) {
 | 
			
		||||
			if(Rn[1]==='/'){
 | 
			
		||||
				if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
 | 
			
		||||
				sheetnames.push(sheetname);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
				if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
 | 
			
		||||
					cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					if(opts.sheetRows && opts.sheetRows <= refguess.e.r) {
 | 
			
		||||
						cursheet["!fullref"] = cursheet["!ref"];
 | 
			
		||||
						refguess.e.r = opts.sheetRows - 1;
 | 
			
		||||
						cursheet["!ref"] = encode_range(refguess);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if(merges.length) cursheet["!merges"] = merges;
 | 
			
		||||
				if(cstys.length > 0) cursheet["!cols"] = cstys;
 | 
			
		||||
				if(rowinfo.length > 0) cursheet["!rows"] = rowinfo;
 | 
			
		||||
@ -15418,6 +15433,7 @@ function parse_workbook(blob, options) {
 | 
			
		||||
	};
 | 
			
		||||
	var addcell = function addcell(cell, line, options) {
 | 
			
		||||
		if(file_depth > 1) return;
 | 
			
		||||
		if(options.sheetRows && cell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		if(!cell_valid) return;
 | 
			
		||||
		if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
 | 
			
		||||
		delete line.ixfe; delete line.XF;
 | 
			
		||||
@ -15441,8 +15457,7 @@ function parse_workbook(blob, options) {
 | 
			
		||||
				break;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;
 | 
			
		||||
		else {
 | 
			
		||||
		{
 | 
			
		||||
			if(options.dense) {
 | 
			
		||||
				if(!out[cell.r]) out[cell.r] = [];
 | 
			
		||||
				out[cell.r][cell.c] = line;
 | 
			
		||||
@ -15607,6 +15622,13 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
 | 
			
		||||
						if(range.e.r > 0 && range.e.c > 0) {
 | 
			
		||||
							range.e.r--; range.e.c--;
 | 
			
		||||
							out["!ref"] = encode_range(range);
 | 
			
		||||
							if(options.sheetRows && options.sheetRows <= range.e.r) {
 | 
			
		||||
								var tmpri = range.e.r;
 | 
			
		||||
								range.e.r = options.sheetRows - 1;
 | 
			
		||||
								out["!fullref"] = out["!ref"];
 | 
			
		||||
								out["!ref"] = encode_range(range);
 | 
			
		||||
								range.e.r = tmpri;
 | 
			
		||||
							}
 | 
			
		||||
							range.e.r++; range.e.c++;
 | 
			
		||||
						}
 | 
			
		||||
						if(merges.length > 0) out["!merges"] = merges;
 | 
			
		||||
@ -17796,7 +17818,7 @@ var HTML_ = (function() {
 | 
			
		||||
		for(i = 0; i < rows.length; ++i) {
 | 
			
		||||
			var row = rows[i].trim();
 | 
			
		||||
			var hd = row.slice(0,3).toLowerCase();
 | 
			
		||||
			if(hd == "<tr") { ++R; C = 0; continue; }
 | 
			
		||||
			if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
 | 
			
		||||
			if(hd != "<td") continue;
 | 
			
		||||
			var cells = row.split(/<\/td>/i);
 | 
			
		||||
			for(j = 0; j < cells.length; ++j) {
 | 
			
		||||
@ -17900,10 +17922,11 @@ function parse_dom_table(table, _opts) {
 | 
			
		||||
	if(DENSE != null) opts.dense = DENSE;
 | 
			
		||||
	var ws = opts.dense ? ([]) : ({});
 | 
			
		||||
	var rows = table.getElementsByTagName('tr');
 | 
			
		||||
	var range = {s:{r:0,c:0},e:{r:rows.length - 1,c:0}};
 | 
			
		||||
	var sheetRows = Math.min(opts.sheetRows||10000000, rows.length);
 | 
			
		||||
	var range = {s:{r:0,c:0},e:{r:sheetRows - 1,c:0}};
 | 
			
		||||
	var merges = [], midx = 0;
 | 
			
		||||
	var R = 0, _C = 0, C = 0, RS = 0, CS = 0;
 | 
			
		||||
	for(; R < rows.length; ++R) {
 | 
			
		||||
	for(; R < sheetRows; ++R) {
 | 
			
		||||
		var row = rows[R];
 | 
			
		||||
		var elts = (row.children);
 | 
			
		||||
		for(_C = C = 0; _C < elts.length; ++_C) {
 | 
			
		||||
@ -17937,6 +17960,7 @@ function parse_dom_table(table, _opts) {
 | 
			
		||||
	}
 | 
			
		||||
	ws['!merges'] = merges;
 | 
			
		||||
	ws['!ref'] = encode_range(range);
 | 
			
		||||
	if(sheetRows < rows.length) ws['!fullref'] = encode_range((range.e.r = rows.length-1,range));
 | 
			
		||||
	return ws;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18007,6 +18031,11 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'table': case '工作表': // 9.1.2 <table:table>
 | 
			
		||||
				if(Rn[1]==='/') {
 | 
			
		||||
					if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);
 | 
			
		||||
					if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
 | 
			
		||||
						ws['!fullref'] = ws['!ref'];
 | 
			
		||||
						range.e.r = opts.sheetRows - 1;
 | 
			
		||||
						ws['!ref'] = encode_range(range);
 | 
			
		||||
					}
 | 
			
		||||
					if(merges.length) ws['!merges'] = merges;
 | 
			
		||||
					if(rowinfo.length) ws["!rows"] = rowinfo;
 | 
			
		||||
					sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
 | 
			
		||||
@ -18123,7 +18152,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					if(comments.length > 0) { q.c = comments; comments = []; }
 | 
			
		||||
					if(textp && opts.cellText !== false) q.w = textp;
 | 
			
		||||
					if(!isstub || opts.sheetStubs) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows < R)) {
 | 
			
		||||
						if(!(opts.sheetRows && opts.sheetRows <= R)) {
 | 
			
		||||
							for(var rpt = 0; rpt < rowpeat; ++rpt) {
 | 
			
		||||
								colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
								if(opts.dense) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user