forked from sheetjs/sheetjs
		
	Merge remote-tracking branch 'origin/master' into beta
This commit is contained in:
		
						commit
						d76234ae80
					
				
							
								
								
									
										
											BIN
										
									
								
								.DS_Store
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								.DS_Store
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -19,3 +19,9 @@ tmp | ||||
| *.htm | ||||
| *.html | ||||
| *.sheetjs | ||||
| 
 | ||||
| lab/ | ||||
| test_files | ||||
| example.js | ||||
| example2.js | ||||
| .idea | ||||
|  | ||||
| @ -1,5 +0,0 @@ | ||||
| <component name="DependencyValidationManager"> | ||||
|   <state> | ||||
|     <option name="SKIP_IMPORT_STATEMENTS" value="false" /> | ||||
|   </state> | ||||
| </component> | ||||
| @ -126,7 +126,7 @@ function write_ws_xml_cols(ws, cols) { | ||||
| } | ||||
| 
 | ||||
| function write_ws_xml_cell(cell, ref, ws, opts, idx, wb) { | ||||
| 	if(cell.v === undefined) return ""; | ||||
| 	if(cell.v === undefined && cell.s === undefined) return ""; | ||||
| 	var vv = ""; | ||||
| 	var oldt = cell.t, oldv = cell.v; | ||||
| 	switch(cell.t) { | ||||
| @ -213,7 +213,7 @@ return function parse_ws_xml_data(sdata, s, opts, guess) { | ||||
| 			if(opts.cellFormula && (cref=d.match(match_f))!== null) p.f=unescapexml(cref[1]); | ||||
| 
 | ||||
| 			/* SCHEMA IS ACTUALLY INCORRECT HERE.  IF A CELL HAS NO T, EMIT "" */ | ||||
| 			if(tag.t === undefined && p.v === undefined) { | ||||
| 			if(tag.t === undefined && tag.s === undefined && p.v === undefined) { | ||||
| 				if(!opts.sheetStubs) continue; | ||||
| 				p.t = "stub"; | ||||
| 			} | ||||
| @ -222,7 +222,10 @@ return function parse_ws_xml_data(sdata, s, opts, guess) { | ||||
| 			if(guess.e.c < idx) guess.e.c = idx; | ||||
| 			/* 18.18.11 t ST_CellType */ | ||||
| 			switch(p.t) { | ||||
| 				case 'n': p.v = parseFloat(p.v); break; | ||||
| 				case 'n': | ||||
|           p.v = parseFloat(p.v); | ||||
|           if(isNaN(p.v)) p.v = "" // we don't want NaN if p.v is null
 | ||||
|           break; | ||||
| 				case 's': | ||||
| 					sstr = strs[parseInt(p.v, 10)]; | ||||
| 					p.v = sstr.t; | ||||
|  | ||||
							
								
								
									
										151
									
								
								example.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										151
									
								
								example.js
									
									
									
									
									
								
							| @ -1,151 +0,0 @@ | ||||
| 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"}}}}, | ||||
|         {v: "right to left", s: {alignment: {readingOrder: 2}}} | ||||
|       ] | ||||
|     ]).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) | ||||
							
								
								
									
										10
									
								
								tests/test-min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								tests/test-min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| var X = require('./xlsx.js'); | ||||
| var file = 'test_files/2013/apachepoi_44861.xls.xlsb'; | ||||
| var file = 'test_files/apachepoi_44861.xls'; | ||||
| var opts = {cellNF: true}; | ||||
| describe('from 2013', function() { | ||||
| 		it('should parse', function() { | ||||
| 			var wb = X.readFile(file, opts); | ||||
| 		}); | ||||
| 	}); | ||||
| 
 | ||||
| @ -1,4 +1,4 @@ | ||||
| var XLSX = require('./'); | ||||
| var XLSX = require('../.'); | ||||
| 
 | ||||
| var JSZip = require('jszip'); | ||||
| var fs = require('fs'); | ||||
| @ -43,6 +43,38 @@ function basicallyEquals(left, right) { | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| describe('styles with blank cells', function () { | ||||
|   it ('retains styles with blank cells', function() { | ||||
| 
 | ||||
| 
 | ||||
|     var OUTFILE = '/tmp/ex1.xlsx'; | ||||
|     var OUTFILE2 = '/tmp/ex1a.xlsx'; | ||||
| 
 | ||||
|     var workbook = { | ||||
|       SheetNames : ["Sheet1"], | ||||
|       Sheets: { | ||||
|         "Sheet1": { | ||||
|           "B2": {v: "Top left", s: { border: { top: { style: 'medium', color: { rgb: "FFFFAA00"}}, left: { style: 'medium', color: { rgb: "FFFFAA00"}} }}}, | ||||
|           "C2": {v: "Top right", s: { border: { top: { style: 'medium', color: { rgb: "FFFFAA00"}}, right: { style: 'medium', color: { rgb: "FFFFAA00"}} }}}, | ||||
|           "B3": {v: "Bottom left", s: { border: { bottom: { style: 'medium', color: { rgb: "FFFFAA00"}}, left: { style: 'medium', color: { rgb: "FFFFAA00"}} }}}, | ||||
|           "C3": {v: "", s: { border: { bottom: { style: 'medium', color: { rgb: "FFFFAA00"}}, right: { style: 'medium', color: { rgb: "FFFFAA00"}} }}}, | ||||
|           "!ref":"B2:C3" | ||||
|         } | ||||
|       } | ||||
|     }; | ||||
| 
 | ||||
|     // write the file and read it back...
 | ||||
|     XLSX.writeFile(workbook, OUTFILE, {bookType: 'xlsx', bookSST: false}); | ||||
|     var workbook2 = XLSX.readFile(OUTFILE, {cellStyles: true}); | ||||
|     assert(basicallyEquals(workbook.Sheets, workbook2.Sheets)); | ||||
| 
 | ||||
|     XLSX.writeFile(workbook2, OUTFILE2, {bookType: 'xlsx', bookSST: false}); | ||||
|     var workbook3 = XLSX.readFile(OUTFILE2, {cellStyles: true}); | ||||
|     assert(basicallyEquals(workbook.Sheets, workbook3.Sheets)) | ||||
|   }); | ||||
| }); | ||||
| 
 | ||||
| describe("Export styles", function () { | ||||
|   var workbook, wbout, wbin; | ||||
| 
 | ||||
| @ -658,4 +690,5 @@ describe("Export styles", function () { | ||||
|     assert(basicallyEquals(workbook.Sheets.Main,wb2.Sheets.Main)); | ||||
|   }); | ||||
| 
 | ||||
| }); | ||||
| }); | ||||
| 
 | ||||
							
								
								
									
										9
									
								
								xlsx.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										9
									
								
								xlsx.js
									
									
									
									
									
								
							| @ -7651,7 +7651,7 @@ function write_ws_xml_cols(ws, cols) { | ||||
| } | ||||
| 
 | ||||
| function write_ws_xml_cell(cell, ref, ws, opts, idx, wb) { | ||||
| 	if(cell.v === undefined) return ""; | ||||
| 	if(cell.v === undefined && cell.s === undefined) return ""; | ||||
| 	var vv = ""; | ||||
| 	var oldt = cell.t, oldv = cell.v; | ||||
| 	switch(cell.t) { | ||||
| @ -7738,7 +7738,7 @@ return function parse_ws_xml_data(sdata, s, opts, guess) { | ||||
| 			if(opts.cellFormula && (cref=d.match(match_f))!== null) p.f=unescapexml(cref[1]); | ||||
| 
 | ||||
| 			/* SCHEMA IS ACTUALLY INCORRECT HERE.  IF A CELL HAS NO T, EMIT "" */ | ||||
| 			if(tag.t === undefined && p.v === undefined) { | ||||
| 			if(tag.t === undefined && tag.s === undefined && p.v === undefined) { | ||||
| 				if(!opts.sheetStubs) continue; | ||||
| 				p.t = "stub"; | ||||
| 			} | ||||
| @ -7747,7 +7747,10 @@ return function parse_ws_xml_data(sdata, s, opts, guess) { | ||||
| 			if(guess.e.c < idx) guess.e.c = idx; | ||||
| 			/* 18.18.11 t ST_CellType */ | ||||
| 			switch(p.t) { | ||||
| 				case 'n': p.v = parseFloat(p.v); break; | ||||
| 				case 'n': | ||||
|           p.v = parseFloat(p.v); | ||||
|           if(isNaN(p.v)) p.v = "" // we don't want NaN if p.v is null
 | ||||
|           break; | ||||
| 				case 's': | ||||
| 					sstr = strs[parseInt(p.v, 10)]; | ||||
| 					p.v = sstr.t; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user