Skip to content

Commit 93f7749

Browse files
committed
version bump 0.12.8: sheetRows multiformat support
- all formats accept `sheetRows` option (fixes SheetJS#1062 h/t @prog666) - `table_to_*` support for `sheetRows` - demo cleanup
1 parent 3592efa commit 93f7749

37 files changed

+728
-135
lines changed

.spelling

+6
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ AngularJS
107107
NativeScript
108108
angular-cli
109109

110+
- demos/array/README.md
111+
WebGL
112+
WebAssembly
113+
dataset
114+
TensorFlow
115+
110116
- demos/database/README.md
111117
Knex
112118
LowDB

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ The [`demos` directory](demos/) includes sample projects for:
198198
- [`XMLHttpRequest and fetch`](demos/xhr/)
199199
- [`nodejs server`](demos/server/)
200200
- [`databases and key/value stores`](demos/database/)
201+
- [`typed arrays and math`](demos/array/)
201202

202203
**Bundlers and Tooling**
203204
- [`browserify`](demos/browserify/)
@@ -2045,9 +2046,10 @@ Both functions accept options arguments:
20452046

20462047
| Option Name | Default | Description |
20472048
| :---------- | :------: | :-------------------------------------------------- |
2049+
|`raw` | | If true, every cell will hold raw strings |
20482050
|`dateNF` | FMT 14 | Use specified date format in string output |
20492051
|`cellDates` | false | Store dates as type `d` (default is `n`) |
2050-
|`raw` | | If true, every cell will hold raw strings |
2052+
|`sheetRows` | 0 | If >0, read the first `sheetRows` rows of the table |
20512053

20522054

20532055
<details>

bits/01_version.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
XLSX.version = '0.12.7';
1+
XLSX.version = '0.12.8';

bits/40_harb.js

+12-6
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ function dbf_to_aoa(buf, opts)/*:AOA*/ {
180180
}
181181
}
182182
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));
183+
if(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);
183184
return out;
184185
}
185186

