Skip to content

Commit 5f0f2c9

Browse files
committed
version bump 0.18.0
- Removed global variables `XLS` and `ODS` from standalone browser build - Removed `dist/jszip.js` from the package - XLSX SST parse, fixes #2503
1 parent cb8046c commit 5f0f2c9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+5352
-457
lines changed

README.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ Community Translations of this README:
122122
+ [Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)](#lotus-1-2-3-wkswk1wk2wk3wk4123)
123123
+ [Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)](#quattro-pro-wq1wq2wb1wb2wb3qpw)
124124
+ [Works for DOS / Windows Spreadsheet (WKS/XLR)](#works-for-dos--windows-spreadsheet-wksxlr)
125+
+ [Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS)](#numbers-30--iwork-2013-spreadsheet-numbers)
125126
+ [OpenDocument Spreadsheet (ODS/FODS)](#opendocument-spreadsheet-odsfods)
126127
+ [Uniform Office Spreadsheet (UOS1/2)](#uniform-office-spreadsheet-uos12)
127128
* [Other Single-Worksheet Formats](#other-single-worksheet-formats)
@@ -1840,7 +1841,7 @@ file but Excel will know how to handle it. This library applies similar logic:
18401841
| `0xD0` | CFB Container | BIFF 5/8 or protected XLSX/XLSB or WQ3/QPW or XLR |
18411842
| `0x09` | BIFF Stream | BIFF 2/3/4/5 |
18421843
| `0x3C` | XML/HTML | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
1843-
| `0x50` | ZIP Archive | XLSB or XLSX/M or ODS or UOS2 or plain text |
1844+
| `0x50` | ZIP Archive | XLSB or XLSX/M or ODS or UOS2 or NUMBERS or text |
18441845
| `0x49` | Plain Text | SYLK or plain text |
18451846
| `0x54` | Plain Text | DIF or plain text |
18461847
| `0xEF` | UTF8 Encoded | SpreadsheetML / Flat ODS / UOS1 / HTML / plain text |
@@ -2484,6 +2485,7 @@ Despite the library name `xlsx`, it supports numerous spreadsheet file formats:
24842485
| Lotus Formatted Text (PRN) |||
24852486
| UTF-16 Unicode Text (TXT) |||
24862487
| **Other Workbook/Worksheet Formats** |:-----:|:-----:|
2488+
| Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS) || |
24872489
| OpenDocument Spreadsheet (ODS) |||
24882490
| Flat XML ODF Spreadsheet (FODS) |||
24892491
| Uniform Office Format Spreadsheet (标文通 UOS1/UOS2) || |
@@ -2669,6 +2671,21 @@ XLR also includes a `WksSSWorkBook` stream similar to Lotus FM3/FMT files.
26692671

26702672
</details>
26712673

2674+
#### Numbers 3.0+ / iWork 2013+ Spreadsheet (NUMBERS)
2675+
2676+
<details>
2677+
<summary>(click to show)</summary>
2678+
2679+
iWork 2013 (Numbers 3.0 / Pages 5.0 / Keynote 6.0) switched from a proprietary
2680+
XML-based format to the current file format based on the iWork Archive (IWA).
2681+
This format has been used up through the current release (Numbers 11.2).
2682+
2683+
The parser focuses on extracting raw data from tables. Numbers technically
2684+
supports multiple tables in a logical worksheet, including custom titles. This
2685+
parser will generate one worksheet per Numbers table.
2686+
2687+
</details>
2688+
26722689
#### OpenDocument Spreadsheet (ODS/FODS)
26732690

26742691
<details>

bits/01_version.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
XLSX.version = '0.17.5';
1+
XLSX.version = '0.18.0';

bits/02_codepage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ if(typeof module !== "undefined" && typeof require !== 'undefined') {
88
}
99
}
1010

11-
var VALID_ANSI = [ 874, 932, 936, 949, 950 ];
11+
var VALID_ANSI = [ 874, 932, 936, 949, 950, 10000 ];
1212
for(var i = 0; i <= 8; ++i) VALID_ANSI.push(1250 + i);
1313
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */
1414
var CS2CP = ({

bits/42_sstxml.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,19 @@ function parse_rpr(rpr) {
8181
case '<color':
8282
if(y.rgb) font.color = y.rgb.slice(2,8);
8383
break;
84+
case '<color>': case '<color/>': case '</color>': break;
8485

8586
/* 18.8.18 family ST_FontFamily */
8687
case '<family': font.family = y.val; break;
88+
case '<family>': case '<family/>': case '</family>': break;
8789

8890
/* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */
8991
case '<vertAlign': font.valign = y.val; break;
92+
case '<vertAlign>': case '<vertAlign/>': case '</vertAlign>': break;
9093

9194
/* 18.8.35 scheme CT_FontScheme TODO */
9295
case '<scheme': break;
96+
case '<scheme>': case '<scheme/>': case '</scheme>': break;
9397

9498
/* 18.2.10 extLst CT_ExtensionList ? */
9599
case '<extLst': case '<extLst>': case '</extLst>': break;

bits/78_writebiff.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ function write_biff_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {
387387
if(!ws || !ws["!ref"]) continue;
388388
var range = decode_range(ws["!ref"]);
389389
if(range.e.c > 255) { // note: 255 is IV
390-
console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost.");
390+
if(typeof console != "undefined" && console.error) console.error("Worksheet '" + wb.SheetNames[i] + "' extends beyond column IV (255). Data may be lost.");
391391
}
392392
}
393393

bits/82_sheeter.js

Lines changed: 0 additions & 25 deletions
This file was deleted.

bits/83_numbers.js

Lines changed: 72 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ var NUMBERS = (function() {
4040
return new DataView(array.buffer, array.byteOffset, array.byteLength);
4141
};
4242
var u8str = function(u8) {
43-
return new TextDecoder().decode(u8);
43+
return typeof TextDecoder != "undefined" ? new TextDecoder().decode(u8) : utf8read(a2s(u8));
4444
};
4545
var u8concat = function(u8a) {
4646
var len = u8a.reduce(function(acc, x) {
@@ -280,12 +280,17 @@ var NUMBERS = (function() {
280280
}
281281

282282
// src/prebnccell.ts
283-
function parseit(buf, version) {
283+
function parseit(buf, sst, rsst, version) {
284284
var dv = u8_to_dataview(buf);
285285
var ctype = buf[version == 4 ? 1 : 2];
286286
var flags = dv.getUint32(4, true);
287-
var data_offset = 12 + popcnt(flags & 16270) * 4;
288-
var sidx = -1, ieee = NaN, dt = NaN;
287+
var data_offset = 12 + popcnt(flags & 3470) * 4;
288+
var ridx = -1, sidx = -1, ieee = NaN, dt = new Date(2001, 0, 1);
289+
if (flags & 512) {
290+
ridx = dv.getUint32(data_offset, true);
291+
data_offset += 4;
292+
}
293+
data_offset += popcnt(flags & 12288) * 4;
289294
if (flags & 16) {
290295
sidx = dv.getUint32(data_offset, true);
291296
data_offset += 4;
@@ -295,7 +300,7 @@ var NUMBERS = (function() {
295300
data_offset += 8;
296301
}
297302
if (flags & 64) {
298-
dt = dv.getFloat64(data_offset, true);
303+
dt.setTime(dt.getTime() + dv.getFloat64(data_offset, true) * 1e3);
299304
data_offset += 8;
300305
}
301306
var ret;
@@ -306,30 +311,43 @@ var NUMBERS = (function() {
306311
ret = { t: "n", v: ieee };
307312
break;
308313
case 3:
309-
ret = { t: "s", v: sidx };
314+
ret = { t: "s", v: sst[sidx] };
310315
break;
311316
case 5:
312-
var dd = new Date(2001, 0, 1);
313-
dd.setTime(dd.getTime() + dt * 1e3);
314-
ret = { t: "d", v: dd };
317+
ret = { t: "d", v: dt };
315318
break;
316319
case 6:
317320
ret = { t: "b", v: ieee > 0 };
318321
break;
319322
case 7:
320323
ret = { t: "n", v: ieee };
321324
break;
325+
case 8:
326+
ret = { t: "e", v: 0 };
327+
break;
328+
case 9:
329+
{
330+
if (ridx > -1)
331+
ret = { t: "s", v: rsst[ridx] };
332+
else if (sidx > -1)
333+
ret = { t: "s", v: sst[sidx] };
334+
else if (!isNaN(ieee))
335+
ret = { t: "n", v: ieee };
336+
else
337+
throw new Error("Unsupported cell type ".concat(buf.slice(0, 4)));
338+
}
339+
break;
322340
default:
323341
throw new Error("Unsupported cell type ".concat(buf.slice(0, 4)));
324342
}
325343
return ret;
326344
}
327-
function parse(buf) {
345+
function parse(buf, sst, rsst) {
328346
var version = buf[0];
329347
switch (version) {
330348
case 3:
331349
case 4:
332-
return parseit(buf, version);
350+
return parseit(buf, sst, rsst, version);
333351
default:
334352
throw new Error("Unsupported pre-BNC version ".concat(version));
335353
}
@@ -352,11 +370,18 @@ var NUMBERS = (function() {
352370
return { Sheets: {}, SheetNames: [] };
353371
};
354372
var book_append_sheet = function(wb, ws, name) {
355-
if (!name) {
356-
for (var i = 1; i < 9999; ++i)
373+
if (!name)
374+
for (var i = 1; i < 9999; ++i) {
357375
if (wb.SheetNames.indexOf(name = "Sheet ".concat(i)) == -1)
358376
break;
359-
}
377+
}
378+
else if (wb.SheetNames.indexOf(name) > -1)
379+
for (var i = 1; i < 9999; ++i) {
380+
if (wb.SheetNames.indexOf("".concat(name, "_").concat(i)) == -1) {
381+
name = "".concat(name, "_").concat(i);
382+
break;
383+
}
384+
}
360385
wb.SheetNames.push(name);
361386
wb.Sheets[name] = ws;
362387
};
@@ -406,12 +431,31 @@ var NUMBERS = (function() {
406431
}
407432
function parse_TST_TableDataList(M, root) {
408433
var pb = parse_shallow(root.data);
434+
var type = varint_to_i32(pb[1][0].data);
409435
var entries = pb[3];
410436
var data = [];
411437
(entries || []).forEach(function(entry) {
412438
var le = parse_shallow(entry.data);
413439
var key = varint_to_i32(le[1][0].data) >>> 0;
414-
data[key] = u8str(le[3][0].data);
440+
switch (type) {
441+
case 1:
442+
data[key] = u8str(le[3][0].data);
443+
break;
444+
case 8:
445+
{
446+
var rt = M[parse_Reference(le[9][0].data)][0];
447+
var rtp = parse_shallow(rt.data);
448+
var rtpref = M[parse_Reference(rtp[1][0].data)][0];
449+
var mtype = varint_to_i32(rtpref.meta[1][0].data);
450+
if (mtype != 2001)
451+
throw new Error("2000 unexpected reference to ".concat(mtype));
452+
var tswpsa = parse_shallow(rtpref.data);
453+
data[key] = tswpsa[3].map(function(x) {
454+
return u8str(x.data);
455+
}).join("");
456+
}
457+
break;
458+
}
415459
});
416460
return data;
417461
}
@@ -444,6 +488,7 @@ var NUMBERS = (function() {
444488
}, []);
445489
}
446490
function parse_TST_TableModelArchive(M, root, ws) {
491+
var _a;
447492
var pb = parse_shallow(root.data);
448493
var range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
449494
range.e.r = (varint_to_i32(pb[6][0].data) >>> 0) - 1;
@@ -456,6 +501,7 @@ var NUMBERS = (function() {
456501
{
457502
var store = parse_shallow(pb[4][0].data);
458503
var sst = parse_TST_TableDataList(M, M[parse_Reference(store[4][0].data)][0]);
504+
var rsst = ((_a = store[17]) == null ? void 0 : _a[0]) ? parse_TST_TableDataList(M, M[parse_Reference(store[17][0].data)][0]) : [];
459505
{
460506
var tile = parse_shallow(store[3][0].data);
461507
var tiles = [];
@@ -471,12 +517,9 @@ var NUMBERS = (function() {
471517
tile2.ref.forEach(function(row, R) {
472518
row.forEach(function(buf, C) {
473519
var addr = encode_cell({ r: R, c: C });
474-
var res = parse(buf);
475-
if (res) {
520+
var res = parse(buf, sst, rsst);
521+
if (res)
476522
ws[addr] = res;
477-
if (res.t == "s" && typeof res.v == "number")
478-
res.v = sst[res.v];
479-
}
480523
});
481524
});
482525
});
@@ -496,18 +539,16 @@ var NUMBERS = (function() {
496539
function parse_sheetroot(M, root) {
497540
var _a;
498541
var pb = parse_shallow(root.data);
499-
var out = [{ "!ref": "A1" }, ((_a = pb[1]) == null ? void 0 : _a[0]) ? u8str(pb[1][0].data) : ""];
542+
var out = {
543+
name: ((_a = pb[1]) == null ? void 0 : _a[0]) ? u8str(pb[1][0].data) : "",
544+
sheets: []
545+
};
500546
var shapeoffs = mappa(pb[2], parse_Reference);
501-
var seen = false;
502547
shapeoffs.forEach(function(off) {
503548
M[off].forEach(function(m) {
504549
var mtype = varint_to_i32(m.meta[1][0].data);
505-
if (mtype == 6e3) {
506-
if (seen)
507-
return;
508-
out[0] = parse_TST_TableInfoArchive(M, m);
509-
seen = true;
510-
}
550+
if (mtype == 6e3)
551+
out.sheets.push(parse_TST_TableInfoArchive(M, m));
511552
});
512553
});
513554
return out;
@@ -521,7 +562,9 @@ var NUMBERS = (function() {
521562
var mtype = varint_to_i32(m.meta[1][0].data);
522563
if (mtype == 2) {
523564
var root2 = parse_sheetroot(M, m);
524-
book_append_sheet(out, root2[0], root2[1]);
565+
root2.sheets.forEach(function(sheet) {
566+
book_append_sheet(out, sheet, root2.name);
567+
});
525568
}
526569
});
527570
});

bits/88_write.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,26 @@
1+
function write_obj_str(factory/*:WriteObjStrFactory*/) {
2+
return function write_str(wb/*:Workbook*/, o/*:WriteOpts*/)/*:string*/ {
3+
var idx = 0;
4+
if(o.sheet) {
5+
if(typeof o.sheet == "number") idx = o.sheet;
6+
else idx = wb.SheetNames.indexOf(o.sheet);
7+
if(!wb.SheetNames[idx]) throw new Error("Sheet not found: " + o.sheet + " : " + (typeof o.sheet));
8+
}
9+
return factory.from_sheet(wb.Sheets[wb.SheetNames[idx]], o, wb);
10+
};
11+
}
12+
13+
var write_htm_str = write_obj_str(HTML_);
14+
var write_csv_str = write_obj_str({from_sheet:sheet_to_csv});
15+
var write_slk_str = write_obj_str(typeof SYLK !== "undefined" ? SYLK : {});
16+
var write_dif_str = write_obj_str(typeof DIF !== "undefined" ? DIF : {});
17+
var write_prn_str = write_obj_str(typeof PRN !== "undefined" ? PRN : {});
18+
var write_rtf_str = write_obj_str(typeof RTF !== "undefined" ? RTF : {});
19+
var write_txt_str = write_obj_str({from_sheet:sheet_to_txt});
20+
var write_dbf_buf = write_obj_str(typeof DBF !== "undefined" ? DBF : {});
21+
var write_eth_str = write_obj_str(typeof ETH !== "undefined" ? ETH : {});
22+
var write_wk1_buf = write_obj_str(typeof WK_ !== "undefined" ? {from_sheet:WK_.sheet_to_wk1} : {});
23+
124
function write_cfb_ctr(cfb/*:CFBContainer*/, o/*:WriteOpts*/)/*:any*/ {
225
switch(o.type) {
326
case "base64": case "binary": break;

dist/xlsx.core.min.js

Lines changed: 17 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/xlsx.core.min.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)