forked from sheetjs/sheetjs
		
	version bump 0.14.2: comment xml (fixes #1468)
This commit is contained in:
		
							parent
							
								
									ca22658b8c
								
							
						
					
					
						commit
						0c36667c0c
					
				@ -21,8 +21,6 @@ enhancements, additional features like styling, and dedicated support.
 | 
			
		||||
 | 
			
		||||
[**Issues and Bug Reports**](https://github.com/sheetjs/js-xlsx/issues)
 | 
			
		||||
 | 
			
		||||
[**Other General Support Issues**](https://discourse.sheetjs.com)
 | 
			
		||||
 | 
			
		||||
[**File format support for known spreadsheet data formats:**](#file-formats)
 | 
			
		||||
 | 
			
		||||
<details>
 | 
			
		||||
@ -43,7 +41,6 @@ enhancements, additional features like styling, and dedicated support.
 | 
			
		||||
[](https://coveralls.io/r/SheetJS/js-xlsx?branch=master)
 | 
			
		||||
[](https://david-dm.org/sheetjs/js-xlsx)
 | 
			
		||||
[](https://npmjs.org/package/xlsx)
 | 
			
		||||
[](https://ghit.me/repo/sheetjs/js-xlsx)
 | 
			
		||||
[](https://github.com/SheetJS/js-xlsx)
 | 
			
		||||
 | 
			
		||||
## Table of Contents
 | 
			
		||||
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
XLSX.version = '0.14.1';
 | 
			
		||||
XLSX.version = '0.14.2';
 | 
			
		||||
 | 
			
		||||
@ -114,7 +114,7 @@ function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksh
 | 
			
		||||
			if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];
 | 
			
		||||
			else {
 | 
			
		||||
				if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.cellStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.sheetStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				else if(typeof cell.v === 'number') cell.t = 'n';
 | 
			
		||||
				else if(typeof cell.v === 'boolean') cell.t = 'b';
 | 
			
		||||
				else if(cell.v instanceof Date) {
 | 
			
		||||
 | 
			
		||||
@ -20,10 +20,10 @@ function parse_comments(zip, dirComments, sheets, sheetRels, opts) {
 | 
			
		||||
 | 
			
		||||
function insertCommentsIntoSheet(sheetName, sheet, comments/*:Array<RawComment>*/) {
 | 
			
		||||
	var dense = Array.isArray(sheet);
 | 
			
		||||
	var cell/*:Cell*/, r;
 | 
			
		||||
	var cell/*:Cell*/;
 | 
			
		||||
	comments.forEach(function(comment) {
 | 
			
		||||
		var r = decode_cell(comment.ref);
 | 
			
		||||
		if(dense) {
 | 
			
		||||
			r = decode_cell(comment.ref);
 | 
			
		||||
			if(!sheet[r.r]) sheet[r.r] = [];
 | 
			
		||||
			cell = sheet[r.r][r.c];
 | 
			
		||||
		} else cell = sheet[comment.ref];
 | 
			
		||||
@ -32,11 +32,10 @@ function insertCommentsIntoSheet(sheetName, sheet, comments/*:Array<RawComment>*
 | 
			
		||||
			if(dense) sheet[r.r][r.c] = cell;
 | 
			
		||||
			else sheet[comment.ref] = cell;
 | 
			
		||||
			var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1");
 | 
			
		||||
			var thisCell = decode_cell(comment.ref);
 | 
			
		||||
			if(range.s.r > thisCell.r) range.s.r = thisCell.r;
 | 
			
		||||
			if(range.e.r < thisCell.r) range.e.r = thisCell.r;
 | 
			
		||||
			if(range.s.c > thisCell.c) range.s.c = thisCell.c;
 | 
			
		||||
			if(range.e.c < thisCell.c) range.e.c = thisCell.c;
 | 
			
		||||
			if(range.s.r > r.r) range.s.r = r.r;
 | 
			
		||||
			if(range.e.r < r.r) range.e.r = r.r;
 | 
			
		||||
			if(range.s.c > r.c) range.s.c = r.c;
 | 
			
		||||
			if(range.e.c < r.c) range.e.c = r.c;
 | 
			
		||||
			var encoded = encode_range(range);
 | 
			
		||||
			if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -47,7 +47,7 @@ function write_comments_xml(data/*::, opts*/) {
 | 
			
		||||
		d[1].forEach(function(c) {
 | 
			
		||||
			/* 18.7.3 CT_Comment */
 | 
			
		||||
			o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : c.t));
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
 | 
			
		||||
			o.push('</text></comment>');
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
 | 
			
		||||
var sheetdataregex = /<(?:\w+:)?sheetData>([\s\S]*)<\/(?:\w+:)?sheetData>/;
 | 
			
		||||
var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
 | 
			
		||||
var dimregex = /"(\w*:\w*)"/;
 | 
			
		||||
var colregex = /<(?:\w:)?col[^>]*[\/]?>/g;
 | 
			
		||||
var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
 | 
			
		||||
var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
 | 
			
		||||
var marginregex= /<(?:\w:)?pageMargins[^>]*\/>/g;
 | 
			
		||||
var sheetprregex = /<(?:\w:)?sheetPr(?:[^>a-z][^>]*)?\/>/;
 | 
			
		||||
@ -448,10 +448,10 @@ function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook
 | 
			
		||||
				row = rows[R];
 | 
			
		||||
				if(row.hidden) params.hidden = 1;
 | 
			
		||||
				height = -1;
 | 
			
		||||
				if (row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if (row.hpt) height = row.hpt;
 | 
			
		||||
				if (height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if (row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
				if(row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if(row.hpt) height = row.hpt;
 | 
			
		||||
				if(height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if(row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
			}
 | 
			
		||||
			o[o.length] = (writextag('row', r.join(""), params));
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@ -83,6 +83,7 @@ function parse_wb_xml(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
				dname.Name = utf8read(y.name);
 | 
			
		||||
				if(y.comment) dname.Comment = y.comment;
 | 
			
		||||
				if(y.localSheetId) dname.Sheet = +y.localSheetId;
 | 
			
		||||
				if(parsexmlbool(y.hidden||"0")) dname.Hidden = true;
 | 
			
		||||
				dnstart = idx + x.length;
 | 
			
		||||
			}	break;
 | 
			
		||||
			case '</definedName>': {
 | 
			
		||||
@ -184,11 +185,14 @@ function write_wb_xml(wb/*:Workbook*//*::, opts:?WriteOpts*/)/*:string*/ {
 | 
			
		||||
	o[o.length] = (writextag('workbookPr', null, workbookPr));
 | 
			
		||||
 | 
			
		||||
	/* workbookProtection */
 | 
			
		||||
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	var i = 0;
 | 
			
		||||
 | 
			
		||||
	/* bookViews */
 | 
			
		||||
 | 
			
		||||
	o[o.length] = "<sheets>";
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	for(var i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
	for(i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
		var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))}/*:any*/);
 | 
			
		||||
		sht.sheetId = ""+(i+1);
 | 
			
		||||
		sht["r:id"] = "rId"+(i+1);
 | 
			
		||||
@ -209,8 +213,9 @@ function write_wb_xml(wb/*:Workbook*//*::, opts:?WriteOpts*/)/*:string*/ {
 | 
			
		||||
			var d/*:any*/ = {name:n.Name};
 | 
			
		||||
			if(n.Comment) d.comment = n.Comment;
 | 
			
		||||
			if(n.Sheet != null) d.localSheetId = ""+n.Sheet;
 | 
			
		||||
			if(n.Hidden) d.hidden = "1";
 | 
			
		||||
			if(!n.Ref) return;
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref), d);
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref).replace(/</g, "<").replace(/>/g, ">"), d);
 | 
			
		||||
		});
 | 
			
		||||
		o[o.length] = "</definedNames>";
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -86,6 +86,7 @@ function parse_BrtName(data, length, opts) {
 | 
			
		||||
/* [MS-XLSB] 2.1.7.61 Workbook */
 | 
			
		||||
function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
	var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
 | 
			
		||||
	var state/*:Array<string>*/ = [];
 | 
			
		||||
	var pass = false;
 | 
			
		||||
 | 
			
		||||
	if(!opts) opts = {};
 | 
			
		||||
@ -161,18 +162,20 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 0x0023: /* 'BrtFRTBegin' */
 | 
			
		||||
				pass = true; break;
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0024: /* 'BrtFRTEnd' */
 | 
			
		||||
				pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */ break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */ break;
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
 | 
			
		||||
			case 0x0010: /* 'BrtFRTArchID$' */ break;
 | 
			
		||||
 | 
			
		||||
			default:
 | 
			
		||||
				if((R_n||"").indexOf("Begin") > 0){/* empty */}
 | 
			
		||||
				else if((R_n||"").indexOf("End") > 0){/* empty */}
 | 
			
		||||
				else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
				else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin" && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
		}
 | 
			
		||||
	}, opts);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -265,7 +265,8 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
				case 'WsBool':
 | 
			
		||||
					if(val.fDialog) out["!type"] = "dialog";
 | 
			
		||||
					break; // TODO
 | 
			
		||||
				case 'XF': XFs.push(val); break;
 | 
			
		||||
				case 'XF':
 | 
			
		||||
					XFs.push(val); break;
 | 
			
		||||
				case 'ExtSST': break; // TODO
 | 
			
		||||
				case 'BookExt': break; // TODO
 | 
			
		||||
				case 'RichTextStream': break;
 | 
			
		||||
 | 
			
		||||
@ -828,6 +828,9 @@ var XLSBRecordEnum = {
 | 
			
		||||
	/*::[*/0x085D/*::]*/: { n:"BrtModelTimeGroupingCalcCol" },
 | 
			
		||||
	/*::[*/0x0C00/*::]*/: { n:"BrtUid" },
 | 
			
		||||
	/*::[*/0x0C01/*::]*/: { n:"BrtRevisionPtr" },
 | 
			
		||||
	/*::[*/0x13e7/*::]*/: { n:"BrtBeginCalcFeatures" },
 | 
			
		||||
	/*::[*/0x13e8/*::]*/: { n:"BrtEndCalcFeatures" },
 | 
			
		||||
	/*::[*/0x13e9/*::]*/: { n:"BrtCalcFeature" },
 | 
			
		||||
	/*::[*/0xFFFF/*::]*/: { n:"" }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,16 +1,17 @@
 | 
			
		||||
/* OpenDocument */
 | 
			
		||||
var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
	/* 6.1.2 White Space Characters */
 | 
			
		||||
	var parse_text_p = function(text/*:string*//*::, tag*/)/*:string*/ {
 | 
			
		||||
		return unescapexml(text
 | 
			
		||||
	var parse_text_p = function(text/*:string*//*::, tag*/)/*:Array<any>*/ {
 | 
			
		||||
		/* 6.1.2 White Space Characters */
 | 
			
		||||
		var fixed = text
 | 
			
		||||
			.replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ")
 | 
			
		||||
			.replace(/<text:s\/>/g," ")
 | 
			
		||||
			.replace(/<text:s text:c="(\d+)"\/>/g, function($$,$1) { return Array(parseInt($1,10)+1).join(" "); })
 | 
			
		||||
			.replace(/<text:tab[^>]*\/>/g,"\t")
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n")
 | 
			
		||||
			.replace(/<[^>]*>/g,"")
 | 
			
		||||
		);
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n");
 | 
			
		||||
		var v = unescapexml(fixed.replace(/<[^>]*>/g,""));
 | 
			
		||||
 | 
			
		||||
		return [v];
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	var number_formats = {
 | 
			
		||||
@ -42,6 +43,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
		var Rn, q/*:: :any = ({t:"", v:null, z:null, w:"",c:[],}:any)*/;
 | 
			
		||||
		var ctag = ({value:""}/*:any*/);
 | 
			
		||||
		var textp = "", textpidx = 0, textptag/*:: = {}*/;
 | 
			
		||||
		var textR = [];
 | 
			
		||||
		var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
 | 
			
		||||
		var row_ol = 0;
 | 
			
		||||
		var number_format_map = {};
 | 
			
		||||
@ -97,11 +99,12 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};
 | 
			
		||||
				C = -1; break;
 | 
			
		||||
			case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
 | 
			
		||||
				++C;
 | 
			
		||||
				if(Rn[1] !== '/') ++C;
 | 
			
		||||
				if(opts.sheetStubs) {
 | 
			
		||||
					if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }
 | 
			
		||||
					else ws[encode_cell({r:R,c:C})] = {t:'z'};
 | 
			
		||||
				}
 | 
			
		||||
				textp = ""; textR = [];
 | 
			
		||||
				break; /* stub */
 | 
			
		||||
			case 'table-cell': case '数据':
 | 
			
		||||
				if(Rn[0].charAt(Rn[0].length-2) === '/') {
 | 
			
		||||
@ -170,13 +173,14 @@ var parse_content_xml = (function() {
 | 
			
		||||
						default:
 | 
			
		||||
							if(q.t === 'string' || q.t === 'text' || !q.t) {
 | 
			
		||||
								q.t = 's';
 | 
			
		||||
								if(ctag['string-value'] != null) textp = unescapexml(ctag['string-value']);
 | 
			
		||||
								if(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }
 | 
			
		||||
							} else throw new Error('Unsupported value type ' + q.t);
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					isstub = false;
 | 
			
		||||
					if(q.t === 's') {
 | 
			
		||||
						q.v = textp || '';
 | 
			
		||||
						if(textR.length) q.R = textR;
 | 
			
		||||
						isstub = textpidx == 0;
 | 
			
		||||
					}
 | 
			
		||||
					if(atag.Target) q.l = atag;
 | 
			
		||||
@ -201,7 +205,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
					C += colpeat-1; colpeat = 0;
 | 
			
		||||
					q = {/*:: t:"", v:null, z:null, w:"",c:[]*/};
 | 
			
		||||
					textp = "";
 | 
			
		||||
					textp = ""; textR = [];
 | 
			
		||||
				}
 | 
			
		||||
				atag = ({}/*:any*/);
 | 
			
		||||
				break; // 9.1.4 <table:table-cell>
 | 
			
		||||
@ -221,12 +225,13 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(Rn[1]==='/'){
 | 
			
		||||
					if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
 | 
			
		||||
					comment.t = textp;
 | 
			
		||||
					if(textR.length) comment.R = textR;
 | 
			
		||||
					comment.a = creator;
 | 
			
		||||
					comments.push(comment);
 | 
			
		||||
				}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}
 | 
			
		||||
				creator = ""; creatoridx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'creator': // 4.3.2.7 <dc:creator>
 | 
			
		||||
@ -253,7 +258,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'chart': // TODO
 | 
			
		||||
				if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'scientific-number': // TODO: <number:scientific-number>
 | 
			
		||||
@ -282,7 +287,8 @@ var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
			case 'default-style': // TODO: <style:default-style>
 | 
			
		||||
			case 'page-layout': break; // TODO: <style:page-layout>
 | 
			
		||||
			case 'style': break; // 16.2 <style:style>
 | 
			
		||||
			case 'style': // 16.2 <style:style>
 | 
			
		||||
				break;
 | 
			
		||||
			case 'map': break; // 16.3 <style:map>
 | 
			
		||||
			case 'font-face': break; // 16.21 <style:font-face>
 | 
			
		||||
 | 
			
		||||
@ -374,8 +380,10 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'line-break': break; // 6.1.5 <text:line-break>
 | 
			
		||||
			case 'span': break; // 6.1.7 <text:span>
 | 
			
		||||
			case 'p': case '文本串': // 5.1.3 <text:p>
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) textp = (textp.length > 0 ? textp + "\n" : "") + parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
				else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {
 | 
			
		||||
					var ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
					textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
 | 
			
		||||
				} else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				break; // <text:p>
 | 
			
		||||
			case 's': break; // <text:s>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -75,14 +75,16 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
 | 
			
		||||
 | 
			
		||||
		if(ws) {
 | 
			
		||||
			var comments = ws['!comments'];
 | 
			
		||||
			var need_vml = false;
 | 
			
		||||
			if(comments && comments.length > 0) {
 | 
			
		||||
				var cf = "xl/comments" + rId + "." + wbext;
 | 
			
		||||
				zip.file(cf, write_cmnt(comments, cf, opts));
 | 
			
		||||
				ct.comments.push(cf);
 | 
			
		||||
				add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
 | 
			
		||||
				need_vml = true;
 | 
			
		||||
			}
 | 
			
		||||
			if(ws['!legacy']) {
 | 
			
		||||
				zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
				if(need_vml) zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
			}
 | 
			
		||||
			delete ws['!comments'];
 | 
			
		||||
			delete ws['!legacy'];
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ DUKTAPE_VER=2.2.0
 | 
			
		||||
if [ ! -e duktape-$DUKTAPE_VER ]; then
 | 
			
		||||
	if [ ! -e duktape-$DUKTAPE_VER.tar ]; then
 | 
			
		||||
		if [ ! -e duktape-$DUKTAPE_VER.tar.xz ]; then
 | 
			
		||||
			curl -O http://duktape.org/duktape-$DUKTAPE_VER.tar.xz
 | 
			
		||||
			curl -O https://duktape.org/duktape-$DUKTAPE_VER.tar.xz
 | 
			
		||||
		fi
 | 
			
		||||
		xz -d duktape-$DUKTAPE_VER.tar.xz
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										18
									
								
								dist/xlsx.core.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.core.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										97
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										97
									
								
								dist/xlsx.extendscript.js
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -9160,7 +9160,7 @@ module.exports = ZStream;
 | 
			
		||||
/*global global, exports, module, require:false, process:false, Buffer:false, ArrayBuffer:false */
 | 
			
		||||
var XLSX = {};
 | 
			
		||||
function make_xlsx_lib(XLSX){
 | 
			
		||||
XLSX.version = '0.14.1';
 | 
			
		||||
XLSX.version = '0.14.2';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true, window */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -12756,7 +12756,7 @@ function sheet_add_aoa(_ws, data, opts) {
 | 
			
		||||
			if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];
 | 
			
		||||
			else {
 | 
			
		||||
				if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.cellStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.sheetStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				else if(typeof cell.v === 'number') cell.t = 'n';
 | 
			
		||||
				else if(typeof cell.v === 'boolean') cell.t = 'b';
 | 
			
		||||
				else if(cell.v instanceof Date) {
 | 
			
		||||
@ -19115,10 +19115,10 @@ function parse_comments(zip, dirComments, sheets, sheetRels, opts) {
 | 
			
		||||
 | 
			
		||||
function insertCommentsIntoSheet(sheetName, sheet, comments) {
 | 
			
		||||
	var dense = Array.isArray(sheet);
 | 
			
		||||
	var cell, r;
 | 
			
		||||
	var cell;
 | 
			
		||||
	comments.forEach(function(comment) {
 | 
			
		||||
		var r = decode_cell(comment.ref);
 | 
			
		||||
		if(dense) {
 | 
			
		||||
			r = decode_cell(comment.ref);
 | 
			
		||||
			if(!sheet[r.r]) sheet[r.r] = [];
 | 
			
		||||
			cell = sheet[r.r][r.c];
 | 
			
		||||
		} else cell = sheet[comment.ref];
 | 
			
		||||
@ -19127,11 +19127,10 @@ function insertCommentsIntoSheet(sheetName, sheet, comments) {
 | 
			
		||||
			if(dense) sheet[r.r][r.c] = cell;
 | 
			
		||||
			else sheet[comment.ref] = cell;
 | 
			
		||||
			var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1");
 | 
			
		||||
			var thisCell = decode_cell(comment.ref);
 | 
			
		||||
			if(range.s.r > thisCell.r) range.s.r = thisCell.r;
 | 
			
		||||
			if(range.e.r < thisCell.r) range.e.r = thisCell.r;
 | 
			
		||||
			if(range.s.c > thisCell.c) range.s.c = thisCell.c;
 | 
			
		||||
			if(range.e.c < thisCell.c) range.e.c = thisCell.c;
 | 
			
		||||
			if(range.s.r > r.r) range.s.r = r.r;
 | 
			
		||||
			if(range.e.r < r.r) range.e.r = r.r;
 | 
			
		||||
			if(range.s.c > r.c) range.s.c = r.c;
 | 
			
		||||
			if(range.e.c < r.c) range.e.c = r.c;
 | 
			
		||||
			var encoded = encode_range(range);
 | 
			
		||||
			if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
 | 
			
		||||
		}
 | 
			
		||||
@ -19192,7 +19191,7 @@ function write_comments_xml(data) {
 | 
			
		||||
		d[1].forEach(function(c) {
 | 
			
		||||
			/* 18.7.3 CT_Comment */
 | 
			
		||||
			o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : c.t));
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
 | 
			
		||||
			o.push('</text></comment>');
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
@ -21946,7 +21945,7 @@ var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
 | 
			
		||||
var sheetdataregex = /<(?:\w+:)?sheetData>([\s\S]*)<\/(?:\w+:)?sheetData>/;
 | 
			
		||||
var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
 | 
			
		||||
var dimregex = /"(\w*:\w*)"/;
 | 
			
		||||
var colregex = /<(?:\w:)?col[^>]*[\/]?>/g;
 | 
			
		||||
var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
 | 
			
		||||
var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
 | 
			
		||||
var marginregex= /<(?:\w:)?pageMargins[^>]*\/>/g;
 | 
			
		||||
var sheetprregex = /<(?:\w:)?sheetPr(?:[^>a-z][^>]*)?\/>/;
 | 
			
		||||
@ -22388,10 +22387,10 @@ function write_ws_xml_data(ws, opts, idx, wb) {
 | 
			
		||||
				row = rows[R];
 | 
			
		||||
				if(row.hidden) params.hidden = 1;
 | 
			
		||||
				height = -1;
 | 
			
		||||
				if (row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if (row.hpt) height = row.hpt;
 | 
			
		||||
				if (height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if (row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
				if(row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if(row.hpt) height = row.hpt;
 | 
			
		||||
				if(height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if(row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
			}
 | 
			
		||||
			o[o.length] = (writextag('row', r.join(""), params));
 | 
			
		||||
		}
 | 
			
		||||
@ -23773,6 +23772,7 @@ function parse_wb_xml(data, opts) {
 | 
			
		||||
				dname.Name = utf8read(y.name);
 | 
			
		||||
				if(y.comment) dname.Comment = y.comment;
 | 
			
		||||
				if(y.localSheetId) dname.Sheet = +y.localSheetId;
 | 
			
		||||
				if(parsexmlbool(y.hidden||"0")) dname.Hidden = true;
 | 
			
		||||
				dnstart = idx + x.length;
 | 
			
		||||
			}	break;
 | 
			
		||||
			case '</definedName>': {
 | 
			
		||||
@ -23872,11 +23872,14 @@ if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.Cod
 | 
			
		||||
	o[o.length] = (writextag('workbookPr', null, workbookPr));
 | 
			
		||||
 | 
			
		||||
	/* workbookProtection */
 | 
			
		||||
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	var i = 0;
 | 
			
		||||
 | 
			
		||||
	/* bookViews */
 | 
			
		||||
 | 
			
		||||
	o[o.length] = "<sheets>";
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	for(var i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
	for(i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
		var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))});
 | 
			
		||||
		sht.sheetId = ""+(i+1);
 | 
			
		||||
		sht["r:id"] = "rId"+(i+1);
 | 
			
		||||
@ -23897,8 +23900,9 @@ if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.Cod
 | 
			
		||||
			var d = {name:n.Name};
 | 
			
		||||
			if(n.Comment) d.comment = n.Comment;
 | 
			
		||||
			if(n.Sheet != null) d.localSheetId = ""+n.Sheet;
 | 
			
		||||
			if(n.Hidden) d.hidden = "1";
 | 
			
		||||
			if(!n.Ref) return;
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref), d);
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref).replace(/</g, "<").replace(/>/g, ">"), d);
 | 
			
		||||
		});
 | 
			
		||||
		o[o.length] = "</definedNames>";
 | 
			
		||||
	}
 | 
			
		||||
@ -24005,6 +24009,7 @@ function parse_BrtName(data, length, opts) {
 | 
			
		||||
/* [MS-XLSB] 2.1.7.61 Workbook */
 | 
			
		||||
function parse_wb_bin(data, opts) {
 | 
			
		||||
	var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
 | 
			
		||||
	var state = [];
 | 
			
		||||
	var pass = false;
 | 
			
		||||
 | 
			
		||||
	if(!opts) opts = {};
 | 
			
		||||
@ -24080,18 +24085,20 @@ function parse_wb_bin(data, opts) {
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 0x0023: /* 'BrtFRTBegin' */
 | 
			
		||||
				pass = true; break;
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0024: /* 'BrtFRTEnd' */
 | 
			
		||||
				pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */ break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */ break;
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
 | 
			
		||||
			case 0x0010: /* 'BrtFRTArchID$' */ break;
 | 
			
		||||
 | 
			
		||||
			default:
 | 
			
		||||
				if((R_n||"").indexOf("Begin") > 0){/* empty */}
 | 
			
		||||
				else if((R_n||"").indexOf("End") > 0){/* empty */}
 | 
			
		||||
				else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
				else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin" && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
		}
 | 
			
		||||
	}, opts);
 | 
			
		||||
 | 
			
		||||
@ -25705,7 +25712,8 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
 | 
			
		||||
				case 'WsBool':
 | 
			
		||||
					if(val.fDialog) out["!type"] = "dialog";
 | 
			
		||||
					break; // TODO
 | 
			
		||||
				case 'XF': XFs.push(val); break;
 | 
			
		||||
				case 'XF':
 | 
			
		||||
					XFs.push(val); break;
 | 
			
		||||
				case 'ExtSST': break; // TODO
 | 
			
		||||
				case 'BookExt': break; // TODO
 | 
			
		||||
				case 'RichTextStream': break;
 | 
			
		||||
@ -27223,6 +27231,9 @@ var XLSBRecordEnum = {
 | 
			
		||||
0x085D: { n:"BrtModelTimeGroupingCalcCol" },
 | 
			
		||||
0x0C00: { n:"BrtUid" },
 | 
			
		||||
0x0C01: { n:"BrtRevisionPtr" },
 | 
			
		||||
0x13e7: { n:"BrtBeginCalcFeatures" },
 | 
			
		||||
0x13e8: { n:"BrtEndCalcFeatures" },
 | 
			
		||||
0x13e9: { n:"BrtCalcFeature" },
 | 
			
		||||
0xFFFF: { n:"" }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -28176,16 +28187,17 @@ function get_get_computed_style_function(element) {
 | 
			
		||||
/* OpenDocument */
 | 
			
		||||
var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
	/* 6.1.2 White Space Characters */
 | 
			
		||||
	var parse_text_p = function(text) {
 | 
			
		||||
		return unescapexml(text
 | 
			
		||||
		/* 6.1.2 White Space Characters */
 | 
			
		||||
		var fixed = text
 | 
			
		||||
			.replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ")
 | 
			
		||||
			.replace(/<text:s\/>/g," ")
 | 
			
		||||
			.replace(/<text:s text:c="(\d+)"\/>/g, function($$,$1) { return Array(parseInt($1,10)+1).join(" "); })
 | 
			
		||||
			.replace(/<text:tab[^>]*\/>/g,"\t")
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n")
 | 
			
		||||
			.replace(/<[^>]*>/g,"")
 | 
			
		||||
		);
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n");
 | 
			
		||||
		var v = unescapexml(fixed.replace(/<[^>]*>/g,""));
 | 
			
		||||
 | 
			
		||||
		return [v];
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	var number_formats = {
 | 
			
		||||
@ -28217,6 +28229,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
		var Rn, q;
 | 
			
		||||
		var ctag = ({value:""});
 | 
			
		||||
		var textp = "", textpidx = 0, textptag;
 | 
			
		||||
		var textR = [];
 | 
			
		||||
		var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
 | 
			
		||||
		var row_ol = 0;
 | 
			
		||||
		var number_format_map = {};
 | 
			
		||||
@ -28272,11 +28285,12 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};
 | 
			
		||||
				C = -1; break;
 | 
			
		||||
			case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
 | 
			
		||||
				++C;
 | 
			
		||||
				if(Rn[1] !== '/') ++C;
 | 
			
		||||
				if(opts.sheetStubs) {
 | 
			
		||||
					if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }
 | 
			
		||||
					else ws[encode_cell({r:R,c:C})] = {t:'z'};
 | 
			
		||||
				}
 | 
			
		||||
				textp = ""; textR = [];
 | 
			
		||||
				break; /* stub */
 | 
			
		||||
			case 'table-cell': case '数据':
 | 
			
		||||
				if(Rn[0].charAt(Rn[0].length-2) === '/') {
 | 
			
		||||
@ -28345,13 +28359,14 @@ var parse_content_xml = (function() {
 | 
			
		||||
						default:
 | 
			
		||||
							if(q.t === 'string' || q.t === 'text' || !q.t) {
 | 
			
		||||
								q.t = 's';
 | 
			
		||||
								if(ctag['string-value'] != null) textp = unescapexml(ctag['string-value']);
 | 
			
		||||
								if(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }
 | 
			
		||||
							} else throw new Error('Unsupported value type ' + q.t);
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					isstub = false;
 | 
			
		||||
					if(q.t === 's') {
 | 
			
		||||
						q.v = textp || '';
 | 
			
		||||
						if(textR.length) q.R = textR;
 | 
			
		||||
						isstub = textpidx == 0;
 | 
			
		||||
					}
 | 
			
		||||
					if(atag.Target) q.l = atag;
 | 
			
		||||
@ -28376,7 +28391,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
					C += colpeat-1; colpeat = 0;
 | 
			
		||||
					q = {};
 | 
			
		||||
					textp = "";
 | 
			
		||||
					textp = ""; textR = [];
 | 
			
		||||
				}
 | 
			
		||||
				atag = ({});
 | 
			
		||||
				break; // 9.1.4 <table:table-cell>
 | 
			
		||||
@ -28396,12 +28411,13 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(Rn[1]==='/'){
 | 
			
		||||
					if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
 | 
			
		||||
					comment.t = textp;
 | 
			
		||||
					if(textR.length) comment.R = textR;
 | 
			
		||||
					comment.a = creator;
 | 
			
		||||
					comments.push(comment);
 | 
			
		||||
				}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}
 | 
			
		||||
				creator = ""; creatoridx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'creator': // 4.3.2.7 <dc:creator>
 | 
			
		||||
@ -28428,7 +28444,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'chart': // TODO
 | 
			
		||||
				if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'scientific-number': // TODO: <number:scientific-number>
 | 
			
		||||
@ -28457,7 +28473,8 @@ var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
			case 'default-style': // TODO: <style:default-style>
 | 
			
		||||
			case 'page-layout': break; // TODO: <style:page-layout>
 | 
			
		||||
			case 'style': break; // 16.2 <style:style>
 | 
			
		||||
			case 'style': // 16.2 <style:style>
 | 
			
		||||
				break;
 | 
			
		||||
			case 'map': break; // 16.3 <style:map>
 | 
			
		||||
			case 'font-face': break; // 16.21 <style:font-face>
 | 
			
		||||
 | 
			
		||||
@ -28549,8 +28566,10 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'line-break': break; // 6.1.5 <text:line-break>
 | 
			
		||||
			case 'span': break; // 6.1.7 <text:span>
 | 
			
		||||
			case 'p': case '文本串': // 5.1.3 <text:p>
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) textp = (textp.length > 0 ? textp + "\n" : "") + parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
				else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {
 | 
			
		||||
					var ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
					textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
 | 
			
		||||
				} else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				break; // <text:p>
 | 
			
		||||
			case 's': break; // <text:s>
 | 
			
		||||
 | 
			
		||||
@ -29319,14 +29338,16 @@ f = "docProps/app.xml";
 | 
			
		||||
 | 
			
		||||
		if(ws) {
 | 
			
		||||
			var comments = ws['!comments'];
 | 
			
		||||
			var need_vml = false;
 | 
			
		||||
			if(comments && comments.length > 0) {
 | 
			
		||||
				var cf = "xl/comments" + rId + "." + wbext;
 | 
			
		||||
				zip.file(cf, write_cmnt(comments, cf, opts));
 | 
			
		||||
				ct.comments.push(cf);
 | 
			
		||||
				add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
 | 
			
		||||
				need_vml = true;
 | 
			
		||||
			}
 | 
			
		||||
			if(ws['!legacy']) {
 | 
			
		||||
				zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
				if(need_vml) zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
			}
 | 
			
		||||
			delete ws['!comments'];
 | 
			
		||||
			delete ws['!legacy'];
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										32
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										32
									
								
								dist/xlsx.full.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.full.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										97
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										97
									
								
								dist/xlsx.js
									
									
									
										generated
									
									
										vendored
									
									
								
							@ -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.14.1';
 | 
			
		||||
XLSX.version = '0.14.2';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true, window */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -3600,7 +3600,7 @@ function sheet_add_aoa(_ws, data, opts) {
 | 
			
		||||
			if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];
 | 
			
		||||
			else {
 | 
			
		||||
				if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.cellStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.sheetStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				else if(typeof cell.v === 'number') cell.t = 'n';
 | 
			
		||||
				else if(typeof cell.v === 'boolean') cell.t = 'b';
 | 
			
		||||
				else if(cell.v instanceof Date) {
 | 
			
		||||
@ -9959,10 +9959,10 @@ function parse_comments(zip, dirComments, sheets, sheetRels, opts) {
 | 
			
		||||
 | 
			
		||||
function insertCommentsIntoSheet(sheetName, sheet, comments) {
 | 
			
		||||
	var dense = Array.isArray(sheet);
 | 
			
		||||
	var cell, r;
 | 
			
		||||
	var cell;
 | 
			
		||||
	comments.forEach(function(comment) {
 | 
			
		||||
		var r = decode_cell(comment.ref);
 | 
			
		||||
		if(dense) {
 | 
			
		||||
			r = decode_cell(comment.ref);
 | 
			
		||||
			if(!sheet[r.r]) sheet[r.r] = [];
 | 
			
		||||
			cell = sheet[r.r][r.c];
 | 
			
		||||
		} else cell = sheet[comment.ref];
 | 
			
		||||
@ -9971,11 +9971,10 @@ function insertCommentsIntoSheet(sheetName, sheet, comments) {
 | 
			
		||||
			if(dense) sheet[r.r][r.c] = cell;
 | 
			
		||||
			else sheet[comment.ref] = cell;
 | 
			
		||||
			var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1");
 | 
			
		||||
			var thisCell = decode_cell(comment.ref);
 | 
			
		||||
			if(range.s.r > thisCell.r) range.s.r = thisCell.r;
 | 
			
		||||
			if(range.e.r < thisCell.r) range.e.r = thisCell.r;
 | 
			
		||||
			if(range.s.c > thisCell.c) range.s.c = thisCell.c;
 | 
			
		||||
			if(range.e.c < thisCell.c) range.e.c = thisCell.c;
 | 
			
		||||
			if(range.s.r > r.r) range.s.r = r.r;
 | 
			
		||||
			if(range.e.r < r.r) range.e.r = r.r;
 | 
			
		||||
			if(range.s.c > r.c) range.s.c = r.c;
 | 
			
		||||
			if(range.e.c < r.c) range.e.c = r.c;
 | 
			
		||||
			var encoded = encode_range(range);
 | 
			
		||||
			if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
 | 
			
		||||
		}
 | 
			
		||||
@ -10036,7 +10035,7 @@ function write_comments_xml(data) {
 | 
			
		||||
		d[1].forEach(function(c) {
 | 
			
		||||
			/* 18.7.3 CT_Comment */
 | 
			
		||||
			o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : c.t));
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
 | 
			
		||||
			o.push('</text></comment>');
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
@ -12790,7 +12789,7 @@ var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
 | 
			
		||||
var sheetdataregex = /<(?:\w+:)?sheetData>([\s\S]*)<\/(?:\w+:)?sheetData>/;
 | 
			
		||||
var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
 | 
			
		||||
var dimregex = /"(\w*:\w*)"/;
 | 
			
		||||
var colregex = /<(?:\w:)?col[^>]*[\/]?>/g;
 | 
			
		||||
var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
 | 
			
		||||
var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
 | 
			
		||||
var marginregex= /<(?:\w:)?pageMargins[^>]*\/>/g;
 | 
			
		||||
var sheetprregex = /<(?:\w:)?sheetPr(?:[^>a-z][^>]*)?\/>/;
 | 
			
		||||
@ -13232,10 +13231,10 @@ function write_ws_xml_data(ws, opts, idx, wb) {
 | 
			
		||||
				row = rows[R];
 | 
			
		||||
				if(row.hidden) params.hidden = 1;
 | 
			
		||||
				height = -1;
 | 
			
		||||
				if (row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if (row.hpt) height = row.hpt;
 | 
			
		||||
				if (height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if (row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
				if(row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if(row.hpt) height = row.hpt;
 | 
			
		||||
				if(height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if(row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
			}
 | 
			
		||||
			o[o.length] = (writextag('row', r.join(""), params));
 | 
			
		||||
		}
 | 
			
		||||
@ -14617,6 +14616,7 @@ function parse_wb_xml(data, opts) {
 | 
			
		||||
				dname.Name = utf8read(y.name);
 | 
			
		||||
				if(y.comment) dname.Comment = y.comment;
 | 
			
		||||
				if(y.localSheetId) dname.Sheet = +y.localSheetId;
 | 
			
		||||
				if(parsexmlbool(y.hidden||"0")) dname.Hidden = true;
 | 
			
		||||
				dnstart = idx + x.length;
 | 
			
		||||
			}	break;
 | 
			
		||||
			case '</definedName>': {
 | 
			
		||||
@ -14716,11 +14716,14 @@ if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.Cod
 | 
			
		||||
	o[o.length] = (writextag('workbookPr', null, workbookPr));
 | 
			
		||||
 | 
			
		||||
	/* workbookProtection */
 | 
			
		||||
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	var i = 0;
 | 
			
		||||
 | 
			
		||||
	/* bookViews */
 | 
			
		||||
 | 
			
		||||
	o[o.length] = "<sheets>";
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	for(var i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
	for(i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
		var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))});
 | 
			
		||||
		sht.sheetId = ""+(i+1);
 | 
			
		||||
		sht["r:id"] = "rId"+(i+1);
 | 
			
		||||
@ -14741,8 +14744,9 @@ if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.Cod
 | 
			
		||||
			var d = {name:n.Name};
 | 
			
		||||
			if(n.Comment) d.comment = n.Comment;
 | 
			
		||||
			if(n.Sheet != null) d.localSheetId = ""+n.Sheet;
 | 
			
		||||
			if(n.Hidden) d.hidden = "1";
 | 
			
		||||
			if(!n.Ref) return;
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref), d);
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref).replace(/</g, "<").replace(/>/g, ">"), d);
 | 
			
		||||
		});
 | 
			
		||||
		o[o.length] = "</definedNames>";
 | 
			
		||||
	}
 | 
			
		||||
@ -14849,6 +14853,7 @@ function parse_BrtName(data, length, opts) {
 | 
			
		||||
/* [MS-XLSB] 2.1.7.61 Workbook */
 | 
			
		||||
function parse_wb_bin(data, opts) {
 | 
			
		||||
	var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
 | 
			
		||||
	var state = [];
 | 
			
		||||
	var pass = false;
 | 
			
		||||
 | 
			
		||||
	if(!opts) opts = {};
 | 
			
		||||
@ -14924,18 +14929,20 @@ function parse_wb_bin(data, opts) {
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 0x0023: /* 'BrtFRTBegin' */
 | 
			
		||||
				pass = true; break;
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0024: /* 'BrtFRTEnd' */
 | 
			
		||||
				pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */ break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */ break;
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
 | 
			
		||||
			case 0x0010: /* 'BrtFRTArchID$' */ break;
 | 
			
		||||
 | 
			
		||||
			default:
 | 
			
		||||
				if((R_n||"").indexOf("Begin") > 0){/* empty */}
 | 
			
		||||
				else if((R_n||"").indexOf("End") > 0){/* empty */}
 | 
			
		||||
				else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
				else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin" && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
		}
 | 
			
		||||
	}, opts);
 | 
			
		||||
 | 
			
		||||
@ -16549,7 +16556,8 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
 | 
			
		||||
				case 'WsBool':
 | 
			
		||||
					if(val.fDialog) out["!type"] = "dialog";
 | 
			
		||||
					break; // TODO
 | 
			
		||||
				case 'XF': XFs.push(val); break;
 | 
			
		||||
				case 'XF':
 | 
			
		||||
					XFs.push(val); break;
 | 
			
		||||
				case 'ExtSST': break; // TODO
 | 
			
		||||
				case 'BookExt': break; // TODO
 | 
			
		||||
				case 'RichTextStream': break;
 | 
			
		||||
@ -18067,6 +18075,9 @@ var XLSBRecordEnum = {
 | 
			
		||||
0x085D: { n:"BrtModelTimeGroupingCalcCol" },
 | 
			
		||||
0x0C00: { n:"BrtUid" },
 | 
			
		||||
0x0C01: { n:"BrtRevisionPtr" },
 | 
			
		||||
0x13e7: { n:"BrtBeginCalcFeatures" },
 | 
			
		||||
0x13e8: { n:"BrtEndCalcFeatures" },
 | 
			
		||||
0x13e9: { n:"BrtCalcFeature" },
 | 
			
		||||
0xFFFF: { n:"" }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -19020,16 +19031,17 @@ function get_get_computed_style_function(element) {
 | 
			
		||||
/* OpenDocument */
 | 
			
		||||
var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
	/* 6.1.2 White Space Characters */
 | 
			
		||||
	var parse_text_p = function(text) {
 | 
			
		||||
		return unescapexml(text
 | 
			
		||||
		/* 6.1.2 White Space Characters */
 | 
			
		||||
		var fixed = text
 | 
			
		||||
			.replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ")
 | 
			
		||||
			.replace(/<text:s\/>/g," ")
 | 
			
		||||
			.replace(/<text:s text:c="(\d+)"\/>/g, function($$,$1) { return Array(parseInt($1,10)+1).join(" "); })
 | 
			
		||||
			.replace(/<text:tab[^>]*\/>/g,"\t")
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n")
 | 
			
		||||
			.replace(/<[^>]*>/g,"")
 | 
			
		||||
		);
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n");
 | 
			
		||||
		var v = unescapexml(fixed.replace(/<[^>]*>/g,""));
 | 
			
		||||
 | 
			
		||||
		return [v];
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	var number_formats = {
 | 
			
		||||
@ -19061,6 +19073,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
		var Rn, q;
 | 
			
		||||
		var ctag = ({value:""});
 | 
			
		||||
		var textp = "", textpidx = 0, textptag;
 | 
			
		||||
		var textR = [];
 | 
			
		||||
		var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
 | 
			
		||||
		var row_ol = 0;
 | 
			
		||||
		var number_format_map = {};
 | 
			
		||||
@ -19116,11 +19129,12 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};
 | 
			
		||||
				C = -1; break;
 | 
			
		||||
			case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
 | 
			
		||||
				++C;
 | 
			
		||||
				if(Rn[1] !== '/') ++C;
 | 
			
		||||
				if(opts.sheetStubs) {
 | 
			
		||||
					if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }
 | 
			
		||||
					else ws[encode_cell({r:R,c:C})] = {t:'z'};
 | 
			
		||||
				}
 | 
			
		||||
				textp = ""; textR = [];
 | 
			
		||||
				break; /* stub */
 | 
			
		||||
			case 'table-cell': case '数据':
 | 
			
		||||
				if(Rn[0].charAt(Rn[0].length-2) === '/') {
 | 
			
		||||
@ -19189,13 +19203,14 @@ var parse_content_xml = (function() {
 | 
			
		||||
						default:
 | 
			
		||||
							if(q.t === 'string' || q.t === 'text' || !q.t) {
 | 
			
		||||
								q.t = 's';
 | 
			
		||||
								if(ctag['string-value'] != null) textp = unescapexml(ctag['string-value']);
 | 
			
		||||
								if(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }
 | 
			
		||||
							} else throw new Error('Unsupported value type ' + q.t);
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					isstub = false;
 | 
			
		||||
					if(q.t === 's') {
 | 
			
		||||
						q.v = textp || '';
 | 
			
		||||
						if(textR.length) q.R = textR;
 | 
			
		||||
						isstub = textpidx == 0;
 | 
			
		||||
					}
 | 
			
		||||
					if(atag.Target) q.l = atag;
 | 
			
		||||
@ -19220,7 +19235,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
					C += colpeat-1; colpeat = 0;
 | 
			
		||||
					q = {};
 | 
			
		||||
					textp = "";
 | 
			
		||||
					textp = ""; textR = [];
 | 
			
		||||
				}
 | 
			
		||||
				atag = ({});
 | 
			
		||||
				break; // 9.1.4 <table:table-cell>
 | 
			
		||||
@ -19240,12 +19255,13 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(Rn[1]==='/'){
 | 
			
		||||
					if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
 | 
			
		||||
					comment.t = textp;
 | 
			
		||||
					if(textR.length) comment.R = textR;
 | 
			
		||||
					comment.a = creator;
 | 
			
		||||
					comments.push(comment);
 | 
			
		||||
				}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}
 | 
			
		||||
				creator = ""; creatoridx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'creator': // 4.3.2.7 <dc:creator>
 | 
			
		||||
@ -19272,7 +19288,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'chart': // TODO
 | 
			
		||||
				if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'scientific-number': // TODO: <number:scientific-number>
 | 
			
		||||
@ -19301,7 +19317,8 @@ var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
			case 'default-style': // TODO: <style:default-style>
 | 
			
		||||
			case 'page-layout': break; // TODO: <style:page-layout>
 | 
			
		||||
			case 'style': break; // 16.2 <style:style>
 | 
			
		||||
			case 'style': // 16.2 <style:style>
 | 
			
		||||
				break;
 | 
			
		||||
			case 'map': break; // 16.3 <style:map>
 | 
			
		||||
			case 'font-face': break; // 16.21 <style:font-face>
 | 
			
		||||
 | 
			
		||||
@ -19393,8 +19410,10 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'line-break': break; // 6.1.5 <text:line-break>
 | 
			
		||||
			case 'span': break; // 6.1.7 <text:span>
 | 
			
		||||
			case 'p': case '文本串': // 5.1.3 <text:p>
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) textp = (textp.length > 0 ? textp + "\n" : "") + parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
				else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {
 | 
			
		||||
					var ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
					textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
 | 
			
		||||
				} else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				break; // <text:p>
 | 
			
		||||
			case 's': break; // <text:s>
 | 
			
		||||
 | 
			
		||||
@ -20163,14 +20182,16 @@ f = "docProps/app.xml";
 | 
			
		||||
 | 
			
		||||
		if(ws) {
 | 
			
		||||
			var comments = ws['!comments'];
 | 
			
		||||
			var need_vml = false;
 | 
			
		||||
			if(comments && comments.length > 0) {
 | 
			
		||||
				var cf = "xl/comments" + rId + "." + wbext;
 | 
			
		||||
				zip.file(cf, write_cmnt(comments, cf, opts));
 | 
			
		||||
				ct.comments.push(cf);
 | 
			
		||||
				add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
 | 
			
		||||
				need_vml = true;
 | 
			
		||||
			}
 | 
			
		||||
			if(ws['!legacy']) {
 | 
			
		||||
				zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
				if(need_vml) zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
			}
 | 
			
		||||
			delete ws['!comments'];
 | 
			
		||||
			delete ws['!legacy'];
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										26
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										26
									
								
								dist/xlsx.min.js
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/xlsx.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								dist/xlsx.min.map
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -21,8 +21,6 @@ enhancements, additional features like styling, and dedicated support.
 | 
			
		||||
 | 
			
		||||
[**Issues and Bug Reports**](https://github.com/sheetjs/js-xlsx/issues)
 | 
			
		||||
 | 
			
		||||
[**Other General Support Issues**](https://discourse.sheetjs.com)
 | 
			
		||||
 | 
			
		||||
[**File format support for known spreadsheet data formats:**](#file-formats)
 | 
			
		||||
 | 
			
		||||
<details>
 | 
			
		||||
@ -43,6 +41,5 @@ enhancements, additional features like styling, and dedicated support.
 | 
			
		||||
[](https://coveralls.io/r/SheetJS/js-xlsx?branch=master)
 | 
			
		||||
[](https://david-dm.org/sheetjs/js-xlsx)
 | 
			
		||||
[](https://npmjs.org/package/xlsx)
 | 
			
		||||
[](https://ghit.me/repo/sheetjs/js-xlsx)
 | 
			
		||||
[](https://github.com/SheetJS/js-xlsx)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -21,8 +21,6 @@ enhancements, additional features like styling, and dedicated support.
 | 
			
		||||
 | 
			
		||||
[**Issues and Bug Reports**](https://github.com/sheetjs/js-xlsx/issues)
 | 
			
		||||
 | 
			
		||||
[**Other General Support Issues**](https://discourse.sheetjs.com)
 | 
			
		||||
 | 
			
		||||
[**File format support for known spreadsheet data formats:**](#file-formats)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -40,7 +38,6 @@ enhancements, additional features like styling, and dedicated support.
 | 
			
		||||
[](https://coveralls.io/r/SheetJS/js-xlsx?branch=master)
 | 
			
		||||
[](https://david-dm.org/sheetjs/js-xlsx)
 | 
			
		||||
[](https://npmjs.org/package/xlsx)
 | 
			
		||||
[](https://ghit.me/repo/sheetjs/js-xlsx)
 | 
			
		||||
[](https://github.com/SheetJS/js-xlsx)
 | 
			
		||||
 | 
			
		||||
## Table of Contents
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
	"name": "xlsx",
 | 
			
		||||
	"version": "0.14.1",
 | 
			
		||||
	"version": "0.14.2",
 | 
			
		||||
	"author": "sheetjs",
 | 
			
		||||
	"description": "SheetJS Spreadsheet data parser and writer",
 | 
			
		||||
	"keywords": [
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										99
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										99
									
								
								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.14.1';
 | 
			
		||||
XLSX.version = '0.14.2';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*:: declare var cptable:any; */
 | 
			
		||||
/*global cptable:true, window */
 | 
			
		||||
@ -3692,7 +3692,7 @@ function sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksh
 | 
			
		||||
			if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];
 | 
			
		||||
			else {
 | 
			
		||||
				if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.cellStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.sheetStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				else if(typeof cell.v === 'number') cell.t = 'n';
 | 
			
		||||
				else if(typeof cell.v === 'boolean') cell.t = 'b';
 | 
			
		||||
				else if(cell.v instanceof Date) {
 | 
			
		||||
@ -10059,10 +10059,10 @@ function parse_comments(zip, dirComments, sheets, sheetRels, opts) {
 | 
			
		||||
 | 
			
		||||
function insertCommentsIntoSheet(sheetName, sheet, comments/*:Array<RawComment>*/) {
 | 
			
		||||
	var dense = Array.isArray(sheet);
 | 
			
		||||
	var cell/*:Cell*/, r;
 | 
			
		||||
	var cell/*:Cell*/;
 | 
			
		||||
	comments.forEach(function(comment) {
 | 
			
		||||
		var r = decode_cell(comment.ref);
 | 
			
		||||
		if(dense) {
 | 
			
		||||
			r = decode_cell(comment.ref);
 | 
			
		||||
			if(!sheet[r.r]) sheet[r.r] = [];
 | 
			
		||||
			cell = sheet[r.r][r.c];
 | 
			
		||||
		} else cell = sheet[comment.ref];
 | 
			
		||||
@ -10071,11 +10071,10 @@ function insertCommentsIntoSheet(sheetName, sheet, comments/*:Array<RawComment>*
 | 
			
		||||
			if(dense) sheet[r.r][r.c] = cell;
 | 
			
		||||
			else sheet[comment.ref] = cell;
 | 
			
		||||
			var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1");
 | 
			
		||||
			var thisCell = decode_cell(comment.ref);
 | 
			
		||||
			if(range.s.r > thisCell.r) range.s.r = thisCell.r;
 | 
			
		||||
			if(range.e.r < thisCell.r) range.e.r = thisCell.r;
 | 
			
		||||
			if(range.s.c > thisCell.c) range.s.c = thisCell.c;
 | 
			
		||||
			if(range.e.c < thisCell.c) range.e.c = thisCell.c;
 | 
			
		||||
			if(range.s.r > r.r) range.s.r = r.r;
 | 
			
		||||
			if(range.e.r < r.r) range.e.r = r.r;
 | 
			
		||||
			if(range.s.c > r.c) range.s.c = r.c;
 | 
			
		||||
			if(range.e.c < r.c) range.e.c = r.c;
 | 
			
		||||
			var encoded = encode_range(range);
 | 
			
		||||
			if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
 | 
			
		||||
		}
 | 
			
		||||
@ -10136,7 +10135,7 @@ function write_comments_xml(data/*::, opts*/) {
 | 
			
		||||
		d[1].forEach(function(c) {
 | 
			
		||||
			/* 18.7.3 CT_Comment */
 | 
			
		||||
			o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : c.t));
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
 | 
			
		||||
			o.push('</text></comment>');
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
@ -12891,7 +12890,7 @@ var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
 | 
			
		||||
var sheetdataregex = /<(?:\w+:)?sheetData>([\s\S]*)<\/(?:\w+:)?sheetData>/;
 | 
			
		||||
var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
 | 
			
		||||
var dimregex = /"(\w*:\w*)"/;
 | 
			
		||||
var colregex = /<(?:\w:)?col[^>]*[\/]?>/g;
 | 
			
		||||
var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
 | 
			
		||||
var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
 | 
			
		||||
var marginregex= /<(?:\w:)?pageMargins[^>]*\/>/g;
 | 
			
		||||
var sheetprregex = /<(?:\w:)?sheetPr(?:[^>a-z][^>]*)?\/>/;
 | 
			
		||||
@ -13333,10 +13332,10 @@ function write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook
 | 
			
		||||
				row = rows[R];
 | 
			
		||||
				if(row.hidden) params.hidden = 1;
 | 
			
		||||
				height = -1;
 | 
			
		||||
				if (row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if (row.hpt) height = row.hpt;
 | 
			
		||||
				if (height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if (row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
				if(row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if(row.hpt) height = row.hpt;
 | 
			
		||||
				if(height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if(row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
			}
 | 
			
		||||
			o[o.length] = (writextag('row', r.join(""), params));
 | 
			
		||||
		}
 | 
			
		||||
@ -14719,6 +14718,7 @@ function parse_wb_xml(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
				dname.Name = utf8read(y.name);
 | 
			
		||||
				if(y.comment) dname.Comment = y.comment;
 | 
			
		||||
				if(y.localSheetId) dname.Sheet = +y.localSheetId;
 | 
			
		||||
				if(parsexmlbool(y.hidden||"0")) dname.Hidden = true;
 | 
			
		||||
				dnstart = idx + x.length;
 | 
			
		||||
			}	break;
 | 
			
		||||
			case '</definedName>': {
 | 
			
		||||
@ -14820,11 +14820,14 @@ function write_wb_xml(wb/*:Workbook*//*::, opts:?WriteOpts*/)/*:string*/ {
 | 
			
		||||
	o[o.length] = (writextag('workbookPr', null, workbookPr));
 | 
			
		||||
 | 
			
		||||
	/* workbookProtection */
 | 
			
		||||
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	var i = 0;
 | 
			
		||||
 | 
			
		||||
	/* bookViews */
 | 
			
		||||
 | 
			
		||||
	o[o.length] = "<sheets>";
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	for(var i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
	for(i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
		var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))}/*:any*/);
 | 
			
		||||
		sht.sheetId = ""+(i+1);
 | 
			
		||||
		sht["r:id"] = "rId"+(i+1);
 | 
			
		||||
@ -14845,8 +14848,9 @@ function write_wb_xml(wb/*:Workbook*//*::, opts:?WriteOpts*/)/*:string*/ {
 | 
			
		||||
			var d/*:any*/ = {name:n.Name};
 | 
			
		||||
			if(n.Comment) d.comment = n.Comment;
 | 
			
		||||
			if(n.Sheet != null) d.localSheetId = ""+n.Sheet;
 | 
			
		||||
			if(n.Hidden) d.hidden = "1";
 | 
			
		||||
			if(!n.Ref) return;
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref), d);
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref).replace(/</g, "<").replace(/>/g, ">"), d);
 | 
			
		||||
		});
 | 
			
		||||
		o[o.length] = "</definedNames>";
 | 
			
		||||
	}
 | 
			
		||||
@ -14953,6 +14957,7 @@ function parse_BrtName(data, length, opts) {
 | 
			
		||||
/* [MS-XLSB] 2.1.7.61 Workbook */
 | 
			
		||||
function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
	var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
 | 
			
		||||
	var state/*:Array<string>*/ = [];
 | 
			
		||||
	var pass = false;
 | 
			
		||||
 | 
			
		||||
	if(!opts) opts = {};
 | 
			
		||||
@ -15028,18 +15033,20 @@ function parse_wb_bin(data, opts)/*:WorkbookFile*/ {
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 0x0023: /* 'BrtFRTBegin' */
 | 
			
		||||
				pass = true; break;
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0024: /* 'BrtFRTEnd' */
 | 
			
		||||
				pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */ break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */ break;
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
 | 
			
		||||
			case 0x0010: /* 'BrtFRTArchID$' */ break;
 | 
			
		||||
 | 
			
		||||
			default:
 | 
			
		||||
				if((R_n||"").indexOf("Begin") > 0){/* empty */}
 | 
			
		||||
				else if((R_n||"").indexOf("End") > 0){/* empty */}
 | 
			
		||||
				else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
				else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin" && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
		}
 | 
			
		||||
	}, opts);
 | 
			
		||||
 | 
			
		||||
@ -16663,7 +16670,8 @@ function parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {
 | 
			
		||||
				case 'WsBool':
 | 
			
		||||
					if(val.fDialog) out["!type"] = "dialog";
 | 
			
		||||
					break; // TODO
 | 
			
		||||
				case 'XF': XFs.push(val); break;
 | 
			
		||||
				case 'XF':
 | 
			
		||||
					XFs.push(val); break;
 | 
			
		||||
				case 'ExtSST': break; // TODO
 | 
			
		||||
				case 'BookExt': break; // TODO
 | 
			
		||||
				case 'RichTextStream': break;
 | 
			
		||||
@ -18182,6 +18190,9 @@ var XLSBRecordEnum = {
 | 
			
		||||
	/*::[*/0x085D/*::]*/: { n:"BrtModelTimeGroupingCalcCol" },
 | 
			
		||||
	/*::[*/0x0C00/*::]*/: { n:"BrtUid" },
 | 
			
		||||
	/*::[*/0x0C01/*::]*/: { n:"BrtRevisionPtr" },
 | 
			
		||||
	/*::[*/0x13e7/*::]*/: { n:"BrtBeginCalcFeatures" },
 | 
			
		||||
	/*::[*/0x13e8/*::]*/: { n:"BrtEndCalcFeatures" },
 | 
			
		||||
	/*::[*/0x13e9/*::]*/: { n:"BrtCalcFeature" },
 | 
			
		||||
	/*::[*/0xFFFF/*::]*/: { n:"" }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -19136,16 +19147,17 @@ function get_get_computed_style_function(element/*:HTMLElement*/)/*:?function*/
 | 
			
		||||
/* OpenDocument */
 | 
			
		||||
var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
	/* 6.1.2 White Space Characters */
 | 
			
		||||
	var parse_text_p = function(text/*:string*//*::, tag*/)/*:string*/ {
 | 
			
		||||
		return unescapexml(text
 | 
			
		||||
	var parse_text_p = function(text/*:string*//*::, tag*/)/*:Array<any>*/ {
 | 
			
		||||
		/* 6.1.2 White Space Characters */
 | 
			
		||||
		var fixed = text
 | 
			
		||||
			.replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ")
 | 
			
		||||
			.replace(/<text:s\/>/g," ")
 | 
			
		||||
			.replace(/<text:s text:c="(\d+)"\/>/g, function($$,$1) { return Array(parseInt($1,10)+1).join(" "); })
 | 
			
		||||
			.replace(/<text:tab[^>]*\/>/g,"\t")
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n")
 | 
			
		||||
			.replace(/<[^>]*>/g,"")
 | 
			
		||||
		);
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n");
 | 
			
		||||
		var v = unescapexml(fixed.replace(/<[^>]*>/g,""));
 | 
			
		||||
 | 
			
		||||
		return [v];
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	var number_formats = {
 | 
			
		||||
@ -19177,6 +19189,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
		var Rn, q/*:: :any = ({t:"", v:null, z:null, w:"",c:[],}:any)*/;
 | 
			
		||||
		var ctag = ({value:""}/*:any*/);
 | 
			
		||||
		var textp = "", textpidx = 0, textptag/*:: = {}*/;
 | 
			
		||||
		var textR = [];
 | 
			
		||||
		var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
 | 
			
		||||
		var row_ol = 0;
 | 
			
		||||
		var number_format_map = {};
 | 
			
		||||
@ -19232,11 +19245,12 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};
 | 
			
		||||
				C = -1; break;
 | 
			
		||||
			case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
 | 
			
		||||
				++C;
 | 
			
		||||
				if(Rn[1] !== '/') ++C;
 | 
			
		||||
				if(opts.sheetStubs) {
 | 
			
		||||
					if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }
 | 
			
		||||
					else ws[encode_cell({r:R,c:C})] = {t:'z'};
 | 
			
		||||
				}
 | 
			
		||||
				textp = ""; textR = [];
 | 
			
		||||
				break; /* stub */
 | 
			
		||||
			case 'table-cell': case '数据':
 | 
			
		||||
				if(Rn[0].charAt(Rn[0].length-2) === '/') {
 | 
			
		||||
@ -19305,13 +19319,14 @@ var parse_content_xml = (function() {
 | 
			
		||||
						default:
 | 
			
		||||
							if(q.t === 'string' || q.t === 'text' || !q.t) {
 | 
			
		||||
								q.t = 's';
 | 
			
		||||
								if(ctag['string-value'] != null) textp = unescapexml(ctag['string-value']);
 | 
			
		||||
								if(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }
 | 
			
		||||
							} else throw new Error('Unsupported value type ' + q.t);
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					isstub = false;
 | 
			
		||||
					if(q.t === 's') {
 | 
			
		||||
						q.v = textp || '';
 | 
			
		||||
						if(textR.length) q.R = textR;
 | 
			
		||||
						isstub = textpidx == 0;
 | 
			
		||||
					}
 | 
			
		||||
					if(atag.Target) q.l = atag;
 | 
			
		||||
@ -19336,7 +19351,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
					C += colpeat-1; colpeat = 0;
 | 
			
		||||
					q = {/*:: t:"", v:null, z:null, w:"",c:[]*/};
 | 
			
		||||
					textp = "";
 | 
			
		||||
					textp = ""; textR = [];
 | 
			
		||||
				}
 | 
			
		||||
				atag = ({}/*:any*/);
 | 
			
		||||
				break; // 9.1.4 <table:table-cell>
 | 
			
		||||
@ -19356,12 +19371,13 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(Rn[1]==='/'){
 | 
			
		||||
					if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
 | 
			
		||||
					comment.t = textp;
 | 
			
		||||
					if(textR.length) comment.R = textR;
 | 
			
		||||
					comment.a = creator;
 | 
			
		||||
					comments.push(comment);
 | 
			
		||||
				}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}
 | 
			
		||||
				creator = ""; creatoridx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'creator': // 4.3.2.7 <dc:creator>
 | 
			
		||||
@ -19388,7 +19404,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'chart': // TODO
 | 
			
		||||
				if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'scientific-number': // TODO: <number:scientific-number>
 | 
			
		||||
@ -19417,7 +19433,8 @@ var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
			case 'default-style': // TODO: <style:default-style>
 | 
			
		||||
			case 'page-layout': break; // TODO: <style:page-layout>
 | 
			
		||||
			case 'style': break; // 16.2 <style:style>
 | 
			
		||||
			case 'style': // 16.2 <style:style>
 | 
			
		||||
				break;
 | 
			
		||||
			case 'map': break; // 16.3 <style:map>
 | 
			
		||||
			case 'font-face': break; // 16.21 <style:font-face>
 | 
			
		||||
 | 
			
		||||
@ -19509,8 +19526,10 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'line-break': break; // 6.1.5 <text:line-break>
 | 
			
		||||
			case 'span': break; // 6.1.7 <text:span>
 | 
			
		||||
			case 'p': case '文本串': // 5.1.3 <text:p>
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) textp = (textp.length > 0 ? textp + "\n" : "") + parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
				else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {
 | 
			
		||||
					var ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
					textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
 | 
			
		||||
				} else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				break; // <text:p>
 | 
			
		||||
			case 's': break; // <text:s>
 | 
			
		||||
 | 
			
		||||
@ -20284,14 +20303,16 @@ function write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {
 | 
			
		||||
 | 
			
		||||
		if(ws) {
 | 
			
		||||
			var comments = ws['!comments'];
 | 
			
		||||
			var need_vml = false;
 | 
			
		||||
			if(comments && comments.length > 0) {
 | 
			
		||||
				var cf = "xl/comments" + rId + "." + wbext;
 | 
			
		||||
				zip.file(cf, write_cmnt(comments, cf, opts));
 | 
			
		||||
				ct.comments.push(cf);
 | 
			
		||||
				add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
 | 
			
		||||
				need_vml = true;
 | 
			
		||||
			}
 | 
			
		||||
			if(ws['!legacy']) {
 | 
			
		||||
				zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
				if(need_vml) zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
			}
 | 
			
		||||
			delete ws['!comments'];
 | 
			
		||||
			delete ws['!legacy'];
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										97
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										97
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							@ -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.14.1';
 | 
			
		||||
XLSX.version = '0.14.2';
 | 
			
		||||
var current_codepage = 1200, current_ansi = 1252;
 | 
			
		||||
/*global cptable:true, window */
 | 
			
		||||
if(typeof module !== "undefined" && typeof require !== 'undefined') {
 | 
			
		||||
@ -3600,7 +3600,7 @@ function sheet_add_aoa(_ws, data, opts) {
 | 
			
		||||
			if(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];
 | 
			
		||||
			else {
 | 
			
		||||
				if(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.cellStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				if(cell.v === null) { if(cell.f) cell.t = 'n'; else if(!o.sheetStubs) continue; else cell.t = 'z'; }
 | 
			
		||||
				else if(typeof cell.v === 'number') cell.t = 'n';
 | 
			
		||||
				else if(typeof cell.v === 'boolean') cell.t = 'b';
 | 
			
		||||
				else if(cell.v instanceof Date) {
 | 
			
		||||
@ -9959,10 +9959,10 @@ function parse_comments(zip, dirComments, sheets, sheetRels, opts) {
 | 
			
		||||
 | 
			
		||||
function insertCommentsIntoSheet(sheetName, sheet, comments) {
 | 
			
		||||
	var dense = Array.isArray(sheet);
 | 
			
		||||
	var cell, r;
 | 
			
		||||
	var cell;
 | 
			
		||||
	comments.forEach(function(comment) {
 | 
			
		||||
		var r = decode_cell(comment.ref);
 | 
			
		||||
		if(dense) {
 | 
			
		||||
			r = decode_cell(comment.ref);
 | 
			
		||||
			if(!sheet[r.r]) sheet[r.r] = [];
 | 
			
		||||
			cell = sheet[r.r][r.c];
 | 
			
		||||
		} else cell = sheet[comment.ref];
 | 
			
		||||
@ -9971,11 +9971,10 @@ function insertCommentsIntoSheet(sheetName, sheet, comments) {
 | 
			
		||||
			if(dense) sheet[r.r][r.c] = cell;
 | 
			
		||||
			else sheet[comment.ref] = cell;
 | 
			
		||||
			var range = safe_decode_range(sheet["!ref"]||"BDWGO1000001:A1");
 | 
			
		||||
			var thisCell = decode_cell(comment.ref);
 | 
			
		||||
			if(range.s.r > thisCell.r) range.s.r = thisCell.r;
 | 
			
		||||
			if(range.e.r < thisCell.r) range.e.r = thisCell.r;
 | 
			
		||||
			if(range.s.c > thisCell.c) range.s.c = thisCell.c;
 | 
			
		||||
			if(range.e.c < thisCell.c) range.e.c = thisCell.c;
 | 
			
		||||
			if(range.s.r > r.r) range.s.r = r.r;
 | 
			
		||||
			if(range.e.r < r.r) range.e.r = r.r;
 | 
			
		||||
			if(range.s.c > r.c) range.s.c = r.c;
 | 
			
		||||
			if(range.e.c < r.c) range.e.c = r.c;
 | 
			
		||||
			var encoded = encode_range(range);
 | 
			
		||||
			if (encoded !== sheet["!ref"]) sheet["!ref"] = encoded;
 | 
			
		||||
		}
 | 
			
		||||
@ -10036,7 +10035,7 @@ function write_comments_xml(data) {
 | 
			
		||||
		d[1].forEach(function(c) {
 | 
			
		||||
			/* 18.7.3 CT_Comment */
 | 
			
		||||
			o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : c.t));
 | 
			
		||||
			o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
 | 
			
		||||
			o.push('</text></comment>');
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
@ -12790,7 +12789,7 @@ var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
 | 
			
		||||
var sheetdataregex = /<(?:\w+:)?sheetData>([\s\S]*)<\/(?:\w+:)?sheetData>/;
 | 
			
		||||
var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
 | 
			
		||||
var dimregex = /"(\w*:\w*)"/;
 | 
			
		||||
var colregex = /<(?:\w:)?col[^>]*[\/]?>/g;
 | 
			
		||||
var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
 | 
			
		||||
var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
 | 
			
		||||
var marginregex= /<(?:\w:)?pageMargins[^>]*\/>/g;
 | 
			
		||||
var sheetprregex = /<(?:\w:)?sheetPr(?:[^>a-z][^>]*)?\/>/;
 | 
			
		||||
@ -13232,10 +13231,10 @@ function write_ws_xml_data(ws, opts, idx, wb) {
 | 
			
		||||
				row = rows[R];
 | 
			
		||||
				if(row.hidden) params.hidden = 1;
 | 
			
		||||
				height = -1;
 | 
			
		||||
				if (row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if (row.hpt) height = row.hpt;
 | 
			
		||||
				if (height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if (row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
				if(row.hpx) height = px2pt(row.hpx);
 | 
			
		||||
				else if(row.hpt) height = row.hpt;
 | 
			
		||||
				if(height > -1) { params.ht = height; params.customHeight = 1; }
 | 
			
		||||
				if(row.level) { params.outlineLevel = row.level; }
 | 
			
		||||
			}
 | 
			
		||||
			o[o.length] = (writextag('row', r.join(""), params));
 | 
			
		||||
		}
 | 
			
		||||
@ -14617,6 +14616,7 @@ function parse_wb_xml(data, opts) {
 | 
			
		||||
				dname.Name = utf8read(y.name);
 | 
			
		||||
				if(y.comment) dname.Comment = y.comment;
 | 
			
		||||
				if(y.localSheetId) dname.Sheet = +y.localSheetId;
 | 
			
		||||
				if(parsexmlbool(y.hidden||"0")) dname.Hidden = true;
 | 
			
		||||
				dnstart = idx + x.length;
 | 
			
		||||
			}	break;
 | 
			
		||||
			case '</definedName>': {
 | 
			
		||||
@ -14716,11 +14716,14 @@ if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.Cod
 | 
			
		||||
	o[o.length] = (writextag('workbookPr', null, workbookPr));
 | 
			
		||||
 | 
			
		||||
	/* workbookProtection */
 | 
			
		||||
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	var i = 0;
 | 
			
		||||
 | 
			
		||||
	/* bookViews */
 | 
			
		||||
 | 
			
		||||
	o[o.length] = "<sheets>";
 | 
			
		||||
	var sheets = wb.Workbook && wb.Workbook.Sheets || [];
 | 
			
		||||
	for(var i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
	for(i = 0; i != wb.SheetNames.length; ++i) {
 | 
			
		||||
		var sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))});
 | 
			
		||||
		sht.sheetId = ""+(i+1);
 | 
			
		||||
		sht["r:id"] = "rId"+(i+1);
 | 
			
		||||
@ -14741,8 +14744,9 @@ if(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.Cod
 | 
			
		||||
			var d = {name:n.Name};
 | 
			
		||||
			if(n.Comment) d.comment = n.Comment;
 | 
			
		||||
			if(n.Sheet != null) d.localSheetId = ""+n.Sheet;
 | 
			
		||||
			if(n.Hidden) d.hidden = "1";
 | 
			
		||||
			if(!n.Ref) return;
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref), d);
 | 
			
		||||
			o[o.length] = writextag('definedName', String(n.Ref).replace(/</g, "<").replace(/>/g, ">"), d);
 | 
			
		||||
		});
 | 
			
		||||
		o[o.length] = "</definedNames>";
 | 
			
		||||
	}
 | 
			
		||||
@ -14849,6 +14853,7 @@ function parse_BrtName(data, length, opts) {
 | 
			
		||||
/* [MS-XLSB] 2.1.7.61 Workbook */
 | 
			
		||||
function parse_wb_bin(data, opts) {
 | 
			
		||||
	var wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: "" };
 | 
			
		||||
	var state = [];
 | 
			
		||||
	var pass = false;
 | 
			
		||||
 | 
			
		||||
	if(!opts) opts = {};
 | 
			
		||||
@ -14924,18 +14929,20 @@ function parse_wb_bin(data, opts) {
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 0x0023: /* 'BrtFRTBegin' */
 | 
			
		||||
				pass = true; break;
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0024: /* 'BrtFRTEnd' */
 | 
			
		||||
				pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */ break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */ break;
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
			case 0x0025: /* 'BrtACBegin' */
 | 
			
		||||
				state.push(R_n); pass = true; break;
 | 
			
		||||
			case 0x0026: /* 'BrtACEnd' */
 | 
			
		||||
				state.pop(); pass = false; break;
 | 
			
		||||
 | 
			
		||||
			case 0x0010: /* 'BrtFRTArchID$' */ break;
 | 
			
		||||
 | 
			
		||||
			default:
 | 
			
		||||
				if((R_n||"").indexOf("Begin") > 0){/* empty */}
 | 
			
		||||
				else if((R_n||"").indexOf("End") > 0){/* empty */}
 | 
			
		||||
				else if(!pass || opts.WTF) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
				else if(!pass || (opts.WTF && state[state.length-1] != "BrtACBegin" && state[state.length-1] != "BrtFRTBegin")) throw new Error("Unexpected record " + RT + " " + R_n);
 | 
			
		||||
		}
 | 
			
		||||
	}, opts);
 | 
			
		||||
 | 
			
		||||
@ -16549,7 +16556,8 @@ wb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;
 | 
			
		||||
				case 'WsBool':
 | 
			
		||||
					if(val.fDialog) out["!type"] = "dialog";
 | 
			
		||||
					break; // TODO
 | 
			
		||||
				case 'XF': XFs.push(val); break;
 | 
			
		||||
				case 'XF':
 | 
			
		||||
					XFs.push(val); break;
 | 
			
		||||
				case 'ExtSST': break; // TODO
 | 
			
		||||
				case 'BookExt': break; // TODO
 | 
			
		||||
				case 'RichTextStream': break;
 | 
			
		||||
@ -18067,6 +18075,9 @@ var XLSBRecordEnum = {
 | 
			
		||||
0x085D: { n:"BrtModelTimeGroupingCalcCol" },
 | 
			
		||||
0x0C00: { n:"BrtUid" },
 | 
			
		||||
0x0C01: { n:"BrtRevisionPtr" },
 | 
			
		||||
0x13e7: { n:"BrtBeginCalcFeatures" },
 | 
			
		||||
0x13e8: { n:"BrtEndCalcFeatures" },
 | 
			
		||||
0x13e9: { n:"BrtCalcFeature" },
 | 
			
		||||
0xFFFF: { n:"" }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -19020,16 +19031,17 @@ function get_get_computed_style_function(element) {
 | 
			
		||||
/* OpenDocument */
 | 
			
		||||
var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
	/* 6.1.2 White Space Characters */
 | 
			
		||||
	var parse_text_p = function(text) {
 | 
			
		||||
		return unescapexml(text
 | 
			
		||||
		/* 6.1.2 White Space Characters */
 | 
			
		||||
		var fixed = text
 | 
			
		||||
			.replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ")
 | 
			
		||||
			.replace(/<text:s\/>/g," ")
 | 
			
		||||
			.replace(/<text:s text:c="(\d+)"\/>/g, function($$,$1) { return Array(parseInt($1,10)+1).join(" "); })
 | 
			
		||||
			.replace(/<text:tab[^>]*\/>/g,"\t")
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n")
 | 
			
		||||
			.replace(/<[^>]*>/g,"")
 | 
			
		||||
		);
 | 
			
		||||
			.replace(/<text:line-break\/>/g,"\n");
 | 
			
		||||
		var v = unescapexml(fixed.replace(/<[^>]*>/g,""));
 | 
			
		||||
 | 
			
		||||
		return [v];
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	var number_formats = {
 | 
			
		||||
@ -19061,6 +19073,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
		var Rn, q;
 | 
			
		||||
		var ctag = ({value:""});
 | 
			
		||||
		var textp = "", textpidx = 0, textptag;
 | 
			
		||||
		var textR = [];
 | 
			
		||||
		var R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};
 | 
			
		||||
		var row_ol = 0;
 | 
			
		||||
		var number_format_map = {};
 | 
			
		||||
@ -19116,11 +19129,12 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};
 | 
			
		||||
				C = -1; break;
 | 
			
		||||
			case 'covered-table-cell': // 9.1.5 <table:covered-table-cell>
 | 
			
		||||
				++C;
 | 
			
		||||
				if(Rn[1] !== '/') ++C;
 | 
			
		||||
				if(opts.sheetStubs) {
 | 
			
		||||
					if(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }
 | 
			
		||||
					else ws[encode_cell({r:R,c:C})] = {t:'z'};
 | 
			
		||||
				}
 | 
			
		||||
				textp = ""; textR = [];
 | 
			
		||||
				break; /* stub */
 | 
			
		||||
			case 'table-cell': case '数据':
 | 
			
		||||
				if(Rn[0].charAt(Rn[0].length-2) === '/') {
 | 
			
		||||
@ -19189,13 +19203,14 @@ var parse_content_xml = (function() {
 | 
			
		||||
						default:
 | 
			
		||||
							if(q.t === 'string' || q.t === 'text' || !q.t) {
 | 
			
		||||
								q.t = 's';
 | 
			
		||||
								if(ctag['string-value'] != null) textp = unescapexml(ctag['string-value']);
 | 
			
		||||
								if(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }
 | 
			
		||||
							} else throw new Error('Unsupported value type ' + q.t);
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					isstub = false;
 | 
			
		||||
					if(q.t === 's') {
 | 
			
		||||
						q.v = textp || '';
 | 
			
		||||
						if(textR.length) q.R = textR;
 | 
			
		||||
						isstub = textpidx == 0;
 | 
			
		||||
					}
 | 
			
		||||
					if(atag.Target) q.l = atag;
 | 
			
		||||
@ -19220,7 +19235,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
					colpeat = parseInt(ctag['number-columns-repeated']||"1", 10);
 | 
			
		||||
					C += colpeat-1; colpeat = 0;
 | 
			
		||||
					q = {};
 | 
			
		||||
					textp = "";
 | 
			
		||||
					textp = ""; textR = [];
 | 
			
		||||
				}
 | 
			
		||||
				atag = ({});
 | 
			
		||||
				break; // 9.1.4 <table:table-cell>
 | 
			
		||||
@ -19240,12 +19255,13 @@ var parse_content_xml = (function() {
 | 
			
		||||
				if(Rn[1]==='/'){
 | 
			
		||||
					if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;
 | 
			
		||||
					comment.t = textp;
 | 
			
		||||
					if(textR.length) comment.R = textR;
 | 
			
		||||
					comment.a = creator;
 | 
			
		||||
					comments.push(comment);
 | 
			
		||||
				}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}
 | 
			
		||||
				creator = ""; creatoridx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'creator': // 4.3.2.7 <dc:creator>
 | 
			
		||||
@ -19272,7 +19288,7 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'chart': // TODO
 | 
			
		||||
				if(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw "Bad state: "+tmp;}
 | 
			
		||||
				else if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);
 | 
			
		||||
				textp = ""; textpidx = 0;
 | 
			
		||||
				textp = ""; textpidx = 0; textR = [];
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'scientific-number': // TODO: <number:scientific-number>
 | 
			
		||||
@ -19301,7 +19317,8 @@ var parse_content_xml = (function() {
 | 
			
		||||
 | 
			
		||||
			case 'default-style': // TODO: <style:default-style>
 | 
			
		||||
			case 'page-layout': break; // TODO: <style:page-layout>
 | 
			
		||||
			case 'style': break; // 16.2 <style:style>
 | 
			
		||||
			case 'style': // 16.2 <style:style>
 | 
			
		||||
				break;
 | 
			
		||||
			case 'map': break; // 16.3 <style:map>
 | 
			
		||||
			case 'font-face': break; // 16.21 <style:font-face>
 | 
			
		||||
 | 
			
		||||
@ -19393,8 +19410,10 @@ var parse_content_xml = (function() {
 | 
			
		||||
			case 'line-break': break; // 6.1.5 <text:line-break>
 | 
			
		||||
			case 'span': break; // 6.1.7 <text:span>
 | 
			
		||||
			case 'p': case '文本串': // 5.1.3 <text:p>
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) textp = (textp.length > 0 ? textp + "\n" : "") + parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
				else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				if(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {
 | 
			
		||||
					var ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);
 | 
			
		||||
					textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
 | 
			
		||||
				} else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }
 | 
			
		||||
				break; // <text:p>
 | 
			
		||||
			case 's': break; // <text:s>
 | 
			
		||||
 | 
			
		||||
@ -20163,14 +20182,16 @@ f = "docProps/app.xml";
 | 
			
		||||
 | 
			
		||||
		if(ws) {
 | 
			
		||||
			var comments = ws['!comments'];
 | 
			
		||||
			var need_vml = false;
 | 
			
		||||
			if(comments && comments.length > 0) {
 | 
			
		||||
				var cf = "xl/comments" + rId + "." + wbext;
 | 
			
		||||
				zip.file(cf, write_cmnt(comments, cf, opts));
 | 
			
		||||
				ct.comments.push(cf);
 | 
			
		||||
				add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
 | 
			
		||||
				need_vml = true;
 | 
			
		||||
			}
 | 
			
		||||
			if(ws['!legacy']) {
 | 
			
		||||
				zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
				if(need_vml) zip.file("xl/drawings/vmlDrawing" + (rId) + ".vml", write_comments_vml(rId, ws['!comments']));
 | 
			
		||||
			}
 | 
			
		||||
			delete ws['!comments'];
 | 
			
		||||
			delete ws['!legacy'];
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user