@@ -206,7 +207,8 @@ function sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {
206207
for(i = 0; i < headers.length; ++i) {
207208
if(i == null) continue;
208209
++hcnt;
209-
if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name");
210+
if(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);
211+
if(typeof headers[i] !== 'string') throw new Error("DBF Invalid column name " + headers[i] + " |" + (typeof headers[i]) + "|");
210212
if(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)
211213
if(headers.indexOf(headers[i] + "_" + j) == -1) { headers[i] += "_" + j; break; }
212214
}
@@ -394,6 +396,7 @@ var SYLK = (function() {
394396
}
395397
if(rowinfo.length > 0) sht['!rows'] = rowinfo;
396398
if(colinfo.length > 0) sht['!cols'] = colinfo;
399+
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
397400
return [arr, sht];
398401
}
399402

@@ -484,7 +487,7 @@ var DIF = (function() {
484487
}
485488
throw new Error("Unrecognized type " + opts.type);
486489
}
487-
function dif_to_aoa_str(str/*:string*//*::, opts*/)/*:AOA*/ {
490+
function dif_to_aoa_str(str/*:string*/, opts)/*:AOA*/ {
488491
var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];
489492
for (; ri !== records.length; ++ri) {
490493
if (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }
@@ -512,6 +515,7 @@ var DIF = (function() {
512515
}
513516
if (data === 'EOD') break;
514517
}
518+
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
515519
return arr;
516520
}
517521

@@ -585,7 +589,7 @@ var ETH = (function() {
585589
function decode(s/*:string*/)/*:string*/ { return s.replace(/\\b/g,"\\").replace(/\\c/g,":").replace(/\\n/g,"\n"); }
586590
function encode(s/*:string*/)/*:string*/ { return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g,"\\n"); }
587591

588-
function eth_to_aoa(str/*:string*//*::, opts*/)/*:AOA*/ {
592+
function eth_to_aoa(str/*:string*/, opts)/*:AOA*/ {
589593
var records = str.split('\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];
590594
for (; ri !== records.length; ++ri) {
591595
var record = records[ri].trim().split(":");
@@ -606,6 +610,7 @@ var ETH = (function() {
606610
if(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];
607611
}
608612
}
613+
if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);
609614
return arr;
610615
}
611616

@@ -713,6 +718,7 @@ var PRN = (function() {
713718
for(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)
714719
set_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);
715720
}
721+
if(o.sheetRows) arr = arr.slice(0, o.sheetRows);
716722
return arr;
717723
}
718724

@@ -799,11 +805,11 @@ var PRN = (function() {
799805
start = end+1;
800806
if(range.e.c < C) range.e.c = C;
801807
if(range.e.r < R) range.e.r = R;
802-
if(cc == sepcc) ++C; else { C = 0; ++R; }
808+
if(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }
803809
}
804-
for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
810+
outer: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {
805811
case 0x22: instr = !instr; break;
806-
case sepcc: case 0x0a: case 0x0d: if(!instr) finish_cell(); break;
812+
case sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;
807813
default: break;
808814
}
809815
if(end - start > 0) finish_cell();

bits/41_lotus.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ var WK_ = (function() {
2424
throw "Unsupported type " + opts.type;
2525
}
2626

27-
function lotus_to_workbook_buf(d,opts)/*:Workbook*/ {
27+
function lotus_to_workbook_buf(d, opts)/*:Workbook*/ {
2828
if(!d) return d;
2929
var o = opts || {};
3030
if(DENSE != null && o.dense == null) o.dense = DENSE;
3131
var s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/), n = "Sheet1", sidx = 0;
3232
var sheets = {}, snames = [n];
3333

3434
var refguess = {s: {r:0, c:0}, e: {r:0, c:0} };
35+
var sheetRows = o.sheetRows || 0;
3536

3637
if(d[2] == 0x02) o.Enum = WK1Enum;
3738
else if(d[2] == 0x1a) o.Enum = WK3Enum;
@@ -79,6 +80,7 @@ var WK_ = (function() {
7980
sidx = val[3]; n = "Sheet" + (sidx + 1);
8081
snames.push(n);
8182
}
83+
if(sheetRows > 0 && val[0].r >= sheetRows) break;
8284
if(o.dense) {
8385
if(!s[val[0].r]) s[val[0].r] = [];
8486
s[val[0].r][val[0].c] = val[1];

bits/67_wsxml.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBPro
7575
if(!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s["!ref"] = encode_range(refguess);
7676
if(opts.sheetRows > 0 && s["!ref"]) {
7777
var tmpref = safe_decode_range(s["!ref"]);
78-
if(opts.sheetRows < +tmpref.e.r) {
78+
if(opts.sheetRows <= +tmpref.e.r) {
7979
tmpref.e.r = opts.sheetRows - 1;
8080
if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
8181
if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;

bits/68_wsbin.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ function parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/
645645
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);
646646
if(opts.sheetRows && s["!ref"]) {
647647
var tmpref = safe_decode_range(s["!ref"]);
648-
if(opts.sheetRows < +tmpref.e.r) {
648+
if(opts.sheetRows <= +tmpref.e.r) {
649649
tmpref.e.r = opts.sheetRows - 1;
650650
if(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;
651651
if(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;

bits/75_xlml.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,14 @@ function parse_xlml_xml(d, _opts)/*:Workbook*/ {
276276
if(Rn[1]==='/'){
277277
if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));
278278
sheetnames.push(sheetname);
279-
if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) cursheet["!ref"] = encode_range(refguess);
279+
if(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
280+
cursheet["!ref"] = encode_range(refguess);
281+
if(opts.sheetRows && opts.sheetRows <= refguess.e.r) {
282+
cursheet["!fullref"] = cursheet["!ref"];
283+
refguess.e.r = opts.sheetRows - 1;
284+
cursheet["!ref"] = encode_range(refguess);
285+
}
286+
}
280287
if(merges.length) cursheet["!merges"] = merges;
281288
if(cstys.length > 0) cursheet["!cols"] = cstys;
282289
if(rowinfo.length > 0) cursheet["!rows"] = rowinfo;

bits/76_xls.js

+9-2
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
129129
};
130130
var addcell = function addcell(cell/*:any*/, line/*:any*/, options/*:any*/) {
131131
if(file_depth > 1) return;
132+
if(options.sheetRows && cell.r >= options.sheetRows) cell_valid = false;
132133
if(!cell_valid) return;
133134
if(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);
134135
delete line.ixfe; delete line.XF;
@@ -152,8 +153,7 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
152153
break;
153154
}
154155
}
155-
if(options.sheetRows && lastcell.r >= options.sheetRows) cell_valid = false;
156-
else {
156+
{
157157
if(options.dense) {
158158
if(!out[cell.r]) out[cell.r] = [];
159159
out[cell.r][cell.c] = line;
@@ -319,6 +319,13 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
319319
if(range.e.r > 0 && range.e.c > 0) {
320320
range.e.r--; range.e.c--;
321321
out["!ref"] = encode_range(range);
322+
if(options.sheetRows && options.sheetRows <= range.e.r) {
323+
var tmpri = range.e.r;
324+
range.e.r = options.sheetRows - 1;
325+
out["!fullref"] = out["!ref"];
326+
out["!ref"] = encode_range(range);
327+
range.e.r = tmpri;
328+
}
322329
range.e.r++; range.e.c++;
323330
}
324331
if(merges.length > 0) out["!merges"] = merges;

bits/79_html.js

+5-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ var HTML_ = (function() {
1515
for(i = 0; i < rows.length; ++i) {
1616
var row = rows[i].trim();
1717
var hd = row.slice(0,3).toLowerCase();
18-
if(hd == "<tr") { ++R; C = 0; continue; }
18+
if(hd == "<tr") { ++R; if(opts.sheetRows && opts.sheetRows <= R) { --R; break; } C = 0; continue; }
1919
if(hd != "<td") continue;
2020
var cells = row.split(/<\/td>/i);
2121
for(j = 0; j < cells.length; ++j) {
@@ -119,10 +119,11 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
119119
if(DENSE != null) opts.dense = DENSE;
120120
var ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/);
121121
var rows/*:HTMLCollection<HTMLTableRowElement>*/ = table.getElementsByTagName('tr');
122-
var range/*:Range*/ = {s:{r:0,c:0},e:{r:rows.length - 1,c:0}};
122+
var sheetRows = Math.min(opts.sheetRows||10000000, rows.length);
123+
var range/*:Range*/ = {s:{r:0,c:0},e:{r:sheetRows - 1,c:0}};
123124
var merges/*:Array<Range>*/ = [], midx = 0;
124125
var R = 0, _C = 0, C = 0, RS = 0, CS = 0;
125-
for(; R < rows.length; ++R) {
126+
for(; R < sheetRows; ++R) {
126127
var row/*:HTMLTableRowElement*/ = rows[R];
127128
var elts/*:HTMLCollection<HTMLTableCellElement>*/ = (row.children/*:any*/);
128129
for(_C = C = 0; _C < elts.length; ++_C) {
@@ -156,6 +157,7 @@ function parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {
156157
}
157158
ws['!merges'] = merges;
158159
ws['!ref'] = encode_range(range);
160+
if(sheetRows < rows.length) ws['!fullref'] = encode_range((range.e.r = rows.length-1,range));
159161
return ws;
160162
}
161163

bits/80_parseods.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ var parse_content_xml = (function() {
6262
case 'table': case '工作表': // 9.1.2 <table:table>
6363
if(Rn[1]==='/') {
6464
if(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);
65+
if(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
66+
ws['!fullref'] = ws['!ref'];
67+
range.e.r = opts.sheetRows - 1;
68+
ws['!ref'] = encode_range(range);
69+
}
6570
if(merges.length) ws['!merges'] = merges;
6671
if(rowinfo.length) ws["!rows"] = rowinfo;
6772
sheetag.name = utf8read(sheetag['名称'] || sheetag.name);
@@ -178,7 +183,7 @@ var parse_content_xml = (function() {
178183
if(comments.length > 0) { q.c = comments; comments = []; }
179184
if(textp && opts.cellText !== false) q.w = textp;
180185
if(!isstub || opts.sheetStubs) {
181-
if(!(opts.sheetRows && opts.sheetRows < R)) {
186+
if(!(opts.sheetRows && opts.sheetRows <= R)) {
182187
for(var rpt = 0; rpt < rowpeat; ++rpt) {
183188
colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
184189
if(opts.dense) {

demos/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ can be installed with Bash on Windows or with `cygwin`.
2626
- [`XMLHttpRequest and fetch`](xhr/)
2727
- [`nodejs server`](server/)
2828
- [`databases and key/value stores`](database/)
29+
- [`typed arrays and math`](array/)
2930

3031
**Bundlers and Tooling**
3132
- [`browserify`](browserify/)

demos/array/Makefile

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.PHONY: tfjs
2+
tfjs:
3+
npm install @tensorflow/tfjs
4+
node tf.js
5+
6+
.PHONY: propel
7+
propel:
8+
node propel.js

0 commit comments

Comments
 (0)