var attregexg2=/([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;var attregex2=/([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;function xlml_parsexmltag(tag, skip_root) { var words = tag.split(/\s+/); var z = ([]); if(!skip_root) z[0] = words[0]; if(words.length === 1) return z; var m = tag.match(attregexg2), y, j, w, i; if(m) for(i = 0; i != m.length; ++i) { y = m[i].match(attregex2); if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); else { if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); else w = y[1].slice(j+1); z[w] = y[2].slice(1,y[2].length-1); } } return z;}function xlml_parsexmltagobj(tag) { var words = tag.split(/\s+/); var z = {}; if(words.length === 1) return z; var m = tag.match(attregexg2), y, j, w, i; if(m) for(i = 0; i != m.length; ++i) { y = m[i].match(attregex2); if((j=y[1].indexOf(":")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1); else { if(y[1].slice(0,6) === "xmlns:") w = "xmlns"+y[1].slice(6); else w = y[1].slice(j+1); z[w] = y[2].slice(1,y[2].length-1); } } return z;}
function xlml_format(format, value) { var fmt = XLMLFormatMap[format] || unescapexml(format); if(fmt === "General") return SSF._general(value); return SSF.format(fmt, value);}
function xlml_set_custprop(Custprops, key, cp, val) { var oval = val; switch((cp[0].match(/dt:dt="([\w.]+)"/)||["",""])[1]) { case "boolean": oval = parsexmlbool(val); break; case "i2": case "int": oval = parseInt(val, 10); break; case "r4": case "float": oval = parseFloat(val); break; case "date": case "dateTime.tz": oval = parseDate(val); break; case "i8": case "string": case "fixed": case "uuid": case "bin.base64": break; default: throw new Error("bad custprop:" + cp[0]); } Custprops[unescapexml(key)] = oval;}
function safe_format_xlml(cell, nf, o) { if(cell.t === 'z') return; if(!o || o.cellText !== false) try { if(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; } else if(nf === "General") { if(cell.t === 'n') { if((cell.v|0) === cell.v) cell.w = SSF._general_int(cell.v); else cell.w = SSF._general_num(cell.v); } else cell.w = SSF._general(cell.v); } else cell.w = xlml_format(nf||"General", cell.v); } catch(e) { if(o.WTF) throw e; } try { 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(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); } } } catch(e) { if(o.WTF) throw e; }}
function process_style_xlml(styles, stag, opts) { if(opts.cellStyles) { if(stag.Interior) { var I = stag.Interior; if(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern; } } styles[stag.ID] = stag;}
function parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o) { var nf = "General", sid = cell.StyleID, S = {}; o = o || {}; var interiors = []; var i = 0; if(sid === undefined && row) sid = row.StyleID; if(sid === undefined && csty) sid = csty.StyleID; while(styles[sid] !== undefined) { if(styles[sid].nf) nf = styles[sid].nf; if(styles[sid].Interior) interiors.push(styles[sid].Interior); if(!styles[sid].Parent) break; sid = styles[sid].Parent; } switch(data.Type) { case 'Boolean': cell.t = 'b'; cell.v = parsexmlbool(xml); break; case 'String': cell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml)); cell.v = (xml.indexOf("<") > -1 ? unescapexml(ss||xml).replace(/<.*?>/g, "") : cell.r); break; case 'DateTime': if(xml.slice(-1) != "Z") xml += "Z"; cell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); if(cell.v !== cell.v) cell.v = unescapexml(xml); else if(cell.v<60) cell.v = cell.v -1; if(!nf || nf == "General") nf = "yyyy-mm-dd"; case 'Number': if(cell.v === undefined) cell.v=+xml; if(!cell.t) cell.t = 'n'; break; case 'Error': cell.t = 'e'; cell.v = RBErr[xml]; if(o.cellText !== false) cell.w = xml; break; default: if(xml == "" && ss == "") { cell.t = 'z'; } else { cell.t = 's'; cell.v = xlml_fixstr(ss||xml); } break; } safe_format_xlml(cell, nf, o); if(o.cellFormula !== false) { if(cell.Formula) { var fstr = unescapexml(cell.Formula); if(fstr.charCodeAt(0) == 61 ) fstr = fstr.slice(1); cell.f = rc_to_a1(fstr, base); delete cell.Formula; if(cell.ArrayRange == "RC") cell.F = rc_to_a1("RC:RC", base); else if(cell.ArrayRange) { cell.F = rc_to_a1(cell.ArrayRange, base); arrayf.push([safe_decode_range(cell.F), cell.F]); } } else { for(i = 0; i < arrayf.length; ++i) if(base.r >= arrayf[i][0].s.r && base.r <= arrayf[i][0].e.r) if(base.c >= arrayf[i][0].s.c && base.c <= arrayf[i][0].e.c) cell.F = arrayf[i][1]; } } if(o.cellStyles) { interiors.forEach(function(x) { if(!S.patternType && x.patternType) S.patternType = x.patternType; }); cell.s = S; } if(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;}
function xlml_clean_comment(comment) { comment.t = comment.v || ""; comment.t = comment.t.replace(/\r\n/g,"\n").replace(/\r/g,"\n"); comment.v = comment.w = comment.ixfe = undefined;}
function xlml_normalize(d) { if(has_buf && Buffer.isBuffer(d)) return d.toString('utf8'); if(typeof d === 'string') return d; if(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d))); throw new Error("Bad input format: expected Buffer or string");}
var xlmlregex = /<(\/?)([^\s?><!\/:]*:|)([^\s?<>:\/]+)(?:[\s?:\/][^>]*)?>/mg;function parse_xlml_xml(d, _opts) { var opts = _opts || {}; make_ssf(SSF); var str = debom(xlml_normalize(d)); if(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') { if(typeof cptable !== 'undefined') str = cptable.utils.decode(65001, char_codes(str)); else str = utf8read(str); } var opening = str.slice(0, 1024).toLowerCase(), ishtml = false; opening = opening.replace(/".*?"/g, ""); if((opening.indexOf(">") & 1023) > Math.min((opening.indexOf(",") & 1023), (opening.indexOf(";")&1023))) { var _o = dup(opts); _o.type = "string"; return PRN.to_workbook(str, _o); } if(opening.indexOf("<?xml") == -1) ["html", "table", "head", "meta", "script", "style", "div"].forEach(function(tag) { if(opening.indexOf("<" + tag) >= 0) ishtml = true; }); if(ishtml) return HTML_.to_workbook(str, opts); var Rn; var state = [], tmp; if(DENSE != null && opts.dense == null) opts.dense = DENSE; var sheets = {}, sheetnames = [], cursheet = (opts.dense ? [] : {}), sheetname = ""; var table = {}, cell = ({}), row = {}; var dtag = xlml_parsexmltag('<Data ss:Type="String">'), didx = 0; var c = 0, r = 0; var refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} }; var styles = {}, stag = {}; var ss = "", fidx = 0; var merges = []; var Props = {}, Custprops = {}, pidx = 0, cp = []; var comments = [], comment = ({}); var cstys = [], csty, seencol = false; var arrayf = []; var rowinfo = [], rowobj = {}, cc = 0, rr = 0; var Workbook = ({ Sheets:[], WBProps:{date1904:false} }), wsprops = {}; xlmlregex.lastIndex = 0; str = str.replace(/<!--([\s\S]*?)-->/mg,""); var raw_Rn3 = ""; while((Rn = xlmlregex.exec(str))) switch((Rn[3] = (raw_Rn3 = Rn[3]).toLowerCase())) { case 'data' : if(raw_Rn3 == "data") { if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]); break; } if(state[state.length-1][1]) break; if(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]=="comment"?comment:cell, {c:c,r:r}, styles, cstys[c], row, arrayf, opts); else { ss = ""; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; } break; case 'cell' : if(Rn[1]==='/'){ if(comments.length > 0) cell.c = comments; if((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) { if(opts.dense) { if(!cursheet[r]) cursheet[r] = []; cursheet[r][c] = cell; } else cursheet[encode_col(c) + encode_row(r)] = cell; } if(cell.HRef) { cell.l = ({Target:unescapexml(cell.HRef)}); if(cell.HRefScreenTip) cell.l.Tooltip = cell.HRefScreenTip; delete cell.HRef; delete cell.HRefScreenTip; } if(cell.MergeAcross || cell.MergeDown) { cc = c + (parseInt(cell.MergeAcross,10)|0); rr = r + (parseInt(cell.MergeDown,10)|0); merges.push({s:{c:c,r:r},e:{c:cc,r:rr}}); } if(!opts.sheetStubs) { if(cell.MergeAcross) c = cc + 1; else ++c; } else if(cell.MergeAcross || cell.MergeDown) { for(var cma = c; cma <= cc; ++cma) { for(var cmd = r; cmd <= rr; ++cmd) { if(cma > c || cmd > r) { if(opts.dense) { if(!cursheet[cmd]) cursheet[cmd] = []; cursheet[cmd][cma] = {t:'z'}; } else cursheet[encode_col(cma) + encode_row(cmd)] = {t:'z'}; } } } c = cc + 1; } else ++c; } else { cell = xlml_parsexmltagobj(Rn[0]); if(cell.Index) c = +cell.Index - 1; if(c < refguess.s.c) refguess.s.c = c; if(c > refguess.e.c) refguess.e.c = c; if(Rn[0].slice(-2) === "/>") ++c; comments = []; } break; case 'row' : if(Rn[1]==='/' || Rn[0].slice(-2) === "/>") { if(r < refguess.s.r) refguess.s.r = r; if(r > refguess.e.r) refguess.e.r = r; if(Rn[0].slice(-2) === "/>") { row = xlml_parsexmltag(Rn[0]); if(row.Index) r = +row.Index - 1; } c = 0; ++r; } else { row = xlml_parsexmltag(Rn[0]); if(row.Index) r = +row.Index - 1; rowobj = {}; if(row.AutoFitHeight == "0" || row.Height) { rowobj.hpx = parseInt(row.Height, 10); rowobj.hpt = px2pt(rowobj.hpx); rowinfo[r] = rowobj; } if(row.Hidden == "1") { rowobj.hidden = true; rowinfo[r] = rowobj; } } break; case 'worksheet' : 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(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; sheets[sheetname] = cursheet; } else { refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} }; r = c = 0; state.push([Rn[3], false]); tmp = xlml_parsexmltag(Rn[0]); sheetname = unescapexml(tmp.Name); cursheet = (opts.dense ? [] : {}); merges = []; arrayf = []; rowinfo = []; wsprops = {name:sheetname, Hidden:0}; Workbook.Sheets.push(wsprops); } break; case 'table' : if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else if(Rn[0].slice(-2) == "/>") break; else { table = xlml_parsexmltag(Rn[0]); state.push([Rn[3], false]); cstys = []; seencol = false; } break;
case 'style' : if(Rn[1]==='/') process_style_xlml(styles, stag, opts); else stag = xlml_parsexmltag(Rn[0]); break;
case 'numberformat' : stag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || "General"); if(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf]; for(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == stag.nf) break; if(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(SSF._table[ssfidx] == null) { SSF.load(stag.nf, ssfidx); break; } break;
case 'column' : if(state[state.length-1][0] !== 'table') break; csty = xlml_parsexmltag(Rn[0]); if(csty.Hidden) { csty.hidden = true; delete csty.Hidden; } if(csty.Width) csty.wpx = parseInt(csty.Width, 10); if(!seencol && csty.wpx > 10) { seencol = true; MDW = DEF_MDW; for(var _col = 0; _col < cstys.length; ++_col) if(cstys[_col]) process_col(cstys[_col]); } if(seencol) process_col(csty); cstys[(csty.Index-1||cstys.length)] = csty; for(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = dup(csty); break;
case 'namedrange' : if(Rn[1]==='/') break; if(!Workbook.Names) Workbook.Names = []; var _NamedRange = parsexmltag(Rn[0]); var _DefinedName = ({ Name: _NamedRange.Name, Ref: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0}) }); if(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1; Workbook.Names.push(_DefinedName); break;
case 'namedcell' : break; case 'b' : break; case 'i' : break; case 'u' : break; case 's' : break; case 'em' : break; case 'h2' : break; case 'h3' : break; case 'sub' : break; case 'sup' : break; case 'span' : break; case 'alignment' : break; case 'borders' : break; case 'border' : break; case 'font' : if(Rn[0].slice(-2) === "/>") break; else if(Rn[1]==="/") ss += str.slice(fidx, Rn.index); else fidx = Rn.index + Rn[0].length; break; case 'interior' : if(!opts.cellStyles) break; stag.Interior = xlml_parsexmltag(Rn[0]); break; case 'protection' : break;
case 'author' : case 'title' : case 'description' : case 'created' : case 'keywords' : case 'subject' : case 'category' : case 'company' : case 'lastauthor' : case 'lastsaved' : case 'lastprinted' : case 'version' : case 'revision' : case 'totaltime' : case 'hyperlinkbase' : case 'manager' : case 'contentstatus' : case 'identifier' : case 'language' : case 'appname' : if(Rn[0].slice(-2) === "/>") break; else if(Rn[1]==="/") xlml_set_prop(Props, raw_Rn3, str.slice(pidx, Rn.index)); else pidx = Rn.index + Rn[0].length; break; case 'paragraphs' : break;
case 'styles' : case 'workbook' : if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else state.push([Rn[3], false]); break;
case 'comment' : if(Rn[1]==='/'){ if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|")); xlml_clean_comment(comment); comments.push(comment); } else { state.push([Rn[3], false]); tmp = xlml_parsexmltag(Rn[0]); comment = ({a:tmp.Author}); } break;
case 'autofilter' : if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else if(Rn[0].charAt(Rn[0].length-2) !== '/') { var AutoFilter = xlml_parsexmltag(Rn[0]); cursheet['!autofilter'] = { ref:rc_to_a1(AutoFilter.Range).replace(/\$/g,"") }; state.push([Rn[3], true]); } break;
case 'name' : break;
case 'datavalidation' : if(Rn[1]==='/'){ if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|")); } else { if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]); } break;
case 'pixelsperinch' : break; case 'componentoptions' : case 'documentproperties' : case 'customdocumentproperties' : case 'officedocumentsettings' : case 'pivottable' : case 'pivotcache' : case 'names' : case 'mapinfo' : case 'pagebreaks' : case 'querytable' : case 'sorting' : case 'schema' : case 'conditionalformatting' : case 'smarttagtype' : case 'smarttags' : case 'excelworkbook' : case 'workbookoptions' : case 'worksheetoptions' : if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error("Bad state: "+tmp.join("|"));} else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]); break;
case 'null' : break;
default: if(state.length == 0 && Rn[3] == "document") return parse_fods(str, opts); if(state.length == 0 && Rn[3] == "uof") return parse_fods(str, opts);
var seen = true; switch(state[state.length-1][0]) { case 'officedocumentsettings' : switch(Rn[3]) { case 'allowpng' : break; case 'removepersonalinformation' : break; case 'downloadcomponents' : break; case 'locationofcomponents' : break; case 'colors' : break; case 'color' : break; case 'index' : break; case 'rgb' : break; case 'targetscreensize' : break; case 'readonlyrecommended' : break; default: seen = false; } break;
case 'componentoptions' : switch(Rn[3]) { case 'toolbar' : break; case 'hideofficelogo' : break; case 'spreadsheetautofit' : break; case 'label' : break; case 'caption' : break; case 'maxheight' : break; case 'maxwidth' : break; case 'nextsheetnumber' : break; default: seen = false; } break;
case 'excelworkbook' : switch(Rn[3]) { case 'date1904' : Workbook.WBProps.date1904 = true; break; case 'windowheight' : break; case 'windowwidth' : break; case 'windowtopx' : break; case 'windowtopy' : break; case 'tabratio' : break; case 'protectstructure' : break; case 'protectwindow' : break; case 'protectwindows' : break; case 'activesheet' : break; case 'displayinknotes' : break; case 'firstvisiblesheet' : break; case 'supbook' : break; case 'sheetname' : break; case 'sheetindex' : break; case 'sheetindexfirst' : break; case 'sheetindexlast' : break; case 'dll' : break; case 'acceptlabelsinformulas' : break; case 'donotsavelinkvalues' : break; case 'iteration' : break; case 'maxiterations' : break; case 'maxchange' : break; case 'path' : break; case 'xct' : break; case 'count' : break; case 'selectedsheets' : break; case 'calculation' : break; case 'uncalced' : break; case 'startupprompt' : break; case 'crn' : break; case 'externname' : break; case 'formula' : break; case 'colfirst' : break; case 'collast' : break; case 'wantadvise' : break; case 'boolean' : break; case 'error' : break; case 'text' : break; case 'ole' : break; case 'noautorecover' : break; case 'publishobjects' : break; case 'donotcalculatebeforesave' : break; case 'number' : break; case 'refmoder1c1' : break; case 'embedsavesmarttags' : break; default: seen = false; } break;
case 'workbookoptions' : switch(Rn[3]) { case 'owcversion' : break; case 'height' : break; case 'width' : break; default: seen = false; } break;
case 'worksheetoptions' : switch(Rn[3]) { case 'visible' : if(Rn[0].slice(-2) === "/>"){} else if(Rn[1]==="/") switch(str.slice(pidx, Rn.index)) { case "SheetHidden": wsprops.Hidden = 1; break; case "SheetVeryHidden": wsprops.Hidden = 2; break; } else pidx = Rn.index + Rn[0].length; break; case 'header' : if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml'); if(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].header = +parsexmltag(Rn[0]).Margin; break; case 'footer' : if(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml'); if(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].footer = +parsexmltag(Rn[0]).Margin; break; case 'pagemargins' : var pagemargins = parsexmltag(Rn[0]); if(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml'); if(!isNaN(+pagemargins.Top)) cursheet['!margins'].top = +pagemargins.Top; if(!isNaN(+pagemargins.Left)) cursheet['!margins'].left = +pagemargins.Left; if(!isNaN(+pagemargins.Right)) cursheet['!margins'].right = +pagemargins.Right; if(!isNaN(+pagemargins.Bottom)) cursheet['!margins'].bottom = +pagemargins.Bottom; break; case 'displayrighttoleft' : if(!Workbook.Views) Workbook.Views = []; if(!Workbook.Views[0]) Workbook.Views[0] = {}; Workbook.Views[0].RTL = true; break;
case 'freezepanes' : break; case 'frozennosplit' : break;
case 'splithorizontal' : case 'splitvertical' : break;
case 'donotdisplaygridlines' : break;
case 'activerow' : break; case 'activecol' : break; case 'toprowbottompane' : break; case 'leftcolumnrightpane' : break;
case 'unsynced' : break; case 'print' : break; case 'printerrors' : break; case 'panes' : break; case 'scale' : break; case 'pane' : break; case 'number' : break; case 'layout' : break; case 'pagesetup' : break; case 'selected' : break; case 'protectobjects' : break; case 'enableselection' : break; case 'protectscenarios' : break; case 'validprinterinfo' : break; case 'horizontalresolution' : break; case 'verticalresolution' : break; case 'numberofcopies' : break; case 'activepane' : break; case 'toprowvisible' : break; case 'leftcolumnvisible' : break; case 'fittopage' : break; case 'rangeselection' : break; case 'papersizeindex' : break; case 'pagelayoutzoom' : break; case 'pagebreakzoom' : break; case 'filteron' : break; case 'fitwidth' : break; case 'fitheight' : break; case 'commentslayout' : break; case 'zoom' : break; case 'lefttoright' : break; case 'gridlines' : break; case 'allowsort' : break; case 'allowfilter' : break; case 'allowinsertrows' : break; case 'allowdeleterows' : break; case 'allowinsertcols' : break; case 'allowdeletecols' : break; case 'allowinserthyperlinks' : break; case 'allowformatcells' : break; case 'allowsizecols' : break; case 'allowsizerows' : break; case 'nosummaryrowsbelowdetail' : if(!cursheet["!outline"]) cursheet["!outline"] = {}; cursheet["!outline"].above = true; break; case 'tabcolorindex' : break; case 'donotdisplayheadings' : break; case 'showpagelayoutzoom' : break; case 'nosummarycolumnsrightdetail' : if(!cursheet["!outline"]) cursheet["!outline"] = {}; cursheet["!outline"].left = true; break; case 'blackandwhite' : break; case 'donotdisplayzeros' : break; case 'displaypagebreak' : break; case 'rowcolheadings' : break; case 'donotdisplayoutline' : break; case 'noorientation' : break; case 'allowusepivottables' : break; case 'zeroheight' : break; case 'viewablerange' : break; case 'selection' : break; case 'protectcontents' : break; default: seen = false; } break;
case 'pivottable' : case 'pivotcache' : switch(Rn[3]) { case 'immediateitemsondrop' : break; case 'showpagemultipleitemlabel' : break; case 'compactrowindent' : break; case 'location' : break; case 'pivotfield' : break; case 'orientation' : break; case 'layoutform' : break; case 'layoutsubtotallocation' : break; case 'layoutcompactrow' : break; case 'position' : break; case 'pivotitem' : break; case 'datatype' : break; case 'datafield' : break; case 'sourcename' : break; case 'parentfield' : break; case 'ptlineitems' : break; case 'ptlineitem' : break; case 'countofsameitems' : break; case 'item' : break; case 'itemtype' : break; case 'ptsource' : break; case 'cacheindex' : break; case 'consolidationreference' : break; case 'filename' : break; case 'reference' : break; case 'nocolumngrand' : break; case 'norowgrand' : break; case 'blanklineafteritems' : break; case 'hidden' : break; case 'subtotal' : break; case 'basefield' : break; case 'mapchilditems' : break; case 'function' : break; case 'refreshonfileopen' : break; case 'printsettitles' : break; case 'mergelabels' : break; case 'defaultversion' : break; case 'refreshname' : break; case 'refreshdate' : break; case 'refreshdatecopy' : break; case 'versionlastrefresh' : break; case 'versionlastupdate' : break; case 'versionupdateablemin' : break; case 'versionrefreshablemin' : break; case 'calculation' : break; default: seen = false; } break;
case 'pagebreaks' : switch(Rn[3]) { case 'colbreaks' : break; case 'colbreak' : break; case 'rowbreaks' : break; case 'rowbreak' : break; case 'colstart' : break; case 'colend' : break; case 'rowend' : break; default: seen = false; } break;
case 'autofilter' : switch(Rn[3]) { case 'autofiltercolumn' : break; case 'autofiltercondition' : break; case 'autofilterand' : break; case 'autofilteror' : break; default: seen = false; } break;
case 'querytable' : switch(Rn[3]) { case 'id' : break; case 'autoformatfont' : break; case 'autoformatpattern' : break; case 'querysource' : break; case 'querytype' : break; case 'enableredirections' : break; case 'refreshedinxl9' : break; case 'urlstring' : break; case 'htmltables' : break; case 'connection' : break; case 'commandtext' : break; case 'refreshinfo' : break; case 'notitles' : break; case 'nextid' : break; case 'columninfo' : break; case 'overwritecells' : break; case 'donotpromptforfile' : break; case 'textwizardsettings' : break; case 'source' : break; case 'number' : break; case 'decimal' : break; case 'thousandseparator' : break; case 'trailingminusnumbers' : break; case 'formatsettings' : break; case 'fieldtype' : break; case 'delimiters' : break; case 'tab' : break; case 'comma' : break; case 'autoformatname' : break; case 'versionlastedit' : break; case 'versionlastrefresh' : break; default: seen = false; } break;
case 'datavalidation' : switch(Rn[3]) { case 'range' : break;
case 'type' : break; case 'min' : break; case 'max' : break; case 'sort' : break; case 'descending' : break; case 'order' : break; case 'casesensitive' : break; case 'value' : break; case 'errorstyle' : break; case 'errormessage' : break; case 'errortitle' : break; case 'inputmessage' : break; case 'inputtitle' : break; case 'combohide' : break; case 'inputhide' : break; case 'condition' : break; case 'qualifier' : break; case 'useblank' : break; case 'value1' : break; case 'value2' : break; case 'format' : break;
case 'cellrangelist' : break; default: seen = false; } break;
case 'sorting' : case 'conditionalformatting' : switch(Rn[3]) { case 'range' : break; case 'type' : break; case 'min' : break; case 'max' : break; case 'sort' : break; case 'descending' : break; case 'order' : break; case 'casesensitive' : break; case 'value' : break; case 'errorstyle' : break; case 'errormessage' : break; case 'errortitle' : break; case 'cellrangelist' : break; case 'inputmessage' : break; case 'inputtitle' : break; case 'combohide' : break; case 'inputhide' : break; case 'condition' : break; case 'qualifier' : break; case 'useblank' : break; case 'value1' : break; case 'value2' : break; case 'format' : break; default: seen = false; } break;
case 'mapinfo' : case 'schema' : case 'data' : switch(Rn[3]) { case 'map' : break; case 'entry' : break; case 'range' : break; case 'xpath' : break; case 'field' : break; case 'xsdtype' : break; case 'filteron' : break; case 'aggregate' : break; case 'elementtype' : break; case 'attributetype' : break; case 'schema' : case 'element' : case 'complextype' : case 'datatype' : case 'all' : case 'attribute' : case 'extends' : break;
case 'row' : break; default: seen = false; } break;
case 'smarttags' : break;
default: seen = false; break; } if(seen) break; if(Rn[3].match(/!\[CDATA/)) break; if(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|"); if(state[state.length-1][0]==='customdocumentproperties') { if(Rn[0].slice(-2) === "/>") break; else if(Rn[1]==="/") xlml_set_custprop(Custprops, raw_Rn3, cp, str.slice(pidx, Rn.index)); else { cp = Rn; pidx = Rn.index + Rn[0].length; } break; } if(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + "|" + state.join("|"); } var out = ({}); if(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets; out.SheetNames = sheetnames; out.Workbook = Workbook; out.SSF = SSF.get_table(); out.Props = Props; out.Custprops = Custprops; return out;}
function parse_xlml(data, opts) { fix_read_opts(opts=opts||{}); switch(opts.type||"base64") { case "base64": return parse_xlml_xml(Base64.decode(data), opts); case "binary": case "buffer": case "file": return parse_xlml_xml(data, opts); case "array": return parse_xlml_xml(a2s(data), opts); } }
function write_props_xlml(wb, opts) { var o = []; if(wb.Props) o.push(xlml_write_docprops(wb.Props, opts)); if(wb.Custprops) o.push(xlml_write_custprops(wb.Props, wb.Custprops, opts)); return o.join("");}function write_wb_xlml() { return "";}function write_sty_xlml(wb, opts) { var styles = ['<Style ss:ID="Default" ss:Name="Normal"><NumberFormat/></Style>']; opts.cellXfs.forEach(function(xf, id) { var payload = []; payload.push(writextag('NumberFormat', null, {"ss:Format": escapexml(SSF._table[xf.numFmtId])}));
var o = {"ss:ID": "s" + (21+id)}; styles.push(writextag('Style', payload.join(""), o)); }); return writextag("Styles", styles.join(""));}function write_name_xlml(n) { return writextag("NamedRange", null, {"ss:Name": n.Name, "ss:RefersTo":"=" + a1_to_rc(n.Ref, {r:0,c:0})}); }function write_names_xlml(wb) { if(!((wb||{}).Workbook||{}).Names) return ""; var names = wb.Workbook.Names; var out = []; for(var i = 0; i < names.length; ++i) { var n = names[i]; if(n.Sheet != null) continue; if(n.Name.match(/^_xlfn\./)) continue; out.push(write_name_xlml(n)); } return writextag("Names", out.join(""));}function write_ws_xlml_names(ws, opts, idx, wb) { if(!ws) return ""; if(!((wb||{}).Workbook||{}).Names) return ""; var names = wb.Workbook.Names; var out = []; for(var i = 0; i < names.length; ++i) { var n = names[i]; if(n.Sheet != idx) continue; if(n.Name.match(/^_xlfn\./)) continue; out.push(write_name_xlml(n)); } return out.join("");}function write_ws_xlml_wsopts(ws, opts, idx, wb) { if(!ws) return ""; var o = [];
if(ws['!margins']) { o.push("<PageSetup>"); if(ws['!margins'].header) o.push(writextag("Header", null, {'x:Margin':ws['!margins'].header})); if(ws['!margins'].footer) o.push(writextag("Footer", null, {'x:Margin':ws['!margins'].footer})); o.push(writextag("PageMargins", null, { 'x:Bottom': ws['!margins'].bottom || "0.75", 'x:Left': ws['!margins'].left || "0.7", 'x:Right': ws['!margins'].right || "0.7", 'x:Top': ws['!margins'].top || "0.75" })); o.push("</PageSetup>"); }
if(wb && wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx]) { if(wb.Workbook.Sheets[idx].Hidden) o.push(writextag("Visible", (wb.Workbook.Sheets[idx].Hidden == 1 ? "SheetHidden" : "SheetVeryHidden"), {})); else { for(var i = 0; i < idx; ++i) if(wb.Workbook.Sheets[i] && !wb.Workbook.Sheets[i].Hidden) break; if(i == idx) o.push("<Selected/>"); } }
if(((((wb||{}).Workbook||{}).Views||[])[0]||{}).RTL) o.push("<DisplayRightToLeft/>");
if(ws['!protect']) { o.push(writetag("ProtectContents", "True")); if(ws['!protect'].objects) o.push(writetag("ProtectObjects", "True")); if(ws['!protect'].scenarios) o.push(writetag("ProtectScenarios", "True")); if(ws['!protect'].selectLockedCells != null && !ws['!protect'].selectLockedCells) o.push(writetag("EnableSelection", "NoSelection")); else if(ws['!protect'].selectUnlockedCells != null && !ws['!protect'].selectUnlockedCells) o.push(writetag("EnableSelection", "UnlockedCells")); [ [ "formatCells", "AllowFormatCells" ], [ "formatColumns", "AllowSizeCols" ], [ "formatRows", "AllowSizeRows" ], [ "insertColumns", "AllowInsertCols" ], [ "insertRows", "AllowInsertRows" ], [ "insertHyperlinks", "AllowInsertHyperlinks" ], [ "deleteColumns", "AllowDeleteCols" ], [ "deleteRows", "AllowDeleteRows" ], [ "sort", "AllowSort" ], [ "autoFilter", "AllowFilter" ], [ "pivotTables", "AllowUsePivotTables" ] ].forEach(function(x) { if(ws['!protect'][x[0]]) o.push("<"+x[1]+"/>"); }); }
if(o.length == 0) return ""; return writextag("WorksheetOptions", o.join(""), {xmlns:XLMLNS.x});}function write_ws_xlml_comment(comments) { return comments.map(function(c) { var t = xlml_unfixstr(c.t||""); var d =writextag("ss:Data", t, {"xmlns":"http://www.w3.org/TR/REC-html40"}); return writextag("Comment", d, {"ss:Author":c.a}); }).join("");}function write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr){ if(!cell || (cell.v == undefined && cell.f == undefined)) return "";
var attr = {}; if(cell.f) attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr)); if(cell.F && cell.F.slice(0, ref.length) == ref) { var end = decode_cell(cell.F.slice(ref.length + 1)); attr["ss:ArrayRange"] = "RC:R" + (end.r == addr.r ? "" : "[" + (end.r - addr.r) + "]") + "C" + (end.c == addr.c ? "" : "[" + (end.c - addr.c) + "]"); }
if(cell.l && cell.l.Target) { attr["ss:HRef"] = escapexml(cell.l.Target); if(cell.l.Tooltip) attr["x:HRefScreenTip"] = escapexml(cell.l.Tooltip); }
if(ws['!merges']) { var marr = ws['!merges']; for(var mi = 0; mi != marr.length; ++mi) { if(marr[mi].s.c != addr.c || marr[mi].s.r != addr.r) continue; if(marr[mi].e.c > marr[mi].s.c) attr['ss:MergeAcross'] = marr[mi].e.c - marr[mi].s.c; if(marr[mi].e.r > marr[mi].s.r) attr['ss:MergeDown'] = marr[mi].e.r - marr[mi].s.r; } }
var t = "", p = ""; switch(cell.t) { case 'z': if(!opts.sheetStubs) return ""; break; case 'n': t = 'Number'; p = String(cell.v); break; case 'b': t = 'Boolean'; p = (cell.v ? "1" : "0"); break; case 'e': t = 'Error'; p = BErr[cell.v]; break; case 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || SSF._table[14]; break; case 's': t = 'String'; p = escapexlml(cell.v||""); break; } var os = get_cell_style(opts.cellXfs, cell, opts); attr["ss:StyleID"] = "s" + (21+os); attr["ss:Index"] = addr.c + 1; var _v = (cell.v != null ? p : ""); var m = cell.t == 'z' ? "" : ('<Data ss:Type="' + t + '">' + _v + '</Data>');
if((cell.c||[]).length > 0) m += write_ws_xlml_comment(cell.c);
return writextag("Cell", m, attr);}function write_ws_xlml_row(R, row) { var o = '<Row ss:Index="' + (R+1) + '"'; if(row) { if(row.hpt && !row.hpx) row.hpx = pt2px(row.hpt); if(row.hpx) o += ' ss:AutoFitHeight="0" ss:Height="' + row.hpx + '"'; if(row.hidden) o += ' ss:Hidden="1"'; } return o + '>';}function write_ws_xlml_table(ws, opts, idx, wb) { if(!ws['!ref']) return ""; var range = safe_decode_range(ws['!ref']); var marr = ws['!merges'] || [], mi = 0; var o = []; if(ws['!cols']) ws['!cols'].forEach(function(n, i) { process_col(n); var w = !!n.width; var p = col_obj_w(i, n); var k = {"ss:Index":i+1}; if(w) k['ss:Width'] = width2px(p.width); if(n.hidden) k['ss:Hidden']="1"; o.push(writextag("Column",null,k)); }); var dense = Array.isArray(ws); for(var R = range.s.r; R <= range.e.r; ++R) { var row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])]; for(var C = range.s.c; C <= range.e.c; ++C) { var skip = false; for(mi = 0; mi != marr.length; ++mi) { if(marr[mi].s.c > C) continue; if(marr[mi].s.r > R) continue; if(marr[mi].e.c < C) continue; if(marr[mi].e.r < R) continue; if(marr[mi].s.c != C || marr[mi].s.r != R) skip = true; break; } if(skip) continue; var addr = {r:R,c:C}; var ref = encode_cell(addr), cell = dense ? (ws[R]||[])[C] : ws[ref]; row.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr)); } row.push("</Row>"); if(row.length > 2) o.push(row.join("")); } return o.join("");}function write_ws_xlml(idx, opts, wb) { var o = []; var s = wb.SheetNames[idx]; var ws = wb.Sheets[s];
var t = ws ? write_ws_xlml_names(ws, opts, idx, wb) : ""; if(t.length > 0) o.push("<Names>" + t + "</Names>");
t = ws ? write_ws_xlml_table(ws, opts, idx, wb) : ""; if(t.length > 0) o.push("<Table>" + t + "</Table>");
o.push(write_ws_xlml_wsopts(ws, opts, idx, wb));
return o.join("");}function write_xlml(wb, opts) { if(!opts) opts = {}; if(!wb.SSF) wb.SSF = SSF.get_table(); if(wb.SSF) { make_ssf(SSF); SSF.load_table(wb.SSF); opts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0; opts.ssf = wb.SSF; opts.cellXfs = []; get_cell_style(opts.cellXfs, {}, {revssf:{"General":0}}); } var d = []; d.push(write_props_xlml(wb, opts)); d.push(write_wb_xlml(wb, opts)); d.push(""); d.push(""); for(var i = 0; i < wb.SheetNames.length; ++i) d.push(writextag("Worksheet", write_ws_xlml(i, opts, wb), {"ss:Name":escapexml(wb.SheetNames[i])})); d[2] = write_sty_xlml(wb, opts); d[3] = write_names_xlml(wb, opts); return XML_HEADER + writextag("Workbook", d.join(""), { 'xmlns': XLMLNS.ss, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:ss': XLMLNS.ss, 'xmlns:dt': XLMLNS.dt, 'xmlns:html': XLMLNS.html });}