forked from sheetjs/sheetjs
		
	Read borders and alignments
This commit is contained in:
		
							parent
							
								
									114f257ce4
								
							
						
					
					
						commit
						5f9576a6d2
					
				
							
								
								
									
										
											BIN
										
									
								
								.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								.DS_Store
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -6,3 +6,5 @@ tmp | ||||
| *.xlsx | ||||
| *.xlsm | ||||
| *.xlsb | ||||
| lab/ | ||||
| .idea/ | ||||
|  | ||||
| @ -1,83 +1,122 @@ | ||||
| /* 18.8.21 fills CT_Fills */ | ||||
| function parse_fills(t, opts) { | ||||
| 	styles.Fills = []; | ||||
| 	var fill = {}; | ||||
| 	t[0].match(tagregex).forEach(function(x) { | ||||
| 		var y = parsexmltag(x); | ||||
| 		switch(y[0]) { | ||||
| 			case '<fills': case '<fills>': case '</fills>': break; | ||||
|   styles.Fills = []; | ||||
|   var fill = {}; | ||||
|   t[0].match(tagregex).forEach(function (x) { | ||||
|     var y = parsexmltag(x); | ||||
|     switch (y[0]) { | ||||
|       case '<fills': | ||||
|       case '<fills>': | ||||
|       case '</fills>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.20 fill CT_Fill */ | ||||
| 			case '<fill>': break; | ||||
| 			case '</fill>': styles.Fills.push(fill); fill = {}; break; | ||||
|       /* 18.8.20 fill CT_Fill */ | ||||
|       case '<fill>': | ||||
|         break; | ||||
|       case '</fill>': | ||||
|         styles.Fills.push(fill); | ||||
|         fill = {}; | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.32 patternFill CT_PatternFill */ | ||||
| 			case '<patternFill': | ||||
| 				if(y.patternType) fill.patternType = y.patternType; | ||||
| 				break; | ||||
| 			case '<patternFill/>': case '</patternFill>': break; | ||||
|       /* 18.8.32 patternFill CT_PatternFill */ | ||||
|       case '<patternFill': | ||||
|         if (y.patternType) fill.patternType = y.patternType; | ||||
|         break; | ||||
|       case '<patternFill/>': | ||||
|       case '</patternFill>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.3 bgColor CT_Color */ | ||||
| 			case '<bgColor': | ||||
| 				if(!fill.bgColor) fill.bgColor = {}; | ||||
|         if(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10); | ||||
|         if(y.theme) fill.bgColor.theme = parseInt(y.theme, 10); | ||||
|         if(y.tint) fill.bgColor.tint = parseFloat(y.tint); | ||||
|       /* 18.8.3 bgColor CT_Color */ | ||||
|       case '<bgColor': | ||||
|         if (!fill.bgColor) fill.bgColor = {}; | ||||
|         if (y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10); | ||||
|         if (y.theme) fill.bgColor.theme = parseInt(y.theme, 10); | ||||
|         if (y.tint) fill.bgColor.tint = parseFloat(y.tint); | ||||
|         /* Excel uses ARGB strings */ | ||||
|         if(y.rgb) fill.bgColor.rgb = y.rgb;//.substring(y.rgb.length - 6);
 | ||||
| 				break; | ||||
| 			case '<bgColor/>': case '</bgColor>': break; | ||||
|         if (y.rgb) fill.bgColor.rgb = y.rgb;//.substring(y.rgb.length - 6);
 | ||||
|         break; | ||||
|       case '<bgColor/>': | ||||
|       case '</bgColor>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.19 fgColor CT_Color */ | ||||
| 			case '<fgColor': | ||||
| 				if(!fill.fgColor) fill.fgColor = {}; | ||||
| 				if(y.theme) fill.fgColor.theme = parseInt(y.theme, 10); | ||||
| 				if(y.tint) fill.fgColor.tint = parseFloat(y.tint); | ||||
| 				/* Excel uses ARGB strings */ | ||||
| 				if(y.rgb) fill.fgColor.rgb = y.rgb;//.substring(y.rgb.length - 6);
 | ||||
| 				break; | ||||
| 			case '<fgColor/>': case '</fgColor>': break; | ||||
|       /* 18.8.19 fgColor CT_Color */ | ||||
|       case '<fgColor': | ||||
|         if (!fill.fgColor) fill.fgColor = {}; | ||||
|         if (y.theme) fill.fgColor.theme = parseInt(y.theme, 10); | ||||
|         if (y.tint) fill.fgColor.tint = parseFloat(y.tint); | ||||
|         /* Excel uses ARGB strings */ | ||||
|         if (y.rgb) fill.fgColor.rgb = y.rgb;//.substring(y.rgb.length - 6);
 | ||||
|         break; | ||||
|       case '<fgColor/>': | ||||
|       case '</fgColor>': | ||||
|         break; | ||||
| 
 | ||||
| 			default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in fills'; | ||||
| 		} | ||||
| 	}); | ||||
|       default: | ||||
|         if (opts.WTF) throw 'unrecognized ' + y[0] + ' in fills'; | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function parse_fonts(t, opts) { | ||||
|   styles.Fonts = []; | ||||
|   var font = {}; | ||||
|   t[0].match(tagregex).forEach(function(x) { | ||||
|   t[0].match(tagregex).forEach(function (x) { | ||||
|     var y = parsexmltag(x); | ||||
|     switch(y[0]) { | ||||
|     switch (y[0]) { | ||||
| 
 | ||||
|       case '<fonts': case  '<fonts>': case '</fonts>': break; | ||||
|       case '<fonts': | ||||
|       case  '<fonts>': | ||||
|       case '</fonts>': | ||||
|         break; | ||||
|       case '<font': | ||||
|         break; | ||||
|       case '</font>': styles.Fonts.push(font); ;font = {}; break; | ||||
|       case '</font>': | ||||
|         styles.Fonts.push(font); | ||||
|         ; | ||||
|         font = {}; | ||||
|         break; | ||||
| 
 | ||||
|       case '<name': | ||||
|         if(y.val) font.name = y.val; | ||||
|         if (y.val) font.name = y.val; | ||||
|         break; | ||||
|       case '<name/>': | ||||
|       case '</name>': | ||||
|         break; | ||||
|       case '<name/>': case '</name>': break; | ||||
| 
 | ||||
| 
 | ||||
|       case '<b/>': font.bold = true;break; | ||||
|       case '<u/>':  font.underline = true;break; | ||||
|       case '<i/>':  font.italic = true;break; | ||||
|       case '<strike/>':  font.strike = true;break; | ||||
|       case '<outline/>':  font.outline = true;break; | ||||
|       case '<shadow/>':  font.shadow = true;break; | ||||
|       case '<b/>': | ||||
|         font.bold = true; | ||||
|         break; | ||||
|       case '<u/>': | ||||
|         font.underline = true; | ||||
|         break; | ||||
|       case '<i/>': | ||||
|         font.italic = true; | ||||
|         break; | ||||
|       case '<strike/>': | ||||
|         font.strike = true; | ||||
|         break; | ||||
|       case '<outline/>': | ||||
|         font.outline = true; | ||||
|         break; | ||||
|       case '<shadow/>': | ||||
|         font.shadow = true; | ||||
|         break; | ||||
| 
 | ||||
| 
 | ||||
|       case '<sz': | ||||
|         if(y.val) font.sz = y.val; | ||||
|         if (y.val) font.sz = y.val; | ||||
|         break; | ||||
|       case '<sz/>': | ||||
|       case '</sz>': | ||||
|         break; | ||||
|       case '<sz/>': case '</sz>': break; | ||||
| 
 | ||||
|       case '<vertAlign': | ||||
|         if(y.val) font.vertAlign = y.val; | ||||
|         if (y.val) font.vertAlign = y.val; | ||||
|         break; | ||||
|       case '<vertAlign/>': | ||||
|       case '</vertAlign>': | ||||
|         break; | ||||
|       case '<vertAlign/>': case '</vertAlign>': break; | ||||
| 
 | ||||
| 
 | ||||
|       case '<color': | ||||
| @ -86,32 +125,77 @@ function parse_fonts(t, opts) { | ||||
|         if (y.tint) font.color.tint = y.tint; | ||||
|         if (y.rgb) font.color.rgb = y.rgb; | ||||
|         break; | ||||
|       case '<color/>':case '</color>': break; | ||||
|       case '<color/>': | ||||
|       case '</color>': | ||||
|         break; | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function parse_borders(t, opts) { | ||||
|   styles.Borders = []; | ||||
|   var border = {}; | ||||
|   t[0].match(tagregex).forEach(function(x) { | ||||
|   var border = {}, sub_border = {}; | ||||
|   t[0].match(tagregex).forEach(function (x) { | ||||
|     var y = parsexmltag(x); | ||||
|     switch(y[0]) { | ||||
|       case '<borders': case  '<borders>': case '</borders>': break; | ||||
|       case '<border>': break; | ||||
|     switch (y[0]) { | ||||
|       case '<borders': | ||||
|       case  '<borders>': | ||||
|       case '</borders>': | ||||
|         break; | ||||
|       case '<border': | ||||
|       case '<border>': | ||||
|         border = {}; | ||||
|         if (y.diagonalUp) { border.diagonalUp = y.diagonalUp; } | ||||
|         if (y.diagonalDown) { border.diagonalDown = y.diagonalDown; } | ||||
|         styles.Borders.push(border); | ||||
| 
 | ||||
|         break; | ||||
|         break; | ||||
|       case '</border>': | ||||
|         styles.Fonts.push(border); | ||||
|         border = {}; break; | ||||
|         break; | ||||
| 
 | ||||
|       case '<left': | ||||
|         sub_border = border.left = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
|       case '<right': | ||||
|         sub_border = border.right = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
|       case '<top': | ||||
|         sub_border = border.top = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
|       case '<bottom': | ||||
|         sub_border = border.bottom = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
|       case '<diagonal': | ||||
|         sub_border = border.diagonal = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
| 
 | ||||
|       case '<color': | ||||
|         if(y.style) border.style = y.style; | ||||
|         sub_border.color = {}; | ||||
|         if (y.theme) sub_border.color.theme = y.theme; | ||||
|         if (y.tint) sub_border.color.tint = y.tint; | ||||
|         if (y.rgb) sub_border.color.rgb = y.rgb; | ||||
|         break; | ||||
|       case '<name/>': case '</name>': break; | ||||
| 
 | ||||
|       case '<sz': | ||||
|         if(y.val) font.sz = y.val; | ||||
|       case '<name/>': | ||||
|       case '</name>': | ||||
|         break; | ||||
|       default: | ||||
|         break; | ||||
|       case '<sz/>': case '</sz>': break; | ||||
|     } | ||||
|   }); | ||||
| 
 | ||||
| @ -119,111 +203,153 @@ function parse_borders(t, opts) { | ||||
| 
 | ||||
| /* 18.8.31 numFmts CT_NumFmts */ | ||||
| function parse_numFmts(t, opts) { | ||||
| 	styles.NumberFmt = []; | ||||
| 	var k = keys(SSF._table); | ||||
| 	for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]]; | ||||
| 	var m = t[0].match(tagregex); | ||||
| 	for(i=0; i < m.length; ++i) { | ||||
| 		var y = parsexmltag(m[i]); | ||||
| 		switch(y[0]) { | ||||
| 			case '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break; | ||||
| 			case '<numFmt': { | ||||
| 				var f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10); | ||||
| 				styles.NumberFmt[j] = f; if(j>0) SSF.load(f,j); | ||||
| 			} break; | ||||
| 			default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts'; | ||||
| 		} | ||||
| 	} | ||||
|   styles.NumberFmt = []; | ||||
|   var k = keys(SSF._table); | ||||
|   for (var i = 0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]]; | ||||
|   var m = t[0].match(tagregex); | ||||
|   for (i = 0; i < m.length; ++i) { | ||||
|     var y = parsexmltag(m[i]); | ||||
|     switch (y[0]) { | ||||
|       case '<numFmts': | ||||
|       case '</numFmts>': | ||||
|       case '<numFmts/>': | ||||
|       case '<numFmts>': | ||||
|         break; | ||||
|       case '<numFmt': | ||||
|       { | ||||
|         var f = unescapexml(utf8read(y.formatCode)), j = parseInt(y.numFmtId, 10); | ||||
|         styles.NumberFmt[j] = f; | ||||
|         if (j > 0) SSF.load(f, j); | ||||
|       } | ||||
|         break; | ||||
|       default: | ||||
|         if (opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts'; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| function write_numFmts(NF, opts) { | ||||
| 	var o = ["<numFmts>"]; | ||||
| 	[[5,8],[23,26],[41,44],[63,66],[164,392]].forEach(function(r) { | ||||
| 		for(var i = r[0]; i <= r[1]; ++i) if(NF[i] !== undefined) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])})); | ||||
| 	}); | ||||
| 	if(o.length === 1) return ""; | ||||
| 	o[o.length] = ("</numFmts>"); | ||||
| 	o[0] = writextag('numFmts', null, { count:o.length-2 }).replace("/>", ">"); | ||||
| 	return o.join(""); | ||||
|   var o = ["<numFmts>"]; | ||||
|   [ | ||||
|     [5, 8], | ||||
|     [23, 26], | ||||
|     [41, 44], | ||||
|     [63, 66], | ||||
|     [164, 392] | ||||
|   ].forEach(function (r) { | ||||
|     for (var i = r[0]; i <= r[1]; ++i) if (NF[i] !== undefined) o[o.length] = (writextag('numFmt', null, {numFmtId: i, formatCode: escapexml(NF[i])})); | ||||
|   }); | ||||
|   if (o.length === 1) return ""; | ||||
|   o[o.length] = ("</numFmts>"); | ||||
|   o[0] = writextag('numFmts', null, { count: o.length - 2 }).replace("/>", ">"); | ||||
|   return o.join(""); | ||||
| } | ||||
| 
 | ||||
| /* 18.8.10 cellXfs CT_CellXfs */ | ||||
| function parse_cellXfs(t, opts) { | ||||
| 	styles.CellXf = []; | ||||
| 	t[0].match(tagregex).forEach(function(x) { | ||||
| 		var y = parsexmltag(x); | ||||
| 		switch(y[0]) { | ||||
| 			case '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break; | ||||
|   styles.CellXf = []; | ||||
|   var xf; | ||||
|   t[0].match(tagregex).forEach(function (x) { | ||||
|     var y = parsexmltag(x); | ||||
|     switch (y[0]) { | ||||
|       case '<cellXfs': | ||||
|       case '<cellXfs>': | ||||
|       case '<cellXfs/>': | ||||
|       case '</cellXfs>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.45 xf CT_Xf */ | ||||
| 			case '<xf': delete y[0]; | ||||
| 				if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10); | ||||
| 				if(y.fillId) y.fillId = parseInt(y.fillId, 10); | ||||
| 				styles.CellXf.push(y); break; | ||||
| 			case '</xf>': break; | ||||
|       /* 18.8.45 xf CT_Xf */ | ||||
|       case '<xf': | ||||
|           xf = y; | ||||
|           delete xf[0]; | ||||
|         delete y[0]; | ||||
|         if (xf.numFmtId) xf.numFmtId = parseInt(xf.numFmtId, 10); | ||||
|         if (xf.fillId) xf.fillId = parseInt(xf.fillId, 10); | ||||
|         styles.CellXf.push(xf); | ||||
|         break; | ||||
|       case '</xf>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.1 alignment CT_CellAlignment */ | ||||
| 			case '<alignment': case '<alignment/>': break; | ||||
|       /* 18.8.1 alignment CT_CellAlignment */ | ||||
|       case '<alignment': | ||||
|       case '<alignment/>': | ||||
|         var alignment = {} | ||||
|           if (y.vertical) { alignment.vertical = y.vertical;} | ||||
|         if (y.horizontal) { alignment.horizontal = y.horizontal;} | ||||
|           if (y.indent) { alignment.indent = y.indent; } | ||||
|           if (y.wrapText) { alignment.wrapText = y.wrapText; } | ||||
|           xf.alignment = alignment; | ||||
| 
 | ||||
| 			/* 18.8.33 protection CT_CellProtection */ | ||||
| 			case '<protection': case '</protection>': case '<protection/>': break; | ||||
|         break; | ||||
| 
 | ||||
| 			case '<extLst': case '</extLst>': break; | ||||
| 			case '<ext': break; | ||||
| 			default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs'; | ||||
| 		} | ||||
| 	}); | ||||
|       /* 18.8.33 protection CT_CellProtection */ | ||||
|       case '<protection': | ||||
|       case '</protection>': | ||||
|       case '<protection/>': | ||||
|         break; | ||||
| 
 | ||||
|       case '<extLst': | ||||
|       case '</extLst>': | ||||
|         break; | ||||
|       case '<ext': | ||||
|         break; | ||||
|       default: | ||||
|         if (opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs'; | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function write_cellXfs(cellXfs) { | ||||
| 	var o = []; | ||||
| 	o[o.length] = (writextag('cellXfs',null)); | ||||
| 	cellXfs.forEach(function(c) { o[o.length] = (writextag('xf', null, c)); }); | ||||
| 	o[o.length] = ("</cellXfs>"); | ||||
| 	if(o.length === 2) return ""; | ||||
| 	o[0] = writextag('cellXfs',null, {count:o.length-2}).replace("/>",">"); | ||||
| 	return o.join(""); | ||||
|   var o = []; | ||||
|   o[o.length] = (writextag('cellXfs', null)); | ||||
|   cellXfs.forEach(function (c) { | ||||
|     o[o.length] = (writextag('xf', null, c)); | ||||
|   }); | ||||
|   o[o.length] = ("</cellXfs>"); | ||||
|   if (o.length === 2) return ""; | ||||
|   o[0] = writextag('cellXfs', null, {count: o.length - 2}).replace("/>", ">"); | ||||
|   return o.join(""); | ||||
| } | ||||
| 
 | ||||
| /* 18.8 Styles CT_Stylesheet*/ | ||||
| var parse_sty_xml= (function make_pstyx() { | ||||
| var numFmtRegex = /<numFmts([^>]*)>.*<\/numFmts>/; | ||||
| var cellXfRegex = /<cellXfs([^>]*)>.*<\/cellXfs>/; | ||||
| var fillsRegex = /<fills([^>]*)>.*<\/fills>/; | ||||
| var bordersRegex = /<borders([^>]*)>.*<\/borders>/; | ||||
| var parse_sty_xml = (function make_pstyx() { | ||||
|   var numFmtRegex = /<numFmts([^>]*)>.*<\/numFmts>/; | ||||
|   var cellXfRegex = /<cellXfs([^>]*)>.*<\/cellXfs>/; | ||||
|   var fillsRegex = /<fills([^>]*)>.*<\/fills>/; | ||||
|   var bordersRegex = /<borders([^>]*)>.*<\/borders>/; | ||||
| 
 | ||||
| return function parse_sty_xml(data, opts) { | ||||
| 	/* 18.8.39 styleSheet CT_Stylesheet */ | ||||
| 	var t; | ||||
|   return function parse_sty_xml(data, opts) { | ||||
|     /* 18.8.39 styleSheet CT_Stylesheet */ | ||||
|     var t; | ||||
| 
 | ||||
| 	/* numFmts CT_NumFmts ? */ | ||||
| 	if((t=data.match(numFmtRegex))) parse_numFmts(t, opts); | ||||
|     /* numFmts CT_NumFmts ? */ | ||||
|     if ((t = data.match(numFmtRegex))) parse_numFmts(t, opts); | ||||
| 
 | ||||
| 	/* fonts CT_Fonts ? */ | ||||
| 	if((t=data.match(/<fonts([^>]*)>.*<\/fonts>/))) parse_fonts(t, opts) | ||||
|     /* fonts CT_Fonts ? */ | ||||
|     if ((t = data.match(/<fonts([^>]*)>.*<\/fonts>/))) parse_fonts(t, opts) | ||||
| 
 | ||||
| 	/* fills CT_Fills */ | ||||
| 	if((t=data.match(fillsRegex))) parse_fills(t, opts); | ||||
|     /* fills CT_Fills */ | ||||
|     if ((t = data.match(fillsRegex))) parse_fills(t, opts); | ||||
| 
 | ||||
| 	/* borders CT_Borders ? */ | ||||
| //  if ((t=data.match(bordersRegex))) parse_borders(t, opts);
 | ||||
| 	/* cellStyleXfs CT_CellStyleXfs ? */ | ||||
|     /* borders CT_Borders ? */ | ||||
|     if ((t = data.match(bordersRegex))) parse_borders(t, opts); | ||||
|     /* cellStyleXfs CT_CellStyleXfs ? */ | ||||
| 
 | ||||
| 	/* cellXfs CT_CellXfs ? */ | ||||
| 	if((t=data.match(cellXfRegex))) parse_cellXfs(t, opts); | ||||
|     /* cellXfs CT_CellXfs ? */ | ||||
|     if ((t = data.match(cellXfRegex))) parse_cellXfs(t, opts); | ||||
| 
 | ||||
| 	/* dxfs CT_Dxfs ? */ | ||||
| 	/* tableStyles CT_TableStyles ? */ | ||||
| 	/* colors CT_Colors ? */ | ||||
| 	/* extLst CT_ExtensionList ? */ | ||||
|     /* dxfs CT_Dxfs ? */ | ||||
|     /* tableStyles CT_TableStyles ? */ | ||||
|     /* colors CT_Colors ? */ | ||||
|     /* extLst CT_ExtensionList ? */ | ||||
| 
 | ||||
| 	return styles; | ||||
| }; | ||||
|     return styles; | ||||
|   }; | ||||
| })(); | ||||
| 
 | ||||
| var STYLES_XML_ROOT = writextag('styleSheet', null, { | ||||
| 	'xmlns': XMLNS.main[0], | ||||
| 	'xmlns:vt': XMLNS.vt | ||||
|   'xmlns': XMLNS.main[0], | ||||
|   'xmlns:vt': XMLNS.vt | ||||
| }); | ||||
| 
 | ||||
| RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"; | ||||
| @ -234,17 +360,20 @@ function write_sty_xml(wb, opts) { | ||||
|     return style_builder.toXml(); | ||||
|   } | ||||
| 
 | ||||
| 	var o = [XML_HEADER, STYLES_XML_ROOT], w; | ||||
| 	if((w = write_numFmts(wb.SSF)) != null) o[o.length] = w; | ||||
| 	o[o.length] = ('<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>'); | ||||
| 	o[o.length] = ('<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>'); | ||||
| 	o[o.length] = ('<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>'); | ||||
| 	o[o.length] = ('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>'); | ||||
| 	if((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w); | ||||
| 	o[o.length] = ('<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>'); | ||||
| 	o[o.length] = ('<dxfs count="0"/>'); | ||||
| 	o[o.length] = ('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>'); | ||||
|   var o = [XML_HEADER, STYLES_XML_ROOT], w; | ||||
|   if ((w = write_numFmts(wb.SSF)) != null) o[o.length] = w; | ||||
|   o[o.length] = ('<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>'); | ||||
|   o[o.length] = ('<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>'); | ||||
|   o[o.length] = ('<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>'); | ||||
|   o[o.length] = ('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>'); | ||||
|   if ((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w); | ||||
|   o[o.length] = ('<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>'); | ||||
|   o[o.length] = ('<dxfs count="0"/>'); | ||||
|   o[o.length] = ('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>'); | ||||
| 
 | ||||
| 	if(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace("/>",">"); } | ||||
| 	return o.join(""); | ||||
|   if (o.length > 2) { | ||||
|     o[o.length] = ('</styleSheet>'); | ||||
|     o[1] = o[1].replace("/>", ">"); | ||||
|   } | ||||
|   return o.join(""); | ||||
| } | ||||
|  | ||||
| @ -34,6 +34,7 @@ function get_cell_style(styles, cell, opts) { | ||||
| function get_cell_style_csf(cellXf) { | ||||
| 
 | ||||
|   if (cellXf) { | ||||
| 
 | ||||
|     var s = {} | ||||
| 
 | ||||
|     if (typeof cellXf.numFmtId != undefined)  { | ||||
| @ -48,8 +49,12 @@ function get_cell_style_csf(cellXf) { | ||||
|       s.font = styles.Fonts[cellXf.fontId]; | ||||
|     } | ||||
|     if (cellXf.borderId) { | ||||
| //      s.border = styles.Borders[cellXf.borderId];
 | ||||
|       s.border = styles.Borders[cellXf.borderId]; | ||||
|     } | ||||
|     if (cellXf.applyAlignment==1) { | ||||
|       s.alignment = cellXf.alignment; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     return s; | ||||
|   } | ||||
|  | ||||
							
								
								
									
										150
									
								
								example.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										150
									
								
								example.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,150 @@ | ||||
| var XLSX = require('./'); | ||||
| var Workbook = require('../workbook'); | ||||
| 
 | ||||
| ///http://daveaddey.com/?p=40
 | ||||
| function JSDateToExcelDate(inDate) { | ||||
|   return 25569.0 + ((inDate.getTime() - (inDate.getTimezoneOffset() * 60 * 1000)) / (1000 * 60 * 60 * 24)); | ||||
| } | ||||
| 
 | ||||
| var workbook = new Workbook(XLSX) | ||||
|     .addRowsToSheet("Main", [ | ||||
|       [ | ||||
|         { | ||||
|           v: "This is a submerged cell", | ||||
|           s:{ | ||||
|             border: { | ||||
|               left: {style: 'thick', color: {auto: 1}}, | ||||
|               top: {style: 'thick', color: {auto: 1}}, | ||||
|               bottom: {style: 'thick', color: {auto: 1}} | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           v: "Pirate ship", | ||||
|           s:{ | ||||
|             border: { | ||||
|               top: {style: 'thick', color: {auto: 1}}, | ||||
|               bottom: {style: 'thick', color: {auto: 1}} | ||||
|             } | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           v: "Sunken treasure", | ||||
|           s:{ | ||||
|             border: { | ||||
|               right: {style: 'thick', color: {auto: 1}}, | ||||
|               top: {style: 'thick', color: {auto: 1}}, | ||||
|               bottom: {style: 'thick', color: {auto: 1}} | ||||
|             } | ||||
|           } | ||||
|         }], | ||||
|       [ | ||||
|         {"v": "Blank"}, | ||||
|         {"v": "Red", "s": {fill: { fgColor: { rgb: "FFFF0000"}}}}, | ||||
|         {"v": "Green", "s": {fill: { fgColor: { rgb: "FF00FF00"}}}}, | ||||
|         {"v": "Blue", "s": {fill: { fgColor: { rgb: "FF0000FF"}}}} | ||||
|       ], | ||||
|       [ | ||||
|         {"v": "Default"}, | ||||
|         {"v": "Arial", "s": {font: {name: "Arial", sz: 24, color: {theme: "5"}}}}, | ||||
|         {"v": "Times New Roman", "s": {font: {name: "Times New Roman", sz: 16, color: {rgb: "FF2222FF"}}}}, | ||||
|         {"v": "Courier New", "s": {font: {name: "Courier New", sz: 14}}} | ||||
|       ], | ||||
|       [ | ||||
|         0.618033989, | ||||
|         {"v": 0.618033989}, | ||||
|         {"v": 0.618033989, "t": "n"}, | ||||
|         {"v": 0.618033989, "t": "n", "s": { "numFmt": "0.00%"}}, | ||||
|         {"v": 0.618033989, "t": "n", "s": { "numFmt": "0.00%"}, fill: { fgColor: { rgb: "FFFFCC00"}}} | ||||
|       ], | ||||
|       [ | ||||
|         {"v": 0.618033989, "t": "n", "s": { "numFmt": "0%"}}, | ||||
|         {"v": 0.618033989, "t": "n", "s": { "numFmt": "0.0%"}}, | ||||
|         {"v": 0.618033989, "t": "n", "s": { "numFmt": "0.00%"}}, | ||||
|         {"v": 0.618033989, "t": "n", "s": { "numFmt": "0.000%"}}, | ||||
|         {"v": 0.618033989, "t": "n", "s": { "numFmt": "0.0000%"}}, | ||||
|         {"v": 0, "t": "n", "s": { numFmt: "0.00%;\\(0.00%\\);\\-;@"}, fill: { fgColor: { rgb: "FFFFCC00"}}} | ||||
|       ], | ||||
|       [ | ||||
|         {v: (new Date()).toLocaleString()}, | ||||
|         {v: JSDateToExcelDate(new Date()), t: 'd'}, | ||||
|         {v: JSDateToExcelDate(new Date()),  s: {numFmt: 'd-mmm-yy'}} | ||||
|       ] | ||||
|       , | ||||
|       [ | ||||
|         {v: "left", "s": { alignment: {horizontal: "left"}}}, | ||||
|         {v: "left", "s": { alignment: {horizontal: "center"}}}, | ||||
|         {v: "left", "s": { alignment: {horizontal: "right"}}} | ||||
|       ],[ | ||||
|         {v: "vertical", "s": { alignment: {vertical: "top"}}}, | ||||
|         {v: "vertical", "s": { alignment: {vertical: "center"}}}, | ||||
|         {v: "vertical", "s": { alignment: {vertical: "bottom"}}} | ||||
|       ],[ | ||||
|         {v: "indent", "s": { alignment: {indent: "1"}}}, | ||||
|         {v: "indent", "s": { alignment: {indent: "2"}}}, | ||||
|         {v: "indent", "s": { alignment: {indent: "3"}}} | ||||
|       ], | ||||
|         [{ | ||||
|           v: "In publishing and graphic design, lorem ipsum is a filler text commonly used to demonstrate the graphic elements of a document or visual presentation. ", | ||||
|           s: { alignment: { wrapText: 1, alignment: 'right', vertical: 'center', indent: 1}} | ||||
|          } | ||||
|         ], | ||||
|         [ | ||||
|           {v: 41684.35264774306, s: {numFmt: 'm/d/yy'}}, | ||||
|           {v: 41684.35264774306, s: {numFmt: 'd-mmm-yy'}}, | ||||
|           {v: 41684.35264774306, s: {numFmt: 'h:mm:ss AM/PM'}}, | ||||
|           {v: JSDateToExcelDate(new Date()),  s: {numFmt: 'm/d/yy'}}, | ||||
|           {v: 42065.02247239584,  s: {numFmt: 'm/d/yy'}}, | ||||
|           {v: JSDateToExcelDate(new Date()),  s: {numFmt: 'm/d/yy h:mm:ss AM/PM'}} | ||||
|         ], | ||||
|         [ | ||||
|           {v: "Apple", s: {border: {top: { style: "thin"}, left: { style: "thin"}, right: { style: "thin"}, bottom: { style: "thin"}}}}, | ||||
|           {}, | ||||
|           { | ||||
|             v: "Apple", | ||||
|             s: { | ||||
|               border: { | ||||
|                 diagonalUp: 1, diagonalDown: 1, | ||||
|                 top: { style: "dashed", color: {auto: 1}}, | ||||
|                 right: { style: "medium", color: {theme: "5"}}, | ||||
|                 bottom: { style: "hair", color: {theme: 5, tint: "-0.3"}}, | ||||
|                 left: { style: "thin", color: {rgb: "FFFFAA00"}}, | ||||
|                 diagonal: {style: "dotted", color: {auto: 1}} | ||||
|               } | ||||
|             } | ||||
|           }, | ||||
|           {}, | ||||
|           { | ||||
|               v: "Pear", | ||||
|               s: { | ||||
|                 border: { | ||||
|                   diagonalUp: 1, diagonalDown: 1, | ||||
|                   top: { style: "dashed", color: {auto: 1}}, | ||||
|                   right: { style: "dotted", color: {theme: "5"}}, | ||||
|                   bottom: { style: "mediumDashed", color: {theme: 5, tint: "-0.3"}}, | ||||
|                   left: { style: "double", color: {rgb: "FFFFAA00"}}, | ||||
|                   diagonal: {style: "hair", color: {auto: 1}} | ||||
|                 } | ||||
|             } | ||||
|           } | ||||
|         ], | ||||
|         [ | ||||
|           {v: "Up 90", s: {alignment: {textRotation: 90}}}, | ||||
|           {v: "Up 45", s: {alignment: {textRotation: 45}}}, | ||||
|           {v: "Horizontal", s: {alignment: {textRotation: 0}}}, | ||||
|           {v: "Down 45", s: {alignment: {textRotation: 135}}}, | ||||
|           {v: "Down 90", s: {alignment: {textRotation: 180}}}, | ||||
|           {v: "Vertical", s: {alignment: {textRotation: 255}}} | ||||
|         ], | ||||
|       [ | ||||
|         {v: "Font color test", s: { font: {fgColor: {rgb: "FFC6EFCE"}}}} | ||||
|       ] | ||||
|     ]).mergeCells("Main", { | ||||
|       "s": {"c": 0, "r": 0 }, | ||||
|       "e": {"c": 2, "r": 0 } | ||||
|     }).finalize(); | ||||
| 
 | ||||
| 
 | ||||
| var OUTFILE = '/tmp/wb.xlsx'; | ||||
| XLSX.writeFile(workbook, OUTFILE, {defaultCellStyle: { font: { name: "Verdana", sz: 11, color: "FF00FF88"}, fill: {fgColor: {rgb: "FFFFAA00"}}}}); | ||||
| console.log("Results written to " + OUTFILE) | ||||
							
								
								
									
										
											BIN
										
									
								
								out.txt
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								out.txt
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										20
									
								
								test-acid.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										20
									
								
								test-acid.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| var X = require('./'); | ||||
| var opts = { cellNF: true, | ||||
|   type: 'file', | ||||
|   cellHTML: true, | ||||
|   cellFormula: true, | ||||
|   cellStyles: false, | ||||
|   cellDates: false, | ||||
|   sheetStubs: false, | ||||
|   sheetRows: 0, | ||||
|   bookDeps: false, | ||||
|   bookSheets: false, | ||||
|   bookProps: false, | ||||
|   bookFiles: false, | ||||
|   bookVBA: false, | ||||
|   WTF: false } | ||||
| ; | ||||
| var FILENAME = './test_files/number_format_entities-2.xlsx'; | ||||
| wb = X.read(X.write(X.readFile(FILENAME,opts), {type:"buffer", bookType:'xlsx'}), {WTF:true, cellNF: true}) | ||||
| 
 | ||||
| X.writeFile(wb,'/tmp/wb3.xlsx'); | ||||
							
								
								
									
										43
									
								
								test-csv.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										43
									
								
								test-csv.js
									
									
									
									
									
								
							| @ -0,0 +1,43 @@ | ||||
| var argv = require('minimist')(process.argv.slice(2)); | ||||
| 
 | ||||
| var XLSX = require('./'); | ||||
| var fs = require('fs') | ||||
| var INFILE = './test_files/pivot_table_test.xlsm'; | ||||
| var TESTFILE = './test_files/pivot_table_test.xlsm.'; | ||||
| //var INFILE = './test_files/formula_stress_test.xlsb';
 | ||||
| //var TESTFILE = './test_files/formula_stress_test.xls.';
 | ||||
| var INFILE ='./test_files/apachepoi_Tables.xlsx'; | ||||
| var TESTFILE='./test_files/apachepoi_Tables.xlsx.'; | ||||
| var INFILE = './test_files/apachepoi_45540_classic_Footer.xlsx'; | ||||
| var TESTFILE = './test_files/apachepoi_45540_classic_Footer.xlsx.'; | ||||
| var SHEET=argv.p || 0; | ||||
| 
 | ||||
| function stripbom(x) { return x.replace(/^\ufeff/,""); } | ||||
| function fixcsv(x) { return stripbom(x).replace(/\t/g,",").replace(/#{255}/g,"").replace(/"/g,"").replace(/[\n\r]+/g,"\n").replace(/\n*$/,""); } | ||||
| 
 | ||||
| 
 | ||||
| wb = XLSX.readFile(INFILE, {cellNF: true}); | ||||
| 
 | ||||
| //XLSX.writeFile(wb, '/tmp/test-csv.xlsx');
 | ||||
| //var wb = XLSX.readFile('/tmp/test-csv.xlsx', {cellNF: true});
 | ||||
| 
 | ||||
| wb = XLSX.read(XLSX.write(wb, {type:"buffer", bookType:'xlsx'}), {cellNF: true}) | ||||
| 
 | ||||
| 
 | ||||
| var csv = fixcsv(XLSX.utils.make_csv(wb.Sheets[wb.SheetNames[SHEET]])) | ||||
| console.log('==================') | ||||
| console.log( csv); | ||||
| console.log('------------') | ||||
| var exp = fixcsv(fs.readFileSync(TESTFILE + SHEET+ '.csv','utf8')) | ||||
| console.log(exp) | ||||
| console.log('.............') | ||||
| console.log(csv==exp); | ||||
| 
 | ||||
| console.log(csv.length, exp.length) | ||||
| if (argv.d) { | ||||
| for (var i=0; i<csv.length; i++) { | ||||
|   console.log([csv[i], exp[i]], csv[i] ==exp[i]); | ||||
| } | ||||
| } | ||||
| //console.log(wb.Sheets[wb.SheetNames[0]].C2)
 | ||||
| 
 | ||||
							
								
								
									
										8
									
								
								test-open.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										8
									
								
								test-open.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| var XLSX = require('./'); | ||||
| 
 | ||||
| wbin = XLSX.readFile('/tmp/wb.xlsx', {type: "xlsx"}); | ||||
| 
 | ||||
| XLSX.writeFile(wbin, '/tmp/wb2.xlsx', { | ||||
|   defaultCellStyle: { font: { name: "Verdana", sz: 11, color: "FF00FF88"}, fill: {fgColor: {rgb: "FFFFAA00"}}} | ||||
| }); | ||||
| 
 | ||||
| @ -343,7 +343,7 @@ describe("Export styles", function () { | ||||
|             "t": "s" | ||||
|           }, | ||||
|           "B7": { | ||||
|             "v": "left", | ||||
|             "v": "center", | ||||
|             "s": { | ||||
|               "alignment": { | ||||
|                 "horizontal": "center" | ||||
| @ -352,7 +352,7 @@ describe("Export styles", function () { | ||||
|             "t": "s" | ||||
|           }, | ||||
|           "C7": { | ||||
|             "v": "left", | ||||
|             "v": "right", | ||||
|             "s": { | ||||
|               "alignment": { | ||||
|                 "horizontal": "right" | ||||
| @ -650,6 +650,7 @@ describe("Export styles", function () { | ||||
| 
 | ||||
|   it('can write to a buffer and read the file back', function () { | ||||
|     var wb2 = XLSX.read(XLSX.write(workbook, {type:"buffer", bookType: 'xlsx'}), {cellStyles: true, cellNF: true}) | ||||
|     XLSX.writeFile(wb2, '/tmp/wb2.xlsx',  { defaultCellStyle: defaultCellStyle }); | ||||
|     assert(basicallyEquals(workbook.Sheets.Main,wb2.Sheets.Main)); | ||||
|   }); | ||||
| 
 | ||||
|  | ||||
| @ -345,8 +345,6 @@ formula_stress_test.ods | ||||
| merge_cells.ods | ||||
| number_format.ods | ||||
| rich_text_stress.ods | ||||
| roo_Bibelbund.ods | ||||
| roo_Bibelbund1.ods | ||||
| roo_bbu.ods | ||||
| roo_boolean.ods | ||||
| roo_borders.ods | ||||
|  | ||||
							
								
								
									
										444
									
								
								xlsx.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										444
									
								
								xlsx.js
									
									
									
									
									
								
							| @ -2192,84 +2192,123 @@ var themes = {}; // shared themes | ||||
| 
 | ||||
| /* 18.8.21 fills CT_Fills */ | ||||
| function parse_fills(t, opts) { | ||||
| 	styles.Fills = []; | ||||
| 	var fill = {}; | ||||
| 	t[0].match(tagregex).forEach(function(x) { | ||||
| 		var y = parsexmltag(x); | ||||
| 		switch(y[0]) { | ||||
| 			case '<fills': case '<fills>': case '</fills>': break; | ||||
|   styles.Fills = []; | ||||
|   var fill = {}; | ||||
|   t[0].match(tagregex).forEach(function (x) { | ||||
|     var y = parsexmltag(x); | ||||
|     switch (y[0]) { | ||||
|       case '<fills': | ||||
|       case '<fills>': | ||||
|       case '</fills>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.20 fill CT_Fill */ | ||||
| 			case '<fill>': break; | ||||
| 			case '</fill>': styles.Fills.push(fill); fill = {}; break; | ||||
|       /* 18.8.20 fill CT_Fill */ | ||||
|       case '<fill>': | ||||
|         break; | ||||
|       case '</fill>': | ||||
|         styles.Fills.push(fill); | ||||
|         fill = {}; | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.32 patternFill CT_PatternFill */ | ||||
| 			case '<patternFill': | ||||
| 				if(y.patternType) fill.patternType = y.patternType; | ||||
| 				break; | ||||
| 			case '<patternFill/>': case '</patternFill>': break; | ||||
|       /* 18.8.32 patternFill CT_PatternFill */ | ||||
|       case '<patternFill': | ||||
|         if (y.patternType) fill.patternType = y.patternType; | ||||
|         break; | ||||
|       case '<patternFill/>': | ||||
|       case '</patternFill>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.3 bgColor CT_Color */ | ||||
| 			case '<bgColor': | ||||
| 				if(!fill.bgColor) fill.bgColor = {}; | ||||
|         if(y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10); | ||||
|         if(y.theme) fill.bgColor.theme = parseInt(y.theme, 10); | ||||
|         if(y.tint) fill.bgColor.tint = parseFloat(y.tint); | ||||
|       /* 18.8.3 bgColor CT_Color */ | ||||
|       case '<bgColor': | ||||
|         if (!fill.bgColor) fill.bgColor = {}; | ||||
|         if (y.indexed) fill.bgColor.indexed = parseInt(y.indexed, 10); | ||||
|         if (y.theme) fill.bgColor.theme = parseInt(y.theme, 10); | ||||
|         if (y.tint) fill.bgColor.tint = parseFloat(y.tint); | ||||
|         /* Excel uses ARGB strings */ | ||||
|         if(y.rgb) fill.bgColor.rgb = y.rgb;//.substring(y.rgb.length - 6);
 | ||||
| 				break; | ||||
| 			case '<bgColor/>': case '</bgColor>': break; | ||||
|         if (y.rgb) fill.bgColor.rgb = y.rgb;//.substring(y.rgb.length - 6);
 | ||||
|         break; | ||||
|       case '<bgColor/>': | ||||
|       case '</bgColor>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.19 fgColor CT_Color */ | ||||
| 			case '<fgColor': | ||||
| 				if(!fill.fgColor) fill.fgColor = {}; | ||||
| 				if(y.theme) fill.fgColor.theme = parseInt(y.theme, 10); | ||||
| 				if(y.tint) fill.fgColor.tint = parseFloat(y.tint); | ||||
| 				/* Excel uses ARGB strings */ | ||||
| 				if(y.rgb) fill.fgColor.rgb = y.rgb;//.substring(y.rgb.length - 6);
 | ||||
| 				break; | ||||
| 			case '<fgColor/>': case '</fgColor>': break; | ||||
|       /* 18.8.19 fgColor CT_Color */ | ||||
|       case '<fgColor': | ||||
|         if (!fill.fgColor) fill.fgColor = {}; | ||||
|         if (y.theme) fill.fgColor.theme = parseInt(y.theme, 10); | ||||
|         if (y.tint) fill.fgColor.tint = parseFloat(y.tint); | ||||
|         /* Excel uses ARGB strings */ | ||||
|         if (y.rgb) fill.fgColor.rgb = y.rgb;//.substring(y.rgb.length - 6);
 | ||||
|         break; | ||||
|       case '<fgColor/>': | ||||
|       case '</fgColor>': | ||||
|         break; | ||||
| 
 | ||||
| 			default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in fills'; | ||||
| 		} | ||||
| 	}); | ||||
|       default: | ||||
|         if (opts.WTF) throw 'unrecognized ' + y[0] + ' in fills'; | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function parse_fonts(t, opts) { | ||||
|   styles.Fonts = []; | ||||
|   var font = {}; | ||||
|   t[0].match(tagregex).forEach(function(x) { | ||||
|   t[0].match(tagregex).forEach(function (x) { | ||||
|     var y = parsexmltag(x); | ||||
|     switch(y[0]) { | ||||
|     switch (y[0]) { | ||||
| 
 | ||||
|       case '<fonts': case  '<fonts>': case '</fonts>': break; | ||||
|       case '<fonts': | ||||
|       case  '<fonts>': | ||||
|       case '</fonts>': | ||||
|         break; | ||||
|       case '<font': | ||||
|         break; | ||||
|       case '</font>': styles.Fonts.push(font); ;font = {}; break; | ||||
|       case '</font>': | ||||
|         styles.Fonts.push(font); | ||||
|         ; | ||||
|         font = {}; | ||||
|         break; | ||||
| 
 | ||||
|       case '<name': | ||||
|         if(y.val) font.name = y.val; | ||||
|         if (y.val) font.name = y.val; | ||||
|         break; | ||||
|       case '<name/>': | ||||
|       case '</name>': | ||||
|         break; | ||||
|       case '<name/>': case '</name>': break; | ||||
| 
 | ||||
| 
 | ||||
|       case '<b/>': font.bold = true;break; | ||||
|       case '<u/>':  font.underline = true;break; | ||||
|       case '<i/>':  font.italic = true;break; | ||||
|       case '<strike/>':  font.strike = true;break; | ||||
|       case '<outline/>':  font.outline = true;break; | ||||
|       case '<shadow/>':  font.shadow = true;break; | ||||
|       case '<b/>': | ||||
|         font.bold = true; | ||||
|         break; | ||||
|       case '<u/>': | ||||
|         font.underline = true; | ||||
|         break; | ||||
|       case '<i/>': | ||||
|         font.italic = true; | ||||
|         break; | ||||
|       case '<strike/>': | ||||
|         font.strike = true; | ||||
|         break; | ||||
|       case '<outline/>': | ||||
|         font.outline = true; | ||||
|         break; | ||||
|       case '<shadow/>': | ||||
|         font.shadow = true; | ||||
|         break; | ||||
| 
 | ||||
| 
 | ||||
|       case '<sz': | ||||
|         if(y.val) font.sz = y.val; | ||||
|         if (y.val) font.sz = y.val; | ||||
|         break; | ||||
|       case '<sz/>': | ||||
|       case '</sz>': | ||||
|         break; | ||||
|       case '<sz/>': case '</sz>': break; | ||||
| 
 | ||||
|       case '<vertAlign': | ||||
|         if(y.val) font.vertAlign = y.val; | ||||
|         if (y.val) font.vertAlign = y.val; | ||||
|         break; | ||||
|       case '<vertAlign/>': | ||||
|       case '</vertAlign>': | ||||
|         break; | ||||
|       case '<vertAlign/>': case '</vertAlign>': break; | ||||
| 
 | ||||
| 
 | ||||
|       case '<color': | ||||
| @ -2278,32 +2317,77 @@ function parse_fonts(t, opts) { | ||||
|         if (y.tint) font.color.tint = y.tint; | ||||
|         if (y.rgb) font.color.rgb = y.rgb; | ||||
|         break; | ||||
|       case '<color/>':case '</color>': break; | ||||
|       case '<color/>': | ||||
|       case '</color>': | ||||
|         break; | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function parse_borders(t, opts) { | ||||
|   styles.Borders = []; | ||||
|   var border = {}; | ||||
|   t[0].match(tagregex).forEach(function(x) { | ||||
|   var border = {}, sub_border = {}; | ||||
|   t[0].match(tagregex).forEach(function (x) { | ||||
|     var y = parsexmltag(x); | ||||
|     switch(y[0]) { | ||||
|       case '<borders': case  '<borders>': case '</borders>': break; | ||||
|       case '<border>': break; | ||||
|     switch (y[0]) { | ||||
|       case '<borders': | ||||
|       case  '<borders>': | ||||
|       case '</borders>': | ||||
|         break; | ||||
|       case '<border': | ||||
|       case '<border>': | ||||
|         border = {}; | ||||
|         if (y.diagonalUp) { border.diagonalUp = y.diagonalUp; } | ||||
|         if (y.diagonalDown) { border.diagonalDown = y.diagonalDown; } | ||||
|         styles.Borders.push(border); | ||||
| 
 | ||||
|         break; | ||||
|         break; | ||||
|       case '</border>': | ||||
|         styles.Fonts.push(border); | ||||
|         border = {}; break; | ||||
|         break; | ||||
| 
 | ||||
|       case '<left': | ||||
|         sub_border = border.left = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
|       case '<right': | ||||
|         sub_border = border.right = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
|       case '<top': | ||||
|         sub_border = border.top = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
|       case '<bottom': | ||||
|         sub_border = border.bottom = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
|       case '<diagonal': | ||||
|         sub_border = border.diagonal = {}; | ||||
|         if (y.style) { | ||||
|           sub_border.style = y.style; | ||||
|         } | ||||
|         break; | ||||
| 
 | ||||
|       case '<color': | ||||
|         if(y.style) border.style = y.style; | ||||
|         sub_border.color = {}; | ||||
|         if (y.theme) sub_border.color.theme = y.theme; | ||||
|         if (y.tint) sub_border.color.tint = y.tint; | ||||
|         if (y.rgb) sub_border.color.rgb = y.rgb; | ||||
|         break; | ||||
|       case '<name/>': case '</name>': break; | ||||
| 
 | ||||
|       case '<sz': | ||||
|         if(y.val) font.sz = y.val; | ||||
|       case '<name/>': | ||||
|       case '</name>': | ||||
|         break; | ||||
|       default: | ||||
|         break; | ||||
|       case '<sz/>': case '</sz>': break; | ||||
|     } | ||||
|   }); | ||||
| 
 | ||||
| @ -2311,111 +2395,153 @@ function parse_borders(t, opts) { | ||||
| 
 | ||||
| /* 18.8.31 numFmts CT_NumFmts */ | ||||
| function parse_numFmts(t, opts) { | ||||
| 	styles.NumberFmt = []; | ||||
| 	var k = keys(SSF._table); | ||||
| 	for(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]]; | ||||
| 	var m = t[0].match(tagregex); | ||||
| 	for(i=0; i < m.length; ++i) { | ||||
| 		var y = parsexmltag(m[i]); | ||||
| 		switch(y[0]) { | ||||
| 			case '<numFmts': case '</numFmts>': case '<numFmts/>': case '<numFmts>': break; | ||||
| 			case '<numFmt': { | ||||
| 				var f=unescapexml(utf8read(y.formatCode)), j=parseInt(y.numFmtId,10); | ||||
| 				styles.NumberFmt[j] = f; if(j>0) SSF.load(f,j); | ||||
| 			} break; | ||||
| 			default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts'; | ||||
| 		} | ||||
| 	} | ||||
|   styles.NumberFmt = []; | ||||
|   var k = keys(SSF._table); | ||||
|   for (var i = 0; i < k.length; ++i) styles.NumberFmt[k[i]] = SSF._table[k[i]]; | ||||
|   var m = t[0].match(tagregex); | ||||
|   for (i = 0; i < m.length; ++i) { | ||||
|     var y = parsexmltag(m[i]); | ||||
|     switch (y[0]) { | ||||
|       case '<numFmts': | ||||
|       case '</numFmts>': | ||||
|       case '<numFmts/>': | ||||
|       case '<numFmts>': | ||||
|         break; | ||||
|       case '<numFmt': | ||||
|       { | ||||
|         var f = unescapexml(utf8read(y.formatCode)), j = parseInt(y.numFmtId, 10); | ||||
|         styles.NumberFmt[j] = f; | ||||
|         if (j > 0) SSF.load(f, j); | ||||
|       } | ||||
|         break; | ||||
|       default: | ||||
|         if (opts.WTF) throw 'unrecognized ' + y[0] + ' in numFmts'; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| function write_numFmts(NF, opts) { | ||||
| 	var o = ["<numFmts>"]; | ||||
| 	[[5,8],[23,26],[41,44],[63,66],[164,392]].forEach(function(r) { | ||||
| 		for(var i = r[0]; i <= r[1]; ++i) if(NF[i] !== undefined) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])})); | ||||
| 	}); | ||||
| 	if(o.length === 1) return ""; | ||||
| 	o[o.length] = ("</numFmts>"); | ||||
| 	o[0] = writextag('numFmts', null, { count:o.length-2 }).replace("/>", ">"); | ||||
| 	return o.join(""); | ||||
|   var o = ["<numFmts>"]; | ||||
|   [ | ||||
|     [5, 8], | ||||
|     [23, 26], | ||||
|     [41, 44], | ||||
|     [63, 66], | ||||
|     [164, 392] | ||||
|   ].forEach(function (r) { | ||||
|     for (var i = r[0]; i <= r[1]; ++i) if (NF[i] !== undefined) o[o.length] = (writextag('numFmt', null, {numFmtId: i, formatCode: escapexml(NF[i])})); | ||||
|   }); | ||||
|   if (o.length === 1) return ""; | ||||
|   o[o.length] = ("</numFmts>"); | ||||
|   o[0] = writextag('numFmts', null, { count: o.length - 2 }).replace("/>", ">"); | ||||
|   return o.join(""); | ||||
| } | ||||
| 
 | ||||
| /* 18.8.10 cellXfs CT_CellXfs */ | ||||
| function parse_cellXfs(t, opts) { | ||||
| 	styles.CellXf = []; | ||||
| 	t[0].match(tagregex).forEach(function(x) { | ||||
| 		var y = parsexmltag(x); | ||||
| 		switch(y[0]) { | ||||
| 			case '<cellXfs': case '<cellXfs>': case '<cellXfs/>': case '</cellXfs>': break; | ||||
|   styles.CellXf = []; | ||||
|   var xf; | ||||
|   t[0].match(tagregex).forEach(function (x) { | ||||
|     var y = parsexmltag(x); | ||||
|     switch (y[0]) { | ||||
|       case '<cellXfs': | ||||
|       case '<cellXfs>': | ||||
|       case '<cellXfs/>': | ||||
|       case '</cellXfs>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.45 xf CT_Xf */ | ||||
| 			case '<xf': delete y[0]; | ||||
| 				if(y.numFmtId) y.numFmtId = parseInt(y.numFmtId, 10); | ||||
| 				if(y.fillId) y.fillId = parseInt(y.fillId, 10); | ||||
| 				styles.CellXf.push(y); break; | ||||
| 			case '</xf>': break; | ||||
|       /* 18.8.45 xf CT_Xf */ | ||||
|       case '<xf': | ||||
|           xf = y; | ||||
|           delete xf[0]; | ||||
|         delete y[0]; | ||||
|         if (xf.numFmtId) xf.numFmtId = parseInt(xf.numFmtId, 10); | ||||
|         if (xf.fillId) xf.fillId = parseInt(xf.fillId, 10); | ||||
|         styles.CellXf.push(xf); | ||||
|         break; | ||||
|       case '</xf>': | ||||
|         break; | ||||
| 
 | ||||
| 			/* 18.8.1 alignment CT_CellAlignment */ | ||||
| 			case '<alignment': case '<alignment/>': break; | ||||
|       /* 18.8.1 alignment CT_CellAlignment */ | ||||
|       case '<alignment': | ||||
|       case '<alignment/>': | ||||
|         var alignment = {} | ||||
|           if (y.vertical) { alignment.vertical = y.vertical;} | ||||
|         if (y.horizontal) { alignment.horizontal = y.horizontal;} | ||||
|           if (y.indent) { alignment.indent = y.indent; } | ||||
|           if (y.wrapText) { alignment.wrapText = y.wrapText; } | ||||
|           xf.alignment = alignment; | ||||
| 
 | ||||
| 			/* 18.8.33 protection CT_CellProtection */ | ||||
| 			case '<protection': case '</protection>': case '<protection/>': break; | ||||
|         break; | ||||
| 
 | ||||
| 			case '<extLst': case '</extLst>': break; | ||||
| 			case '<ext': break; | ||||
| 			default: if(opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs'; | ||||
| 		} | ||||
| 	}); | ||||
|       /* 18.8.33 protection CT_CellProtection */ | ||||
|       case '<protection': | ||||
|       case '</protection>': | ||||
|       case '<protection/>': | ||||
|         break; | ||||
| 
 | ||||
|       case '<extLst': | ||||
|       case '</extLst>': | ||||
|         break; | ||||
|       case '<ext': | ||||
|         break; | ||||
|       default: | ||||
|         if (opts.WTF) throw 'unrecognized ' + y[0] + ' in cellXfs'; | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| function write_cellXfs(cellXfs) { | ||||
| 	var o = []; | ||||
| 	o[o.length] = (writextag('cellXfs',null)); | ||||
| 	cellXfs.forEach(function(c) { o[o.length] = (writextag('xf', null, c)); }); | ||||
| 	o[o.length] = ("</cellXfs>"); | ||||
| 	if(o.length === 2) return ""; | ||||
| 	o[0] = writextag('cellXfs',null, {count:o.length-2}).replace("/>",">"); | ||||
| 	return o.join(""); | ||||
|   var o = []; | ||||
|   o[o.length] = (writextag('cellXfs', null)); | ||||
|   cellXfs.forEach(function (c) { | ||||
|     o[o.length] = (writextag('xf', null, c)); | ||||
|   }); | ||||
|   o[o.length] = ("</cellXfs>"); | ||||
|   if (o.length === 2) return ""; | ||||
|   o[0] = writextag('cellXfs', null, {count: o.length - 2}).replace("/>", ">"); | ||||
|   return o.join(""); | ||||
| } | ||||
| 
 | ||||
| /* 18.8 Styles CT_Stylesheet*/ | ||||
| var parse_sty_xml= (function make_pstyx() { | ||||
| var numFmtRegex = /<numFmts([^>]*)>.*<\/numFmts>/; | ||||
| var cellXfRegex = /<cellXfs([^>]*)>.*<\/cellXfs>/; | ||||
| var fillsRegex = /<fills([^>]*)>.*<\/fills>/; | ||||
| var bordersRegex = /<borders([^>]*)>.*<\/borders>/; | ||||
| var parse_sty_xml = (function make_pstyx() { | ||||
|   var numFmtRegex = /<numFmts([^>]*)>.*<\/numFmts>/; | ||||
|   var cellXfRegex = /<cellXfs([^>]*)>.*<\/cellXfs>/; | ||||
|   var fillsRegex = /<fills([^>]*)>.*<\/fills>/; | ||||
|   var bordersRegex = /<borders([^>]*)>.*<\/borders>/; | ||||
| 
 | ||||
| return function parse_sty_xml(data, opts) { | ||||
| 	/* 18.8.39 styleSheet CT_Stylesheet */ | ||||
| 	var t; | ||||
|   return function parse_sty_xml(data, opts) { | ||||
|     /* 18.8.39 styleSheet CT_Stylesheet */ | ||||
|     var t; | ||||
| 
 | ||||
| 	/* numFmts CT_NumFmts ? */ | ||||
| 	if((t=data.match(numFmtRegex))) parse_numFmts(t, opts); | ||||
|     /* numFmts CT_NumFmts ? */ | ||||
|     if ((t = data.match(numFmtRegex))) parse_numFmts(t, opts); | ||||
| 
 | ||||
| 	/* fonts CT_Fonts ? */ | ||||
| 	if((t=data.match(/<fonts([^>]*)>.*<\/fonts>/))) parse_fonts(t, opts) | ||||
|     /* fonts CT_Fonts ? */ | ||||
|     if ((t = data.match(/<fonts([^>]*)>.*<\/fonts>/))) parse_fonts(t, opts) | ||||
| 
 | ||||
| 	/* fills CT_Fills */ | ||||
| 	if((t=data.match(fillsRegex))) parse_fills(t, opts); | ||||
|     /* fills CT_Fills */ | ||||
|     if ((t = data.match(fillsRegex))) parse_fills(t, opts); | ||||
| 
 | ||||
| 	/* borders CT_Borders ? */ | ||||
| //  if ((t=data.match(bordersRegex))) parse_borders(t, opts);
 | ||||
| 	/* cellStyleXfs CT_CellStyleXfs ? */ | ||||
|     /* borders CT_Borders ? */ | ||||
|     if ((t = data.match(bordersRegex))) parse_borders(t, opts); | ||||
|     /* cellStyleXfs CT_CellStyleXfs ? */ | ||||
| 
 | ||||
| 	/* cellXfs CT_CellXfs ? */ | ||||
| 	if((t=data.match(cellXfRegex))) parse_cellXfs(t, opts); | ||||
|     /* cellXfs CT_CellXfs ? */ | ||||
|     if ((t = data.match(cellXfRegex))) parse_cellXfs(t, opts); | ||||
| 
 | ||||
| 	/* dxfs CT_Dxfs ? */ | ||||
| 	/* tableStyles CT_TableStyles ? */ | ||||
| 	/* colors CT_Colors ? */ | ||||
| 	/* extLst CT_ExtensionList ? */ | ||||
|     /* dxfs CT_Dxfs ? */ | ||||
|     /* tableStyles CT_TableStyles ? */ | ||||
|     /* colors CT_Colors ? */ | ||||
|     /* extLst CT_ExtensionList ? */ | ||||
| 
 | ||||
| 	return styles; | ||||
| }; | ||||
|     return styles; | ||||
|   }; | ||||
| })(); | ||||
| 
 | ||||
| var STYLES_XML_ROOT = writextag('styleSheet', null, { | ||||
| 	'xmlns': XMLNS.main[0], | ||||
| 	'xmlns:vt': XMLNS.vt | ||||
|   'xmlns': XMLNS.main[0], | ||||
|   'xmlns:vt': XMLNS.vt | ||||
| }); | ||||
| 
 | ||||
| RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"; | ||||
| @ -2426,19 +2552,22 @@ function write_sty_xml(wb, opts) { | ||||
|     return style_builder.toXml(); | ||||
|   } | ||||
| 
 | ||||
| 	var o = [XML_HEADER, STYLES_XML_ROOT], w; | ||||
| 	if((w = write_numFmts(wb.SSF)) != null) o[o.length] = w; | ||||
| 	o[o.length] = ('<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>'); | ||||
| 	o[o.length] = ('<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>'); | ||||
| 	o[o.length] = ('<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>'); | ||||
| 	o[o.length] = ('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>'); | ||||
| 	if((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w); | ||||
| 	o[o.length] = ('<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>'); | ||||
| 	o[o.length] = ('<dxfs count="0"/>'); | ||||
| 	o[o.length] = ('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>'); | ||||
|   var o = [XML_HEADER, STYLES_XML_ROOT], w; | ||||
|   if ((w = write_numFmts(wb.SSF)) != null) o[o.length] = w; | ||||
|   o[o.length] = ('<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>'); | ||||
|   o[o.length] = ('<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>'); | ||||
|   o[o.length] = ('<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>'); | ||||
|   o[o.length] = ('<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>'); | ||||
|   if ((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w); | ||||
|   o[o.length] = ('<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>'); | ||||
|   o[o.length] = ('<dxfs count="0"/>'); | ||||
|   o[o.length] = ('<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>'); | ||||
| 
 | ||||
| 	if(o.length>2){ o[o.length] = ('</styleSheet>'); o[1]=o[1].replace("/>",">"); } | ||||
| 	return o.join(""); | ||||
|   if (o.length > 2) { | ||||
|     o[o.length] = ('</styleSheet>'); | ||||
|     o[1] = o[1].replace("/>", ">"); | ||||
|   } | ||||
|   return o.join(""); | ||||
| } | ||||
| /* [MS-XLSB] 2.4.651 BrtFmt */ | ||||
| function parse_BrtFmt(data, length) { | ||||
| @ -2892,6 +3021,7 @@ function get_cell_style(styles, cell, opts) { | ||||
| function get_cell_style_csf(cellXf) { | ||||
| 
 | ||||
|   if (cellXf) { | ||||
| 
 | ||||
|     var s = {} | ||||
| 
 | ||||
|     if (typeof cellXf.numFmtId != undefined)  { | ||||
| @ -2906,8 +3036,12 @@ function get_cell_style_csf(cellXf) { | ||||
|       s.font = styles.Fonts[cellXf.fontId]; | ||||
|     } | ||||
|     if (cellXf.borderId) { | ||||
| //      s.border = styles.Borders[cellXf.borderId];
 | ||||
|       s.border = styles.Borders[cellXf.borderId]; | ||||
|     } | ||||
|     if (cellXf.applyAlignment==1) { | ||||
|       s.alignment = cellXf.alignment; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     return s; | ||||
|   } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user