forked from sheetjs/sheetjs
version bump 0.10.4: privacy filter
This commit is contained in:
parent
aff7b95272
commit
81ab4f9b1f
18
README.md
18
README.md
@ -49,7 +49,7 @@ enhancements, additional features by request, and dedicated support.
|
||||
## Table of Contents
|
||||
|
||||
<details>
|
||||
<summary>Expand to show Table of Contents</summary>
|
||||
<summary><b>Expand to show Table of Contents</b></summary>
|
||||
|
||||
<!-- toc -->
|
||||
|
||||
@ -405,7 +405,12 @@ input_dom_element.addEventListener('change', handleFile, false);
|
||||
- <http://oss.sheetjs.com/js-xlsx/> HTML5 File API / Base64 Text / Web Workers
|
||||
|
||||
Note that older versions of IE do not support HTML5 File API, so the base64 mode
|
||||
is used for testing. On OSX you can get the base64 encoding with:
|
||||
is used for testing.
|
||||
|
||||
<details>
|
||||
<summary><b>Get base64 encoding on OSX / Windows</b> (click to show)</summary>
|
||||
|
||||
On OSX you can get the base64 encoding with:
|
||||
|
||||
```bash
|
||||
$ <target_file base64 | pbcopy
|
||||
@ -419,6 +424,8 @@ On Windows XP and up you can get the base64 encoding using `certutil`:
|
||||
|
||||
(note: You have to open the file and remove the header and footer lines)
|
||||
|
||||
</details>
|
||||
|
||||
- <http://oss.sheetjs.com/js-xlsx/ajax.html> XMLHttpRequest
|
||||
|
||||
### Note on Streaming Read
|
||||
@ -953,9 +960,10 @@ may not enforce this constraint.
|
||||
|
||||
`wb.Workbook.WBProps` holds other workbook properties:
|
||||
|
||||
| Key | Description |
|
||||
|:-----------|:----------------------------------------------------|
|
||||
| `date1904` | epoch: 0/false for 1900 system, 1/true for 1904 |
|
||||
| Key | Description |
|
||||
|:----------------|:----------------------------------------------------|
|
||||
| `date1904` | epoch: 0/false for 1900 system, 1/true for 1904 |
|
||||
| `filterPrivacy` | Warn or strip personally identifying info on save |
|
||||
|
||||
### Document Features
|
||||
|
||||
|
@ -1 +1 @@
|
||||
XLSX.version = '0.10.3';
|
||||
XLSX.version = '0.10.4';
|
||||
|
@ -166,7 +166,17 @@ function write_wb_xml(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:string*/ {
|
||||
/* fileVersion */
|
||||
/* fileSharing */
|
||||
|
||||
o[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb), codeName:"ThisWorkbook"}));
|
||||
var workbookPr/*:WBProps*/ = ({codeName:"ThisWorkbook"}/*:any*/);
|
||||
if(wb.Workbook && wb.Workbook.WBProps) {
|
||||
if(wb.Workbook.WBProps.codeName) workbookPr.codeName = wb.Workbook.WBProps.codeName;
|
||||
WBPropsDef.forEach(function(x) {
|
||||
/*:: if(!wb.Workbook || !wb.Workbook.WBProps) throw "unreachable"; */
|
||||
if((wb.Workbook.WBProps[x[0]]/*:any*/) == null) return;
|
||||
if((wb.Workbook.WBProps[x[0]]/*:any*/) == x[1]) return;
|
||||
workbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]/*:any*/);
|
||||
});
|
||||
}
|
||||
o[o.length] = (writextag('workbookPr', null, workbookPr));
|
||||
|
||||
/* workbookProtection */
|
||||
/* bookViews */
|
||||
|
@ -17,8 +17,8 @@ function write_BrtBundleSh(data, o) {
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.4.807 BrtWbProp */
|
||||
function parse_BrtWbProp(data, length) {
|
||||
var o = {};
|
||||
function parse_BrtWbProp(data, length)/*:WBProps*/ {
|
||||
var o/*:WBProps*/ = ({}/*:any*/);
|
||||
var flags = data.read_shift(4);
|
||||
o.defaultThemeVersion = data.read_shift(4);
|
||||
var strName = (length > 8) ? parse_XLWideString(data) : "";
|
||||
@ -40,9 +40,14 @@ function parse_BrtWbProp(data, length) {
|
||||
o.updateLinks = ["userSet", "never", "always"][(flags >> 8) & 0x03];
|
||||
return o;
|
||||
}
|
||||
function write_BrtWbProp(data, o) {
|
||||
function write_BrtWbProp(data/*:?WBProps*/, o) {
|
||||
if(!o) o = new_buf(72);
|
||||
o.write_shift(4, 0);
|
||||
var flags = 0;
|
||||
if(data) {
|
||||
/* TODO: mirror parse_BrtWbProp fields */
|
||||
if(data.filterPrivacy) flags |= 0x08;
|
||||
}
|
||||
o.write_shift(4, flags);
|
||||
o.write_shift(4, 0);
|
||||
write_XLSBCodeName("ThisWorkbook", o);
|
||||
return o.slice(0, o.l);
|
||||
@ -246,7 +251,7 @@ function write_wb_bin(wb, opts) {
|
||||
write_record(ba, "BrtBeginBook");
|
||||
write_record(ba, "BrtFileVersion", write_BrtFileVersion());
|
||||
/* [[BrtFileSharingIso] BrtFileSharing] */
|
||||
write_record(ba, "BrtWbProp", write_BrtWbProp());
|
||||
write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));
|
||||
/* [ACABSPATH] */
|
||||
/* [[BrtBookProtectionIso] BrtBookProtection] */
|
||||
write_BOOKVIEWS(ba, wb, opts);
|
||||
|
30
dist/xlsx.core.min.js
vendored
30
dist/xlsx.core.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.core.min.map
vendored
2
dist/xlsx.core.min.map
vendored
File diff suppressed because one or more lines are too long
30
dist/xlsx.full.min.js
vendored
30
dist/xlsx.full.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.full.min.map
vendored
2
dist/xlsx.full.min.map
vendored
File diff suppressed because one or more lines are too long
232
dist/xlsx.js
vendored
232
dist/xlsx.js
vendored
@ -6,7 +6,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.10.3';
|
||||
XLSX.version = '0.10.4';
|
||||
var current_codepage = 1200;
|
||||
/*global cptable:true */
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
@ -967,6 +967,33 @@ var XLMLFormatMap/*{[string]:string}*/ = ({
|
||||
"On/Off": '"Yes";"Yes";"No";@'
|
||||
});
|
||||
|
||||
/* dateNF parse TODO: move to SSF */
|
||||
var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;
|
||||
function dateNF_regex(dateNF) {
|
||||
var fmt = typeof dateNF == "number" ? SSF._table[dateNF] : dateNF;
|
||||
fmt = fmt.replace(dateNFregex, "(\\d+)");
|
||||
return new RegExp("^" + fmt + "$");
|
||||
}
|
||||
function dateNF_fix(str, dateNF, match) {
|
||||
var Y = -1, m = -1, d = -1, H = -1, M = -1, S = -1;
|
||||
(dateNF.match(dateNFregex)||[]).forEach(function(n, i) {
|
||||
var v = parseInt(match[i+1], 10);
|
||||
switch(n.toLowerCase().charAt(0)) {
|
||||
case 'y': Y = v; break; case 'd': d = v; break;
|
||||
case 'h': H = v; break; case 's': S = v; break;
|
||||
case 'm': if(H >= 0) M = v; else m = v; break;
|
||||
}
|
||||
});
|
||||
if(S >= 0 && M == -1 && m >= 0) { M = m; m = -1; }
|
||||
var datestr = (("" + (Y>=0?Y: new Date().getFullYear())).slice(-4) + "-" + ("00" + (m>=1?m:1)).slice(-2) + "-" + ("00" + (d>=1?d:1)).slice(-2));
|
||||
if(datestr.length == 7) datestr = "0" + datestr;
|
||||
if(datestr.length == 8) datestr = "20" + datestr;
|
||||
var timestr = (("00" + (H>=0?H:0)).slice(-2) + ":" + ("00" + (M>=0?M:0)).slice(-2) + ":" + ("00" + (S>=0?S:0)).slice(-2));
|
||||
if(H == -1 && M == -1 && S == -1) return datestr;
|
||||
if(Y == -1 && m == -1 && d == -1) return timestr;
|
||||
return datestr + "T" + timestr;
|
||||
}
|
||||
|
||||
var DO_NOT_EXPORT_CFB = true;
|
||||
/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
||||
/* vim: set ts=2: */
|
||||
@ -1385,22 +1412,17 @@ function evert_arr(obj) {
|
||||
return o;
|
||||
}
|
||||
|
||||
var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
|
||||
var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
|
||||
function datenum(v, date1904) {
|
||||
var epoch = v.getTime();
|
||||
if(date1904) epoch += 1462*24*60*60*1000;
|
||||
return (epoch + 2209161600000) / (24 * 60 * 60 * 1000);
|
||||
return (epoch - dnthresh) / (24 * 60 * 60 * 1000);
|
||||
}
|
||||
function numdate(v) {
|
||||
var date = SSF.parse_date_code(v);
|
||||
var val = new Date();
|
||||
if(date == null) throw new Error("Bad Date Code: " + v);
|
||||
val.setUTCDate(date.d);
|
||||
val.setUTCMonth(date.m-1);
|
||||
val.setUTCFullYear(date.y);
|
||||
val.setUTCHours(date.H);
|
||||
val.setUTCMinutes(date.M);
|
||||
val.setUTCSeconds(date.S);
|
||||
return val;
|
||||
var out = new Date();
|
||||
out.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);
|
||||
return out;
|
||||
}
|
||||
|
||||
/* ISO 8601 Duration */
|
||||
@ -1433,9 +1455,14 @@ function parse_isodur(s) {
|
||||
var good_pd_date = new Date('2017-02-19T19:06:09.000Z');
|
||||
if(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');
|
||||
var good_pd = good_pd_date.getFullYear() == 2017;
|
||||
function parseDate(str) {
|
||||
/* parses aa date as a local date */
|
||||
function parseDate(str, fixdate) {
|
||||
var d = new Date(str);
|
||||
if(good_pd) return d;
|
||||
if(good_pd) {
|
||||
if(fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);
|
||||
else if(fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);
|
||||
return d;
|
||||
}
|
||||
if(str instanceof Date) return str;
|
||||
if(good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {
|
||||
var s = d.getFullYear();
|
||||
@ -1443,7 +1470,7 @@ function parseDate(str) {
|
||||
d.setFullYear(d.getFullYear() + 100); return d;
|
||||
}
|
||||
var n = str.match(/\d+/g)||["2017","2","19","0","0","0"];
|
||||
return new Date(Date.UTC(+n[0], +n[1] - 1, +n[2], (+n[3]||0), (+n[4]||0), (+n[5]||0)));
|
||||
return new Date(+n[0], +n[1] - 1, +n[2], (+n[3]||0), (+n[4]||0), (+n[5]||0));
|
||||
}
|
||||
|
||||
function cc2str(arr) {
|
||||
@ -1630,7 +1657,7 @@ var xlml_unfixstr = (function() {
|
||||
|
||||
function parsexmlbool(value, tag) {
|
||||
switch(value) {
|
||||
case '1': case 'true': case 'TRUE': return true;
|
||||
case 1: case true: case '1': case 'true': case 'TRUE': return true;
|
||||
/* case '0': case 'false': case 'FALSE':*/
|
||||
default: return false;
|
||||
}
|
||||
@ -5605,6 +5632,7 @@ var PRN = (function() {
|
||||
var R = 0, C = 0, v = 0;
|
||||
var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0;
|
||||
str = str.replace(/\r\n/mg, "\n");
|
||||
var _re = o.dateNF != null ? dateNF_regex(o.dateNF) : null;
|
||||
function finish_cell() {
|
||||
var s = str.slice(start, end);
|
||||
var cell = ({});
|
||||
@ -5612,10 +5640,12 @@ var PRN = (function() {
|
||||
else if(s == "TRUE") { cell.t = 'b'; cell.v = true; }
|
||||
else if(s == "FALSE") { cell.t = 'b'; cell.v = false; }
|
||||
else if(!isNaN(v = +s)) { cell.t = 'n'; cell.w = s; cell.v = v; }
|
||||
else if(!isNaN(fuzzydate(s).getDate())) {
|
||||
else if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {
|
||||
cell.z = o.dateNF || SSF._table[14];
|
||||
if(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s); }
|
||||
else { cell.t = 'n'; cell.v = datenum(parseDate(s)); }
|
||||
var k = 0;
|
||||
if(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }
|
||||
if(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }
|
||||
else { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }
|
||||
cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);
|
||||
} else {
|
||||
cell.t = 's';
|
||||
@ -10784,7 +10814,7 @@ function write_ws_xml_cell(cell, ref, ws, opts, idx, wb) {
|
||||
case 'n': vv = ''+cell.v; break;
|
||||
case 'e': vv = BErr[cell.v]; break;
|
||||
case 'd':
|
||||
if(opts.cellDates) vv = parseDate(cell.v).toISOString();
|
||||
if(opts.cellDates) vv = parseDate(cell.v, -1).toISOString();
|
||||
else {
|
||||
cell.t = 'n';
|
||||
vv = ''+(cell.v = datenum(parseDate(cell.v)));
|
||||
@ -10937,7 +10967,8 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) {
|
||||
break;
|
||||
case 'b': p.v = parsexmlbool(p.v); break;
|
||||
case 'd':
|
||||
if(!opts.cellDates) { p.v = datenum(parseDate(p.v)); p.t = 'n'; }
|
||||
if(opts.cellDates) p.v = parseDate(p.v, 1);
|
||||
else { p.v = datenum(parseDate(p.v, 1)); p.t = 'n'; }
|
||||
break;
|
||||
/* error string in .w, number in .v */
|
||||
case 'e':
|
||||
@ -10954,9 +10985,7 @@ return function parse_ws_xml_data(sdata, s, opts, guess, themes, styles) {
|
||||
}
|
||||
}
|
||||
safe_format(p, fmtid, fillid, opts, themes, styles);
|
||||
if(opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) {
|
||||
var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(Date.UTC(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u)); }
|
||||
}
|
||||
if(opts.cellDates && do_format && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }
|
||||
if(dense) {
|
||||
var _r = decode_cell(tag.r);
|
||||
if(!s[_r.r]) s[_r.r] = [];
|
||||
@ -11572,7 +11601,7 @@ function parse_ws_bin(data, _opts, rels, wb, themes, styles) {
|
||||
if(refguess.e.r < row.r) refguess.e.r = row.r;
|
||||
if(refguess.e.c < C) refguess.e.c = C;
|
||||
if(opts.cellDates && cf && p.t == 'n' && SSF.is_date(SSF._table[cf.ifmt])) {
|
||||
var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(Date.UTC(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u)); }
|
||||
var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
|
||||
}
|
||||
break;
|
||||
|
||||
@ -12054,38 +12083,37 @@ function write_cs_bin(idx, opts, wb, rels) {
|
||||
}
|
||||
/* 18.2.28 (CT_WorkbookProtection) Defaults */
|
||||
var WBPropsDef = [
|
||||
['allowRefreshQuery', '0'],
|
||||
['autoCompressPictures', '1'],
|
||||
['backupFile', '0'],
|
||||
['checkCompatibility', '0'],
|
||||
['codeName', ''],
|
||||
['date1904', '0'],
|
||||
['dateCompatibility', '1'],
|
||||
//['defaultThemeVersion', '0'],
|
||||
['filterPrivacy', '0'],
|
||||
['hidePivotFieldList', '0'],
|
||||
['promptedSolutions', '0'],
|
||||
['publishItems', '0'],
|
||||
['refreshAllConnections', false],
|
||||
['saveExternalLinkValues', '1'],
|
||||
['showBorderUnselectedTables', '1'],
|
||||
['showInkAnnotation', '1'],
|
||||
['showObjects', 'all'],
|
||||
['showPivotChartFilter', '0']
|
||||
//['updateLinks', 'userSet']
|
||||
['allowRefreshQuery', false, "bool"],
|
||||
['autoCompressPictures', true, "bool"],
|
||||
['backupFile', false, "bool"],
|
||||
['checkCompatibility', false, "bool"],
|
||||
['codeName', ''],
|
||||
['date1904', false, "bool"],
|
||||
['defaultThemeVersion', 0, "int"],
|
||||
['filterPrivacy', false, "bool"],
|
||||
['hidePivotFieldList', false, "bool"],
|
||||
['promptedSolutions', false, "bool"],
|
||||
['publishItems', false, "bool"],
|
||||
['refreshAllConnections', false, "bool"],
|
||||
['saveExternalLinkValues', true, "bool"],
|
||||
['showBorderUnselectedTables', true, "bool"],
|
||||
['showInkAnnotation', true, "bool"],
|
||||
['showObjects', 'all'],
|
||||
['showPivotChartFilter', false, "bool"],
|
||||
['updateLinks', 'userSet']
|
||||
];
|
||||
|
||||
/* 18.2.30 (CT_BookView) Defaults */
|
||||
var WBViewDef = [
|
||||
['activeTab', '0'],
|
||||
['autoFilterDateGrouping', '1'],
|
||||
['firstSheet', '0'],
|
||||
['minimized', '0'],
|
||||
['showHorizontalScroll', '1'],
|
||||
['showSheetTabs', '1'],
|
||||
['showVerticalScroll', '1'],
|
||||
['tabRatio', '600'],
|
||||
['visibility', 'visible']
|
||||
['activeTab', 0, "int"],
|
||||
['autoFilterDateGrouping', true, "bool"],
|
||||
['firstSheet', 0, "int"],
|
||||
['minimized', false, "bool"],
|
||||
['showHorizontalScroll', true, "bool"],
|
||||
['showSheetTabs', true, "bool"],
|
||||
['showVerticalScroll', true, "bool"],
|
||||
['tabRatio', 600, "int"],
|
||||
['visibility', 'visible']
|
||||
//window{Height,Width}, {x,y}Window
|
||||
];
|
||||
|
||||
@ -12134,12 +12162,20 @@ function push_defaults_array(target, defaults) {
|
||||
for(var j = 0; j != target.length; ++j) { var w = target[j];
|
||||
for(var i=0; i != defaults.length; ++i) { var z = defaults[i];
|
||||
if(w[z[0]] == null) w[z[0]] = z[1];
|
||||
else switch(z[2]) {
|
||||
case "bool": if(typeof w[z[0]] == "string") w[z[0]] = parsexmlbool(w[z[0]], z[0]); break;
|
||||
case "int": if(typeof w[z[0]] == "string") w[z[0]] = parseInt(w[z[0]], 10); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
function push_defaults(target, defaults) {
|
||||
for(var i = 0; i != defaults.length; ++i) { var z = defaults[i];
|
||||
if(target[z[0]] == null) target[z[0]] = z[1];
|
||||
else switch(z[2]) {
|
||||
case "bool": if(typeof target[z[0]] == "string") target[z[0]] = parsexmlbool(target[z[0]], z[0]); break;
|
||||
case "int": if(typeof target[z[0]] == "string") target[z[0]] = parseInt(target[z[0]], 10); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -12153,6 +12189,13 @@ function parse_wb_defaults(wb) {
|
||||
_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904, 'date1904');
|
||||
}
|
||||
|
||||
function safe1904(wb) {
|
||||
/* TODO: store date1904 somewhere else */
|
||||
if(!wb.Workbook) return "false";
|
||||
if(!wb.Workbook.WBProps) return "false";
|
||||
return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false";
|
||||
}
|
||||
|
||||
var badchars = "][*?\/\\".split("");
|
||||
function check_ws_name(n, safe) {
|
||||
if(n.length > 31) { if(safe) return false; throw new Error("Sheet names cannot exceed 31 chars"); }
|
||||
@ -12203,8 +12246,17 @@ function parse_wb_xml(data, opts) {
|
||||
case '<fileSharing': case '<fileSharing/>': break;
|
||||
|
||||
/* 18.2.28 workbookPr CT_WorkbookPr ? */
|
||||
case '<workbookPr': delete y[0]; wb.WBProps = y; break;
|
||||
case '<workbookPr/>': delete y[0]; wb.WBProps = y; break;
|
||||
case '<workbookPr':
|
||||
case '<workbookPr/>':
|
||||
WBPropsDef.forEach(function(w) {
|
||||
if(y[w[0]] == null) return;
|
||||
switch(w[2]) {
|
||||
case "bool": wb.WBProps[w[0]] = parsexmlbool(y[w[0]], w[0]); break;
|
||||
case "int": wb.WBProps[w[0]] = parseInt(y[w[0]], 10); break;
|
||||
default: wb.WBProps[w[0]] = y[w[0]];
|
||||
}
|
||||
});
|
||||
break;
|
||||
case '</workbookPr>': break;
|
||||
|
||||
/* 18.2.29 workbookProtection CT_WorkbookProtection ? */
|
||||
@ -12325,14 +12377,6 @@ var WB_XML_ROOT = writextag('workbook', null, {
|
||||
'xmlns:r': XMLNS.r
|
||||
});
|
||||
|
||||
function safe1904(wb) {
|
||||
/* TODO: store date1904 somewhere else */
|
||||
if(!wb.Workbook) return "false";
|
||||
if(!wb.Workbook.WBProps) return "false";
|
||||
// $FlowIgnore
|
||||
return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false";
|
||||
}
|
||||
|
||||
function write_wb_xml(wb, opts) {
|
||||
var o = [XML_HEADER];
|
||||
o[o.length] = WB_XML_ROOT;
|
||||
@ -12342,7 +12386,16 @@ function write_wb_xml(wb, opts) {
|
||||
/* fileVersion */
|
||||
/* fileSharing */
|
||||
|
||||
o[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb), codeName:"ThisWorkbook"}));
|
||||
var workbookPr = ({codeName:"ThisWorkbook"});
|
||||
if(wb.Workbook && wb.Workbook.WBProps) {
|
||||
if(wb.Workbook.WBProps.codeName) workbookPr.codeName = wb.Workbook.WBProps.codeName;
|
||||
WBPropsDef.forEach(function(x) {
|
||||
if((wb.Workbook.WBProps[x[0]]) == null) return;
|
||||
if((wb.Workbook.WBProps[x[0]]) == x[1]) return;
|
||||
workbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]);
|
||||
});
|
||||
}
|
||||
o[o.length] = (writextag('workbookPr', null, workbookPr));
|
||||
|
||||
/* workbookProtection */
|
||||
/* bookViews */
|
||||
@ -12410,14 +12463,36 @@ function write_BrtBundleSh(data, o) {
|
||||
|
||||
/* [MS-XLSB] 2.4.807 BrtWbProp */
|
||||
function parse_BrtWbProp(data, length) {
|
||||
data.read_shift(4);
|
||||
var dwThemeVersion = data.read_shift(4);
|
||||
var o = ({});
|
||||
var flags = data.read_shift(4);
|
||||
o.defaultThemeVersion = data.read_shift(4);
|
||||
var strName = (length > 8) ? parse_XLWideString(data) : "";
|
||||
return [dwThemeVersion, strName];
|
||||
if(strName.length > 0) o.codeName = strName;
|
||||
o.autoCompressPictures = !!(flags & 0x10000);
|
||||
o.backupFile = !!(flags & 0x40);
|
||||
o.checkCompatibility = !!(flags & 0x1000);
|
||||
o.date1904 = !!(flags & 0x01);
|
||||
o.filterPrivacy = !!(flags & 0x08);
|
||||
o.hidePivotFieldList = !!(flags & 0x400);
|
||||
o.promptedSolutions = !!(flags & 0x10);
|
||||
o.publishItems = !!(flags & 0x800);
|
||||
o.refreshAllConnections = !!(flags & 0x40000);
|
||||
o.saveExternalLinkValues = !!(flags & 0x80);
|
||||
o.showBorderUnselectedTables = !!(flags & 0x04);
|
||||
o.showInkAnnotation = !!(flags & 0x20);
|
||||
o.showObjects = ["all", "placeholders", "none"][(flags >> 13) & 0x03];
|
||||
o.showPivotChartFilter = !!(flags & 0x8000);
|
||||
o.updateLinks = ["userSet", "never", "always"][(flags >> 8) & 0x03];
|
||||
return o;
|
||||
}
|
||||
function write_BrtWbProp(data, o) {
|
||||
if(!o) o = new_buf(72);
|
||||
o.write_shift(4, 0);
|
||||
var flags = 0;
|
||||
if(data) {
|
||||
/* TODO: mirror parse_BrtWbProp fields */
|
||||
if(data.filterPrivacy) flags |= 0x08;
|
||||
}
|
||||
o.write_shift(4, flags);
|
||||
o.write_shift(4, 0);
|
||||
write_XLSBCodeName("ThisWorkbook", o);
|
||||
return o.slice(0, o.l);
|
||||
@ -12477,6 +12552,9 @@ function parse_wb_bin(data, opts) {
|
||||
break;
|
||||
case 0x040C: /* 'BrtNameExt' */ break;
|
||||
|
||||
case 0x0099: /* 'BrtWbProp' */
|
||||
wb.WBProps = val; break;
|
||||
|
||||
/* case 'BrtModelTimeGroupingCalcCol' */
|
||||
/* case 'BrtRevisionPtr' */
|
||||
/* case 'BrtUid' */
|
||||
@ -12508,7 +12586,6 @@ function parse_wb_bin(data, opts) {
|
||||
case 0x0822: /* 'BrtTimelineCachePivotCacheID' */
|
||||
case 0x018D: /* 'BrtUserBookView' */
|
||||
case 0x009A: /* 'BrtWbFactoid' */
|
||||
case 0x0099: /* 'BrtWbProp' */
|
||||
case 0x045D: /* 'BrtWbProp14' */
|
||||
case 0x0229: /* 'BrtWebOpt' */
|
||||
case 0x082B: /* 'BrtWorkBookPr15' */
|
||||
@ -12619,7 +12696,7 @@ function write_wb_bin(wb, opts) {
|
||||
write_record(ba, "BrtBeginBook");
|
||||
write_record(ba, "BrtFileVersion", write_BrtFileVersion());
|
||||
/* [[BrtFileSharingIso] BrtFileSharing] */
|
||||
write_record(ba, "BrtWbProp", write_BrtWbProp());
|
||||
write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));
|
||||
/* [ACABSPATH] */
|
||||
/* [[BrtBookProtectionIso] BrtBookProtection] */
|
||||
write_BOOKVIEWS(ba, wb, opts);
|
||||
@ -12793,7 +12870,7 @@ function safe_format_xlml(cell, nf, o) {
|
||||
var z = XLMLFormatMap[nf]||nf||"General";
|
||||
if(o.cellNF) cell.z = z;
|
||||
if(o.cellDates && cell.t == 'n' && SSF.is_date(z)) {
|
||||
var _d = SSF.parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(Date.UTC(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u)); }
|
||||
var _d = SSF.parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
|
||||
}
|
||||
} catch(e) { if(o.WTF) throw e; }
|
||||
}
|
||||
@ -12910,7 +12987,7 @@ function parse_xlml_xml(d, opts) {
|
||||
var cstys = [], csty, seencol = false;
|
||||
var arrayf = [];
|
||||
var rowinfo = [], rowobj = {};
|
||||
var Workbook = { Sheets:[] }, wsprops = {};
|
||||
var Workbook = ({ Sheets:[], WBProps:{date1904:false} }), wsprops = {};
|
||||
xlmlregex.lastIndex = 0;
|
||||
str = str.replace(/<!--([^\u2603]*?)-->/mg,"");
|
||||
while((Rn = xlmlregex.exec(str))) switch(Rn[3]) {
|
||||
@ -13190,6 +13267,9 @@ Workbook.Names.push(_DefinedName);
|
||||
|
||||
/* ExcelWorkbook */
|
||||
case 'ExcelWorkbook': switch(Rn[3]) {
|
||||
case 'Date1904':
|
||||
Workbook.WBProps.date1904 = true;
|
||||
break;
|
||||
case 'WindowHeight': break;
|
||||
case 'WindowWidth': break;
|
||||
case 'WindowTopX': break;
|
||||
@ -13208,7 +13288,6 @@ Workbook.Names.push(_DefinedName);
|
||||
case 'Dll': break;
|
||||
case 'AcceptLabelsInFormulas': break;
|
||||
case 'DoNotSaveLinkValues': break;
|
||||
case 'Date1904': break;
|
||||
case 'Iteration': break;
|
||||
case 'MaxIterations': break;
|
||||
case 'MaxChange': break;
|
||||
@ -13868,7 +13947,7 @@ function safe_format_xf(p, opts, date1904) {
|
||||
}
|
||||
else p.w = SSF.format(fmtid,p.v, {date1904:!!date1904});
|
||||
if(opts.cellDates && fmtid && p.t == 'n' && SSF.is_date(SSF._table[fmtid])) {
|
||||
var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(Date.UTC(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u)); }
|
||||
var _d = SSF.parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }
|
||||
}
|
||||
} catch(e) { if(opts.WTF) throw e; }
|
||||
}
|
||||
@ -13898,7 +13977,7 @@ function parse_workbook(blob, options) {
|
||||
var cell_valid = true;
|
||||
var XFs = []; /* XF records */
|
||||
var palette = [];
|
||||
var Workbook = ({ Sheets:[] }), wsprops = {};
|
||||
var Workbook = ({ Sheets:[], WBProps:{date1904:false} }), wsprops = {};
|
||||
var get_rgb = function getrgb(icv) {
|
||||
if(icv < 8) return XLSIcv[icv];
|
||||
if(icv < 64) return palette[icv-8] || XLSIcv[icv];
|
||||
@ -14010,7 +14089,8 @@ function parse_workbook(blob, options) {
|
||||
/* nested switch statements to workaround V8 128 limit */
|
||||
switch(Rn) {
|
||||
/* Workbook Options */
|
||||
case 'Date1904': wb.opts.Date1904 = val; break;
|
||||
case 'Date1904':
|
||||
wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
|
||||
case 'WriteProtect': wb.opts.WriteProtect = true; break;
|
||||
case 'FilePass':
|
||||
if(!opts.enc) blob.l = 0;
|
||||
|
28
dist/xlsx.min.js
vendored
28
dist/xlsx.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/xlsx.min.map
vendored
2
dist/xlsx.min.map
vendored
File diff suppressed because one or more lines are too long
@ -1,7 +1,7 @@
|
||||
## Table of Contents
|
||||
|
||||
<details>
|
||||
<summary>Expand to show Table of Contents</summary>
|
||||
<summary><b>Expand to show Table of Contents</b></summary>
|
||||
|
||||
<!-- toc -->
|
||||
</details>
|
||||
|
@ -149,7 +149,12 @@ input_dom_element.addEventListener('change', handleFile, false);
|
||||
- <http://oss.sheetjs.com/js-xlsx/> HTML5 File API / Base64 Text / Web Workers
|
||||
|
||||
Note that older versions of IE do not support HTML5 File API, so the base64 mode
|
||||
is used for testing. On OSX you can get the base64 encoding with:
|
||||
is used for testing.
|
||||
|
||||
<details>
|
||||
<summary><b>Get base64 encoding on OSX / Windows</b> (click to show)</summary>
|
||||
|
||||
On OSX you can get the base64 encoding with:
|
||||
|
||||
```bash
|
||||
$ <target_file base64 | pbcopy
|
||||
@ -163,5 +168,7 @@ On Windows XP and up you can get the base64 encoding using `certutil`:
|
||||
|
||||
(note: You have to open the file and remove the header and footer lines)
|
||||
|
||||
</details>
|
||||
|
||||
- <http://oss.sheetjs.com/js-xlsx/ajax.html> XMLHttpRequest
|
||||
|
||||
|
@ -26,7 +26,8 @@ may not enforce this constraint.
|
||||
|
||||
`wb.Workbook.WBProps` holds other workbook properties:
|
||||
|
||||
| Key | Description |
|
||||
|:-----------|:----------------------------------------------------|
|
||||
| `date1904` | epoch: 0/false for 1900 system, 1/true for 1904 |
|
||||
| Key | Description |
|
||||
|:----------------|:----------------------------------------------------|
|
||||
| `date1904` | epoch: 0/false for 1900 system, 1/true for 1904 |
|
||||
| `filterPrivacy` | Warn or strip personally identifying info on save |
|
||||
|
||||
|
17
misc/flow.js
17
misc/flow.js
@ -30,7 +30,24 @@ type WBWBProps = {
|
||||
};
|
||||
|
||||
type WBProps = {
|
||||
allowRefreshQuery?: boolean;
|
||||
autoCompressPictures?: boolean;
|
||||
backupFile?: boolean;
|
||||
checkCompatibility?: boolean;
|
||||
codeName?: string;
|
||||
date1904?: boolean;
|
||||
defaultThemeVersion?: number;
|
||||
filterPrivacy?: boolean;
|
||||
hidePivotFieldList?: boolean;
|
||||
promptedSolutions?: boolean;
|
||||
publishItems?: boolean;
|
||||
refreshAllConnections?: boolean;
|
||||
saveExternalLinkValues?: boolean;
|
||||
showBorderUnselectedTables?: boolean;
|
||||
showInkAnnotation?: boolean;
|
||||
showObjects?: string;
|
||||
showPivotChartFilter?: boolean;
|
||||
updateLinks?: string;
|
||||
};
|
||||
|
||||
type WBWSProp = {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "xlsx",
|
||||
"version": "0.10.3",
|
||||
"version": "0.10.4",
|
||||
"author": "sheetjs",
|
||||
"description": "Excel (XLSB/XLSX/XLS/XML) ODS and other spreadsheet format (CSV/DIF/DBF/SYLK) parser and writer",
|
||||
"keywords": [ "excel", "xls", "xlsx", "xlsb", "xlsm", "ods", "csv", "dbf", "dif", "sylk", "office", "spreadsheet" ],
|
||||
|
@ -139,7 +139,7 @@ function parsetest(x, wb, full, ext) {
|
||||
if(fs.existsSync(sname)) it('should have the right sheet names', function() {
|
||||
var file = fs.readFileSync(sname, 'utf-8').replace(/\r/g,"");
|
||||
var names = wb.SheetNames.map(fixsheetname).join("\n") + "\n";
|
||||
if(file.length) assert.equal(names, file);
|
||||
if(file.length && !x.match(/artifacts/)) assert.equal(names, file);
|
||||
});
|
||||
});
|
||||
describe(x + ext + ' should generate CSV', function() {
|
||||
@ -826,8 +826,9 @@ describe('parse features', function() {
|
||||
var wb2 = X.read(fs.readFileSync(paths.fstxlsb), opts);
|
||||
var wb3 = X.read(fs.readFileSync(paths.fstxls), opts);
|
||||
var wb4 = X.read(fs.readFileSync(paths.fstxml), opts);
|
||||
var wb5 = X.read(fs.readFileSync(paths.fstods), opts);
|
||||
/* TODO */
|
||||
[wb1, wb2 /*, wb3, wb4 */].forEach(function(wb) {
|
||||
[wb1, wb2 /*, wb3, wb4, wb5 */].forEach(function(wb) {
|
||||
assert.equal(wb.Sheets.Text["!fullref"],"A1:F49");
|
||||
assert.equal(wb.Sheets.Text["!ref"],"A1:F10");
|
||||
});
|
||||
@ -1496,10 +1497,12 @@ describe('invalid files', function() {
|
||||
});
|
||||
});
|
||||
|
||||
var basedate = new Date(1899, 11, 30, 0, 0, 0); // 2209161600000
|
||||
var dnthresh = basedate.getTime() + (new Date().getTimezoneOffset() - basedate.getTimezoneOffset()) * 60000;
|
||||
function datenum(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ {
|
||||
var epoch = v.getTime();
|
||||
if(date1904) epoch += 1462*24*60*60*1000;
|
||||
return (epoch + 2209161600000) / (24 * 60 * 60 * 1000);
|
||||
return (epoch - dnthresh) / (24 * 60 * 60 * 1000);
|
||||
}
|
||||
var good_pd_date = new Date('2017-02-19T19:06:09.000Z');
|
||||
if(isNaN(good_pd_date.getFullYear())) good_pd_date = new Date('2/19/17');
|
||||
@ -1695,7 +1698,17 @@ describe('csv', function() {
|
||||
var cell = get_cell(X.read(b, opts).Sheets.Sheet1, "C3");
|
||||
assert.equal(cell.w, '14-02-19');
|
||||
});
|
||||
|
||||
it('should interpret dateNF', function() {
|
||||
var bb = "1,2,3,\nTRUE,FALSE,,sheetjs\nfoo,bar,2/3/14,0.3\n,,,\nbaz,,qux,\n";
|
||||
var opts = {type:"binary", cellDates:true, dateNF:'m/d/yy'};
|
||||
var cell = get_cell(X.read(bb, opts).Sheets.Sheet1, "C3");
|
||||
assert.equal(cell.v.getMonth(), 1);
|
||||
assert.equal(cell.w, "2/3/14");
|
||||
opts = {type:"binary", cellDates:true, dateNF:'d/m/yy'};
|
||||
cell = get_cell(X.read(bb, opts).Sheets.Sheet1, "C3");
|
||||
assert.equal(cell.v.getMonth(), 2);
|
||||
assert.equal(cell.w, "2/3/14");
|
||||
});
|
||||
});
|
||||
describe('output', function(){
|
||||
var data, ws;
|
||||
|
@ -33,9 +33,9 @@ var wsrows = [
|
||||
console.log("Sheet Name: " + ws_name);
|
||||
console.log("Data: ");
|
||||
var i = 0;
|
||||
for(i = 0; i != data.length; ++i) console.log(data[i]);
|
||||
for(i = 0; i !== data.length; ++i) console.log(data[i]);
|
||||
console.log("Columns :");
|
||||
for(i = 0; i != wscols.length; ++i) console.log(wscols[i]);
|
||||
for(i = 0; i !== wscols.length; ++i) console.log(wscols[i]);
|
||||
|
||||
/* require XLSX */
|
||||
if(typeof XLSX === "undefined") { try { XLSX = require('./'); } catch(e) { XLSX = require('../'); } }
|
||||
@ -143,39 +143,39 @@ XLSX.utils.cell_add_comment(ws['A4'], "I'm a little comment, short and stout!\n\
|
||||
ws['!protect'] = {
|
||||
password:"password",
|
||||
/* enable formatting rows and columns */
|
||||
formatRows:0,
|
||||
formatColumns:0,
|
||||
formatRows:false,
|
||||
formatColumns:false,
|
||||
/* disable editing objects and scenarios */
|
||||
objects:1,
|
||||
scenarios:1
|
||||
objects:true,
|
||||
scenarios:true
|
||||
};
|
||||
|
||||
/* TEST: Workbook Properties */
|
||||
if(!wb.Workbook) wb.Workbook = {Sheets:[], WBProps:{}};
|
||||
if(!wb.Workbook.WBProps) wb.Workbook.WBProps = {};
|
||||
wb.Workbook.WBProps.filterPrivacy = true;
|
||||
|
||||
console.log("Worksheet Model:");
|
||||
console.log(ws);
|
||||
|
||||
[
|
||||
var filenames = [
|
||||
['sheetjs.xlsx', {bookSST:true}],
|
||||
'sheetjs.xlsm',
|
||||
'sheetjs.xlsb',
|
||||
['sheetjs.xlsm'],
|
||||
['sheetjs.xlsb'],
|
||||
['sheetjs.xls', {bookType:'biff2'}],
|
||||
['sheetjs.xml.xls', {bookType:'xlml'}],
|
||||
'sheetjs.ods',
|
||||
'sheetjs.fods',
|
||||
'sheetjs.slk',
|
||||
'sheetjs.csv',
|
||||
'sheetjs.txt',
|
||||
'sheetjs.prn',
|
||||
'sheetjs.dif'
|
||||
].forEach(function(r) {
|
||||
if(typeof r === 'string') {
|
||||
/* write file */
|
||||
XLSX.writeFile(wb, r);
|
||||
/* test by reading back files */
|
||||
XLSX.readFile(r);
|
||||
} else {
|
||||
['sheetjs.ods'],
|
||||
['sheetjs.fods'],
|
||||
['sheetjs.slk'],
|
||||
['sheetjs.csv'],
|
||||
['sheetjs.txt'],
|
||||
['sheetjs.prn'],
|
||||
['sheetjs.dif']
|
||||
];
|
||||
|
||||
filenames.forEach(function(r) {
|
||||
/* write file */
|
||||
XLSX.writeFile(wb, r[0], r[1]);
|
||||
/* test by reading back files */
|
||||
XLSX.readFile(r[0]);
|
||||
}
|
||||
});
|
||||
|
3
types/index.d.ts
vendored
3
types/index.d.ts
vendored
@ -246,6 +246,9 @@ export interface WBProps {
|
||||
export interface WorkbookProperties {
|
||||
/** Worksheet Epoch (1904 if true, 1900 if false) */
|
||||
date1904?: boolean;
|
||||
|
||||
/** Warn or strip personally identifying info on save */
|
||||
filterPrivacy?: boolean;
|
||||
}
|
||||
|
||||
export interface ColInfo {
|
||||
|
@ -127,6 +127,11 @@ ws['!protect'] = {
|
||||
scenarios:true
|
||||
};
|
||||
|
||||
/* TEST: Workbook Properties */
|
||||
if(!wb.Workbook) wb.Workbook = {Sheets:[], WBProps:{}};
|
||||
if(!wb.Workbook.WBProps) wb.Workbook.WBProps = {};
|
||||
wb.Workbook.WBProps.filterPrivacy = true;
|
||||
|
||||
console.log("Worksheet Model:");
|
||||
console.log(ws);
|
||||
|
||||
|
29
xlsx.flow.js
29
xlsx.flow.js
@ -6,7 +6,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.10.3';
|
||||
XLSX.version = '0.10.4';
|
||||
var current_codepage = 1200;
|
||||
/*:: declare var cptable:any; */
|
||||
/*global cptable:true */
|
||||
@ -12453,7 +12453,17 @@ function write_wb_xml(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:string*/ {
|
||||
/* fileVersion */
|
||||
/* fileSharing */
|
||||
|
||||
o[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb), codeName:"ThisWorkbook"}));
|
||||
var workbookPr/*:WBProps*/ = ({codeName:"ThisWorkbook"}/*:any*/);
|
||||
if(wb.Workbook && wb.Workbook.WBProps) {
|
||||
if(wb.Workbook.WBProps.codeName) workbookPr.codeName = wb.Workbook.WBProps.codeName;
|
||||
WBPropsDef.forEach(function(x) {
|
||||
/*:: if(!wb.Workbook || !wb.Workbook.WBProps) throw "unreachable"; */
|
||||
if((wb.Workbook.WBProps[x[0]]/*:any*/) == null) return;
|
||||
if((wb.Workbook.WBProps[x[0]]/*:any*/) == x[1]) return;
|
||||
workbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]/*:any*/);
|
||||
});
|
||||
}
|
||||
o[o.length] = (writextag('workbookPr', null, workbookPr));
|
||||
|
||||
/* workbookProtection */
|
||||
/* bookViews */
|
||||
@ -12520,8 +12530,8 @@ function write_BrtBundleSh(data, o) {
|
||||
}
|
||||
|
||||
/* [MS-XLSB] 2.4.807 BrtWbProp */
|
||||
function parse_BrtWbProp(data, length) {
|
||||
var o = {};
|
||||
function parse_BrtWbProp(data, length)/*:WBProps*/ {
|
||||
var o/*:WBProps*/ = ({}/*:any*/);
|
||||
var flags = data.read_shift(4);
|
||||
o.defaultThemeVersion = data.read_shift(4);
|
||||
var strName = (length > 8) ? parse_XLWideString(data) : "";
|
||||
@ -12543,9 +12553,14 @@ function parse_BrtWbProp(data, length) {
|
||||
o.updateLinks = ["userSet", "never", "always"][(flags >> 8) & 0x03];
|
||||
return o;
|
||||
}
|
||||
function write_BrtWbProp(data, o) {
|
||||
function write_BrtWbProp(data/*:?WBProps*/, o) {
|
||||
if(!o) o = new_buf(72);
|
||||
o.write_shift(4, 0);
|
||||
var flags = 0;
|
||||
if(data) {
|
||||
/* TODO: mirror parse_BrtWbProp fields */
|
||||
if(data.filterPrivacy) flags |= 0x08;
|
||||
}
|
||||
o.write_shift(4, flags);
|
||||
o.write_shift(4, 0);
|
||||
write_XLSBCodeName("ThisWorkbook", o);
|
||||
return o.slice(0, o.l);
|
||||
@ -12749,7 +12764,7 @@ function write_wb_bin(wb, opts) {
|
||||
write_record(ba, "BrtBeginBook");
|
||||
write_record(ba, "BrtFileVersion", write_BrtFileVersion());
|
||||
/* [[BrtFileSharingIso] BrtFileSharing] */
|
||||
write_record(ba, "BrtWbProp", write_BrtWbProp());
|
||||
write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));
|
||||
/* [ACABSPATH] */
|
||||
/* [[BrtBookProtectionIso] BrtBookProtection] */
|
||||
write_BOOKVIEWS(ba, wb, opts);
|
||||
|
24
xlsx.js
24
xlsx.js
@ -6,7 +6,7 @@
|
||||
/*global global, exports, module, require:false, process:false, Buffer:false */
|
||||
var XLSX = {};
|
||||
(function make_xlsx(XLSX){
|
||||
XLSX.version = '0.10.3';
|
||||
XLSX.version = '0.10.4';
|
||||
var current_codepage = 1200;
|
||||
/*global cptable:true */
|
||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
|
||||
@ -12386,7 +12386,16 @@ function write_wb_xml(wb, opts) {
|
||||
/* fileVersion */
|
||||
/* fileSharing */
|
||||
|
||||
o[o.length] = (writextag('workbookPr', null, {date1904:safe1904(wb), codeName:"ThisWorkbook"}));
|
||||
var workbookPr = ({codeName:"ThisWorkbook"});
|
||||
if(wb.Workbook && wb.Workbook.WBProps) {
|
||||
if(wb.Workbook.WBProps.codeName) workbookPr.codeName = wb.Workbook.WBProps.codeName;
|
||||
WBPropsDef.forEach(function(x) {
|
||||
if((wb.Workbook.WBProps[x[0]]) == null) return;
|
||||
if((wb.Workbook.WBProps[x[0]]) == x[1]) return;
|
||||
workbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]);
|
||||
});
|
||||
}
|
||||
o[o.length] = (writextag('workbookPr', null, workbookPr));
|
||||
|
||||
/* workbookProtection */
|
||||
/* bookViews */
|
||||
@ -12454,7 +12463,7 @@ function write_BrtBundleSh(data, o) {
|
||||
|
||||
/* [MS-XLSB] 2.4.807 BrtWbProp */
|
||||
function parse_BrtWbProp(data, length) {
|
||||
var o = {};
|
||||
var o = ({});
|
||||
var flags = data.read_shift(4);
|
||||
o.defaultThemeVersion = data.read_shift(4);
|
||||
var strName = (length > 8) ? parse_XLWideString(data) : "";
|
||||
@ -12478,7 +12487,12 @@ function parse_BrtWbProp(data, length) {
|
||||
}
|
||||
function write_BrtWbProp(data, o) {
|
||||
if(!o) o = new_buf(72);
|
||||
o.write_shift(4, 0);
|
||||
var flags = 0;
|
||||
if(data) {
|
||||
/* TODO: mirror parse_BrtWbProp fields */
|
||||
if(data.filterPrivacy) flags |= 0x08;
|
||||
}
|
||||
o.write_shift(4, flags);
|
||||
o.write_shift(4, 0);
|
||||
write_XLSBCodeName("ThisWorkbook", o);
|
||||
return o.slice(0, o.l);
|
||||
@ -12682,7 +12696,7 @@ function write_wb_bin(wb, opts) {
|
||||
write_record(ba, "BrtBeginBook");
|
||||
write_record(ba, "BrtFileVersion", write_BrtFileVersion());
|
||||
/* [[BrtFileSharingIso] BrtFileSharing] */
|
||||
write_record(ba, "BrtWbProp", write_BrtWbProp());
|
||||
write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));
|
||||
/* [ACABSPATH] */
|
||||
/* [[BrtBookProtectionIso] BrtBookProtection] */
|
||||
write_BOOKVIEWS(ba, wb, opts);
|
||||
|
Loading…
Reference in New Issue
Block a user