diff --git a/bits/01_version.js b/bits/01_version.js index 25baadd7cfa730f4ababaf1a9379eeceba565158..96f44a96c1becab41dfad0ec10e393c476bc6cf0 100644 --- a/bits/01_version.js +++ b/bits/01_version.js @@ -1 +1 @@ -XLSX.version = '0.13.0'; +XLSX.version = '0.13.1'; diff --git a/bits/66_wscommon.js b/bits/66_wscommon.js index f6e1944f628493af655c0cfb5252d67cc213754b..38b2db5867efa1ae14318241d94fa9d014d3286f 100644 --- a/bits/66_wscommon.js +++ b/bits/66_wscommon.js @@ -6,9 +6,32 @@ RELS.WS = [ "http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet" ]; -function get_sst_id(sst/*:SST*/, str/*:string*/)/*:number*/ { - for(var i = 0, len = sst.length; i < len; ++i) if(sst[i].t === str) { sst.Count ++; return i; } - sst[len] = {t:str}; sst.Count ++; sst.Unique ++; return len; +/*global Map */ +var browser_has_Map = typeof Map !== 'undefined'; + +function get_sst_id(sst/*:SST*/, str/*:string*/, rev)/*:number*/ { + var i = 0, len = sst.length; + if(rev) { + if(browser_has_Map ? rev.has(str) : rev.hasOwnProperty(str)) { + var revarr = browser_has_Map ? rev.get(str) : rev[str]; + for(; i < revarr.length; ++i) { + if(sst[revarr[i]].t === str) { sst.Count ++; return revarr[i]; } + } + } + } else for(; i < len; ++i) { + if(sst[i].t === str) { sst.Count ++; return i; } + } + sst[len] = ({t:str}/*:any*/); sst.Count ++; sst.Unique ++; + if(rev) { + if(browser_has_Map) { + if(!rev.has(str)) rev.set(str, []); + rev.get(str).push(len); + } else { + if(!rev.hasOwnProperty(str)) rev[str] = []; + rev[str].push(len); + } + } + return len; } function col_obj_w(C/*:number*/, col) { diff --git a/bits/67_wsxml.js b/bits/67_wsxml.js index a7abd1ec37be89ba528b6446dbba3c3584c5939f..af781dd79720600ae53e2a11910fffdcda0d0f7f 100644 --- a/bits/67_wsxml.js +++ b/bits/67_wsxml.js @@ -245,7 +245,7 @@ function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts/*::, idx, wb*/)/*:string case 'e': o.t = "e"; break; default: if(cell.v == null) { delete cell.t; break; } if(opts.bookSST) { - v = writetag('v', ''+get_sst_id(opts.Strings, cell.v)); + v = writetag('v', ''+get_sst_id(opts.Strings, cell.v, opts.revStrings)); o.t = "s"; break; } o.t = "str"; break; diff --git a/bits/68_wsbin.js b/bits/68_wsbin.js index 55932b37c2e748e0a85eebd4fb8b9a489b143308..8e5f9e05138c53099c84e26139b30d120da90e0f 100644 --- a/bits/68_wsbin.js +++ b/bits/68_wsbin.js @@ -684,7 +684,7 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num switch(cell.t) { case 's': case 'str': if(opts.bookSST) { - vv = get_sst_id(opts.Strings, (cell.v/*:any*/)); + vv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings); o.t = "s"; o.v = vv; write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o)); } else { diff --git a/bits/79_html.js b/bits/79_html.js index 4e7c2be8817f28e891285223b4788dc4874f1124..a552b4af87ff3ebb875d55e0b8048c082c3d3cf2 100644 --- a/bits/79_html.js +++ b/bits/79_html.js @@ -26,7 +26,7 @@ var HTML_ = (function() { while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1); var tag = parsexmltag(cell.slice(0, cell.indexOf(">"))); CS = tag.colspan ? +tag.colspan : 1; - if((RS = +tag.rowspan)>0 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}}); + if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}}); var _t/*:string*/ = tag.t || ""; /* TODO: generate stub cells */ if(!m.length) { C += CS; continue; } diff --git a/bits/85_parsezip.js b/bits/85_parsezip.js index 6a4346d10dfbce94993c07f39a80f330fdccf52b..ba69abdf906b4d07678a678cf76a02936347cf3c 100644 --- a/bits/85_parsezip.js +++ b/bits/85_parsezip.js @@ -17,22 +17,22 @@ function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/ try { sheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path); var data = getzipdata(zip, path); + var _ws; switch(stype) { - case 'sheet': sheets[sheet]=parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; - case 'chart': - var cs = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); - sheets[sheet] = cs; - if(!cs || !cs['!chart']) break; - var dfile = resolve_path(cs['!chart'].Target, path); + case 'sheet': _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; + case 'chart': _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); + if(!_ws || !_ws['!chart']) break; + var dfile = resolve_path(_ws['!chart'].Target, path); var drelsp = get_rels_path(dfile); var draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile)); var chartp = resolve_path(draw, dfile); var crelsp = get_rels_path(chartp); - cs = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, cs); + _ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws); break; - case 'macro': sheets[sheet]=parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; - case 'dialog': sheets[sheet]=parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; + case 'macro': _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; + case 'dialog': _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; } + sheets[sheet] = _ws; } catch(e) { if(opts.WTF) throw e; } } @@ -181,8 +181,10 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ { /* [MS-OFFCRYPTO] 2.1.1 */ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ { var opts = _opts || {}; - var f = '/!DataSpaces/Version'; - var data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); + var f = 'Workbook', data = CFB.find(cfb, f); + try { + f = '/!DataSpaces/Version'; + data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); /*var version = */parse_DataSpaceVersionInfo(data.content); /* 2.3.4.1 */ @@ -203,6 +205,7 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ { f = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); /*var hdr = */parse_Primary(data.content); + } catch(e) {} f = '/EncryptionInfo'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); diff --git a/bits/86_writezip.js b/bits/86_writezip.js index 2489c34cf9c75d47f84a2da3a683558db934aee5..5ebcafbdbfafa96d52afa1066094dc5f2d98cb19 100644 --- a/bits/86_writezip.js +++ b/bits/86_writezip.js @@ -12,6 +12,8 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { } opts.rels = {}; opts.wbrels = {}; opts.Strings = /*::((*/[]/*:: :any):SST)*/; opts.Strings.Count = 0; opts.Strings.Unique = 0; + if(browser_has_Map) opts.revStrings = new Map(); + else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; } var wbext = opts.bookType == "xlsb" ? "bin" : "xml"; var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1; var ct = new_ct(); @@ -52,11 +54,6 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { add_rels(opts.rels, 4, f, RELS.CUST_PROPS); } - f = "xl/workbook." + wbext; - zip.file(f, write_wb(wb, f, opts)); - ct.workbooks.push(f); - add_rels(opts.rels, 1, f, RELS.WB); - for(rId=1;rId <= wb.SheetNames.length; ++rId) { var wsrels = {'!id':{}}; var ws = wb.Sheets[wb.SheetNames[rId-1]]; @@ -101,6 +98,11 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST); } + f = "xl/workbook." + wbext; + zip.file(f, write_wb(wb, f, opts)); + ct.workbooks.push(f); + add_rels(opts.rels, 1, f, RELS.WB); + /* TODO: something more intelligent with themes */ f = "xl/theme/theme1.xml"; diff --git a/bits/88_write.js b/bits/88_write.js index 6c7101aa236c7d28f8f80658c8af668e1839ed5b..9ca563b7d67dbcfae8c1b5d91cca5a291e6de338 100644 --- a/bits/88_write.js +++ b/bits/88_write.js @@ -1,9 +1,23 @@ +function write_cfb_ctr(cfb/*:CFBContainer*/, o/*:WriteOpts*/)/*:any*/ { + switch(o.type) { + case "base64": case "binary": break; + case "buffer": case "array": o.type = ""; break; + case "file": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : ""})); + case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files"); + default: throw new Error("Unrecognized type " + o.type); + } + return CFB.write(cfb, o); +} + +/*global encrypt_agile */ +/*:: declare var encrypt_agile:any; */ function write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { var o = opts||{}; var z = write_zip(wb, o); var oopts = {}; if(o.compression) oopts.compression = 'DEFLATE'; - switch(o.type) { + if(o.password) oopts.type = has_buf ? "nodebuffer" : "string"; + else switch(o.type) { case "base64": oopts.type = "base64"; break; case "binary": oopts.type = "string"; break; case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files"); @@ -11,22 +25,16 @@ function write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { case "file": oopts.type = has_buf ? "nodebuffer" : "string"; break; default: throw new Error("Unrecognized type " + o.type); } - if(o.type === "file") return write_dl(o.file, z.generate(oopts)); var out = z.generate(oopts); + if(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); + if(o.type === "file") return write_dl(o.file, out); return o.type == "string" ? utf8read(out) : out; } function write_cfb_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { var o = opts||{}; var cfb/*:CFBContainer*/ = write_xlscfb(wb, o); - switch(o.type) { - case "base64": case "binary": break; - case "buffer": case "array": o.type = ""; break; - case "file": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : ""})); - case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files"); - default: throw new Error("Unrecognized type " + o.type); - } - return CFB.write(cfb, o); + return write_cfb_ctr(cfb, o); } function write_string_type(out/*:string*/, opts/*:WriteOpts*/, bom/*:?string*/)/*:any*/ { diff --git a/demos/requirejs/app.js b/demos/requirejs/app.js index 6de5ce5669c2ffe8e766cb0bd23678605c2d9f90..fcbc8dc5fa7d49be2cf8a4362746d488bc74a8f7 100644 --- a/demos/requirejs/app.js +++ b/demos/requirejs/app.js @@ -1,7 +1,7 @@ /* xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */ -require(["xlsx"], function(XLSX) { -console.log(XLSX); -var X = XLSX; +require(["xlsx"], function(XLSX2) { +console.log(XLSX2); +var X = XLSX2; var global_wb; diff --git a/dist/xlsx.core.min.js b/dist/xlsx.core.min.js index ce632aeafa38a17cfa04b7bfe05fbfb5ac00db47..4e39dbc85cd54f602ddd61166d4b8f6145066d42 100644 Binary files a/dist/xlsx.core.min.js and b/dist/xlsx.core.min.js differ diff --git a/dist/xlsx.core.min.map b/dist/xlsx.core.min.map index 19c0ddcada9e8e1b27a47148778cc3eba62128d1..8a8b54e79def4c11bade33e42234bacd102bcf80 100644 Binary files a/dist/xlsx.core.min.map and b/dist/xlsx.core.min.map differ diff --git a/dist/xlsx.extendscript.js b/dist/xlsx.extendscript.js index 49b9cde4beea946c7cecdbc0511df3e5ecfd362e..b3fd4f62bd72b43a68ef5da2017ed3a6d7009651 100644 Binary files a/dist/xlsx.extendscript.js and b/dist/xlsx.extendscript.js differ diff --git a/dist/xlsx.full.min.js b/dist/xlsx.full.min.js index 8dcdfdf0b9176b3d08d7b2e86ef6544706d1a8e1..610d9fd063b7eab3a426e833cce52597a4d4ca28 100644 Binary files a/dist/xlsx.full.min.js and b/dist/xlsx.full.min.js differ diff --git a/dist/xlsx.full.min.map b/dist/xlsx.full.min.map index 0b2e91f070039233115702f2cafec197f77dc337..0d792dfe60ba1b342daf4bf8d5fc60b19d86898d 100644 Binary files a/dist/xlsx.full.min.map and b/dist/xlsx.full.min.map differ diff --git a/dist/xlsx.js b/dist/xlsx.js index ab754aa31f7c271b2d88beb0b3e48397c8e4de2b..c948928288d8e412725724f73bbcfe84c249ecdd 100644 Binary files a/dist/xlsx.js and b/dist/xlsx.js differ diff --git a/dist/xlsx.min.js b/dist/xlsx.min.js index d662efc45b5404e9b5eb46c0747b91690176fa80..98674dde423e575543b46eff918fc14b1eb2268c 100644 Binary files a/dist/xlsx.min.js and b/dist/xlsx.min.js differ diff --git a/dist/xlsx.min.map b/dist/xlsx.min.map index 68355a40c17dbf98ec961f2265c934e619077e94..840104aeda9bcab4efb492a91af9d62ffb1fe021 100644 Binary files a/dist/xlsx.min.map and b/dist/xlsx.min.map differ diff --git a/package.json b/package.json index 4d41cb3c508cb4e9a9e0048c95f5828f9e85947d..b8a583ea8cd3c21e74706f3b0a2d95406fcc6303 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xlsx", - "version": "0.13.0", + "version": "0.13.1", "author": "sheetjs", "description": "SheetJS Spreadsheet data parser and writer", "keywords": [ diff --git a/xlsx.flow.js b/xlsx.flow.js index d17f6dffa5b54986b3994b8905ca2c1b2d019ec9..ea91abf2a1b908f93b0dcbea7a9a5c68ebdd22ae 100644 --- a/xlsx.flow.js +++ b/xlsx.flow.js @@ -4,7 +4,7 @@ /*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */ var XLSX = {}; function make_xlsx_lib(XLSX){ -XLSX.version = '0.13.0'; +XLSX.version = '0.13.1'; var current_codepage = 1200, current_ansi = 1252; /*:: declare var cptable:any; */ /*global cptable:true, window */ @@ -12012,9 +12012,32 @@ RELS.WS = [ "http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet" ]; -function get_sst_id(sst/*:SST*/, str/*:string*/)/*:number*/ { - for(var i = 0, len = sst.length; i < len; ++i) if(sst[i].t === str) { sst.Count ++; return i; } - sst[len] = {t:str}; sst.Count ++; sst.Unique ++; return len; +/*global Map */ +var browser_has_Map = typeof Map !== 'undefined'; + +function get_sst_id(sst/*:SST*/, str/*:string*/, rev)/*:number*/ { + var i = 0, len = sst.length; + if(rev) { + if(browser_has_Map ? rev.has(str) : rev.hasOwnProperty(str)) { + var revarr = browser_has_Map ? rev.get(str) : rev[str]; + for(; i < revarr.length; ++i) { + if(sst[revarr[i]].t === str) { sst.Count ++; return revarr[i]; } + } + } + } else for(; i < len; ++i) { + if(sst[i].t === str) { sst.Count ++; return i; } + } + sst[len] = ({t:str}/*:any*/); sst.Count ++; sst.Unique ++; + if(rev) { + if(browser_has_Map) { + if(!rev.has(str)) rev.set(str, []); + rev.get(str).push(len); + } else { + if(!rev.hasOwnProperty(str)) rev[str] = []; + rev[str].push(len); + } + } + return len; } function col_obj_w(C/*:number*/, col) { @@ -12359,7 +12382,7 @@ function write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts/*::, idx, wb*/)/*:string case 'e': o.t = "e"; break; default: if(cell.v == null) { delete cell.t; break; } if(opts.bookSST) { - v = writetag('v', ''+get_sst_id(opts.Strings, cell.v)); + v = writetag('v', ''+get_sst_id(opts.Strings, cell.v, opts.revStrings)); o.t = "s"; break; } o.t = "str"; break; @@ -13384,7 +13407,7 @@ function write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:num switch(cell.t) { case 's': case 'str': if(opts.bookSST) { - vv = get_sst_id(opts.Strings, (cell.v/*:any*/)); + vv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings); o.t = "s"; o.v = vv; write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o)); } else { @@ -18188,7 +18211,7 @@ var HTML_ = (function() { while(m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1) m = m.slice(cc+1); var tag = parsexmltag(cell.slice(0, cell.indexOf(">"))); CS = tag.colspan ? +tag.colspan : 1; - if((RS = +tag.rowspan)>0 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}}); + if((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}}); var _t/*:string*/ = tag.t || ""; /* TODO: generate stub cells */ if(!m.length) { C += CS; continue; } @@ -19220,22 +19243,22 @@ function safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/ try { sheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path); var data = getzipdata(zip, path); + var _ws; switch(stype) { - case 'sheet': sheets[sheet]=parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; - case 'chart': - var cs = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); - sheets[sheet] = cs; - if(!cs || !cs['!chart']) break; - var dfile = resolve_path(cs['!chart'].Target, path); + case 'sheet': _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; + case 'chart': _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); + if(!_ws || !_ws['!chart']) break; + var dfile = resolve_path(_ws['!chart'].Target, path); var drelsp = get_rels_path(dfile); var draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile)); var chartp = resolve_path(draw, dfile); var crelsp = get_rels_path(chartp); - cs = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, cs); + _ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws); break; - case 'macro': sheets[sheet]=parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; - case 'dialog': sheets[sheet]=parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; + case 'macro': _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; + case 'dialog': _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break; } + sheets[sheet] = _ws; } catch(e) { if(opts.WTF) throw e; } } @@ -19384,8 +19407,10 @@ function parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ { /* [MS-OFFCRYPTO] 2.1.1 */ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ { var opts = _opts || {}; - var f = '/!DataSpaces/Version'; - var data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); + var f = 'Workbook', data = CFB.find(cfb, f); + try { + f = '/!DataSpaces/Version'; + data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); /*var version = */parse_DataSpaceVersionInfo(data.content); /* 2.3.4.1 */ @@ -19406,6 +19431,7 @@ function parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ { f = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); /*var hdr = */parse_Primary(data.content); + } catch(e) {} f = '/EncryptionInfo'; data = CFB.find(cfb, f); if(!data || !data.content) throw new Error("ECMA-376 Encrypted file missing " + f); @@ -19438,6 +19464,8 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { } opts.rels = {}; opts.wbrels = {}; opts.Strings = /*::((*/[]/*:: :any):SST)*/; opts.Strings.Count = 0; opts.Strings.Unique = 0; + if(browser_has_Map) opts.revStrings = new Map(); + else { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; } var wbext = opts.bookType == "xlsb" ? "bin" : "xml"; var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1; var ct = new_ct(); @@ -19478,11 +19506,6 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { add_rels(opts.rels, 4, f, RELS.CUST_PROPS); } - f = "xl/workbook." + wbext; - zip.file(f, write_wb(wb, f, opts)); - ct.workbooks.push(f); - add_rels(opts.rels, 1, f, RELS.WB); - for(rId=1;rId <= wb.SheetNames.length; ++rId) { var wsrels = {'!id':{}}; var ws = wb.Sheets[wb.SheetNames[rId-1]]; @@ -19527,6 +19550,11 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ { add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST); } + f = "xl/workbook." + wbext; + zip.file(f, write_wb(wb, f, opts)); + ct.workbooks.push(f); + add_rels(opts.rels, 1, f, RELS.WB); + /* TODO: something more intelligent with themes */ f = "xl/theme/theme1.xml"; @@ -19664,12 +19692,26 @@ function readFileSync(filename/*:string*/, opts/*:?ParseOpts*/)/*:Workbook*/ { var o = opts||{}; o.type = 'file'; return readSync(filename, o); } +function write_cfb_ctr(cfb/*:CFBContainer*/, o/*:WriteOpts*/)/*:any*/ { + switch(o.type) { + case "base64": case "binary": break; + case "buffer": case "array": o.type = ""; break; + case "file": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : ""})); + case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files"); + default: throw new Error("Unrecognized type " + o.type); + } + return CFB.write(cfb, o); +} + +/*global encrypt_agile */ +/*:: declare var encrypt_agile:any; */ function write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { var o = opts||{}; var z = write_zip(wb, o); var oopts = {}; if(o.compression) oopts.compression = 'DEFLATE'; - switch(o.type) { + if(o.password) oopts.type = has_buf ? "nodebuffer" : "string"; + else switch(o.type) { case "base64": oopts.type = "base64"; break; case "binary": oopts.type = "string"; break; case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files"); @@ -19677,22 +19719,16 @@ function write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { case "file": oopts.type = has_buf ? "nodebuffer" : "string"; break; default: throw new Error("Unrecognized type " + o.type); } - if(o.type === "file") return write_dl(o.file, z.generate(oopts)); var out = z.generate(oopts); + if(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); + if(o.type === "file") return write_dl(o.file, out); return o.type == "string" ? utf8read(out) : out; } function write_cfb_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ { var o = opts||{}; var cfb/*:CFBContainer*/ = write_xlscfb(wb, o); - switch(o.type) { - case "base64": case "binary": break; - case "buffer": case "array": o.type = ""; break; - case "file": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : ""})); - case "string": throw new Error("'string' output type invalid for '" + o.bookType + "' files"); - default: throw new Error("Unrecognized type " + o.type); - } - return CFB.write(cfb, o); + return write_cfb_ctr(cfb, o); } function write_string_type(out/*:string*/, opts/*:WriteOpts*/, bom/*:?string*/)/*:any*/ { diff --git a/xlsx.js b/xlsx.js index 7d09be98755898cad8d7418267b1270f434abafc..007ac31d45b336e7a78e735fd9d7fff69bcd4f1a 100644 Binary files a/xlsx.js and b/xlsx.js differ