forked from sheetjs/sheetjs
		
	SYLK process 1904 dates (fixes #1545 h/t @Slayess)
This commit is contained in:
		
							parent
							
								
									eee39946e3
								
							
						
					
					
						commit
						87e826f299
					
				| @ -407,6 +407,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		var next_cell_format/*:string|null*/ = null; | ||||
| 		var sht = {}, rowinfo/*:Array<RowInfo>*/ = [], colinfo/*:Array<ColInfo>*/ = [], cw/*:Array<string>*/ = []; | ||||
| 		var Mval = 0, j; | ||||
| 		var wb = { Workbook: { WBProps: {} } }; | ||||
| 		if(+opts.codepage >= 0) set_cp(+opts.codepage); | ||||
| 		for (; ri !== records.length; ++ri) { | ||||
| 			Mval = 0; | ||||
| @ -417,7 +418,14 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			case 'ID': break; /* header */ | ||||
| 			case 'E': break; /* EOF */ | ||||
| 			case 'B': break; /* dimensions */ | ||||
| 			case 'O': break; /* options? */ | ||||
| 			case 'O': /* workbook options */ | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'V': { | ||||
| 					var d1904 = parseInt(record[rj].slice(1), 10); | ||||
| 					// NOTE: it is technically an error if d1904 >= 5 or < 0
 | ||||
| 					if(d1904 >= 1 && d1904 <= 4) wb.Workbook.WBProps.date1904 = true; | ||||
| 				} break; | ||||
| 			} break; | ||||
| 			case 'W': break; /* window? */ | ||||
| 			case 'P': | ||||
| 				if(record[1].charAt(0) == 'P') | ||||
| @ -427,9 +435,9 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'A': break; // TODO: comment
 | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1), 10)-1; C_seen_X = true; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; if(!C_seen_X) C = 0; | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'K': | ||||
| @ -439,7 +447,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 					else if(val === 'FALSE') val = false; | ||||
| 					else if(!isNaN(fuzzynum(val))) { | ||||
| 						val = fuzzynum(val); | ||||
| 						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val); | ||||
| 						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(wb.Workbook.WBProps.date1904 ? val + 1462 : val); | ||||
| 					} else if(!isNaN(fuzzydate(val).getDate())) { | ||||
| 						val = parseDate(val); | ||||
| 					} | ||||
| @ -456,8 +464,8 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 					arr[R][C] = [arr[R][C], "S5S"]; | ||||
| 					break; | ||||
| 				case 'G': break; // unknown
 | ||||
| 				case 'R': _R = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'C': _C = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'R': _R = parseInt(record[rj].slice(1), 10)-1; break; | ||||
| 				case 'C': _C = parseInt(record[rj].slice(1), 10)-1; break; | ||||
| 				default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); | ||||
| 			} | ||||
| 			if(C_seen_K) { | ||||
| @ -475,16 +483,16 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			case 'F': | ||||
| 			var F_seen = 0; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1), 10)-1; ++F_seen; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; /*C = 0;*/ | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1), 10) / 20; break; | ||||
| 				case 'F': break; /* ??? */ | ||||
| 				case 'G': break; /* hide grid */ | ||||
| 				case 'P': | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1))]; | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1), 10)]; | ||||
| 					break; | ||||
| 				case 'S': break; /* cell style */ | ||||
| 				case 'D': break; /* column */ | ||||
| @ -496,11 +504,11 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 						colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); | ||||
| 					} break; | ||||
| 				case 'C': /* default column format */ | ||||
| 					C = parseInt(record[rj].slice(1))-1; | ||||
| 					C = parseInt(record[rj].slice(1), 10)-1; | ||||
| 					if(!colinfo[C]) colinfo[C] = {}; | ||||
| 					break; | ||||
| 				case 'R': /* row properties */ | ||||
| 					R = parseInt(record[rj].slice(1))-1; | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; | ||||
| 					if(!rowinfo[R]) rowinfo[R] = {}; | ||||
| 					if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } | ||||
| 					else if(Mval === 0) rowinfo[R].hidden = true; | ||||
| @ -514,19 +522,19 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		if(rowinfo.length > 0) sht['!rows'] = rowinfo; | ||||
| 		if(colinfo.length > 0) sht['!cols'] = colinfo; | ||||
| 		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); | ||||
| 		return [arr, sht]; | ||||
| 		return [arr, sht, wb]; | ||||
| 	} | ||||
| 
 | ||||
| 	function sylk_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { | ||||
| 	function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { | ||||
| 		var aoasht = sylk_to_aoa(d, opts); | ||||
| 		var aoa = aoasht[0], ws = aoasht[1]; | ||||
| 		var aoa = aoasht[0], ws = aoasht[1], wb = aoasht[2]; | ||||
| 		var o = aoa_to_sheet(aoa, opts); | ||||
| 		keys(ws).forEach(function(k) { o[k] = ws[k]; }); | ||||
| 		return o; | ||||
| 		var outwb = sheet_to_workbook(o, opts); | ||||
| 		keys(wb).forEach(function(k) { outwb[k] = wb[k]; }); | ||||
| 		return outwb; | ||||
| 	} | ||||
| 
 | ||||
| 	function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); } | ||||
| 
 | ||||
| 	function write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*//*::, opts*/)/*:string*/ { | ||||
| 		var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K"; | ||||
| 		switch(cell.t) { | ||||
| @ -565,7 +573,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 	} | ||||
| 
 | ||||
| 	function sheet_to_sylk(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ { | ||||
| 		var preamble/*:Array<string>*/ = ["ID;PWXL;N;E"], o/*:Array<string>*/ = []; | ||||
| 		var preamble/*:Array<string>*/ = ["ID;PSheetJS;N;E"], o/*:Array<string>*/ = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var RS = "\r\n"; | ||||
| @ -589,7 +597,6 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 
 | ||||
| 	return { | ||||
| 		to_workbook: sylk_to_workbook, | ||||
| 		to_sheet: sylk_to_sheet, | ||||
| 		from_sheet: sheet_to_sylk | ||||
| 	}; | ||||
| })(); | ||||
|  | ||||
| @ -895,7 +895,7 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 						type = p.read_shift(1); | ||||
| 						sname = cnt == 0 ? "" : p.read_shift(cnt, 'cstr'); | ||||
| 					} | ||||
| 					if(!sname) sname = XLSX.utils.encode_col(sidx); | ||||
| 					if(!sname) sname = encode_col(sidx); | ||||
| 					/* TODO: backfill empty sheets */ | ||||
| 				} break; | ||||
| 				case 0x0602: { /* EOS */ | ||||
|  | ||||
							
								
								
									
										13
									
								
								test.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										13
									
								
								test.js
									
									
									
									
									
								
							| @ -2183,6 +2183,19 @@ describe('sylk', function() { | ||||
| 			} | ||||
| 		} : null); | ||||
| 	}); | ||||
| 	describe('date system', function() { | ||||
| 		function make_slk(d1904) { return "ID;PSheetJS\nP;Pd\\/m\\/yy\nP;Pd\\/m\\/yyyy\n" + (d1904 != null ? "O;D;V" + d1904 : "") + "\nF;P0;FG0G;X1;Y1\nC;K1\nE"; } | ||||
| 		it('should default to 1900', function() { | ||||
| 			assert.equal(get_cell(X.read(make_slk(), {type: "binary"}).Sheets.Sheet1, "A1").v, 1); | ||||
| 			assert(get_cell(X.read(make_slk(), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() < 1902); | ||||
| 			assert.equal(get_cell(X.read(make_slk(5), {type: "binary"}).Sheets.Sheet1, "A1").v, 1); | ||||
| 			assert(get_cell(X.read(make_slk(5), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() < 1902); | ||||
| 		}); | ||||
| 		it('should use 1904 when specified', function() { | ||||
| 			assert(get_cell(X.read(make_slk(1), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() > 1902); | ||||
| 			assert(get_cell(X.read(make_slk(4), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() > 1902); | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
| (typeof Uint8Array !== "undefined" ? describe : describe.skip)('numbers', function() { | ||||
|  | ||||
							
								
								
									
										13
									
								
								test.ts
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										13
									
								
								test.ts
									
									
									
									
									
								
							| @ -2115,6 +2115,19 @@ Deno.test('sylk', async function(t) { | ||||
| 			} | ||||
| 		}); | ||||
| 	}); | ||||
| 	await t.step('date system', async function(t){ | ||||
| 		function make_slk(d1904?: number) { return "ID;PSheetJS\nP;Pd\\/m\\/yy\nP;Pd\\/m\\/yyyy\n" + (d1904 != null ? "O;D;V" + d1904 : "") + "\nF;P0;FG0G;X1;Y1\nC;K1\nE"; } | ||||
| 		await t.step('should default to 1900', async function(t) { | ||||
| 			assert.equal(get_cell(X.read(make_slk(), {type: "binary"}).Sheets["Sheet1"], "A1").v, 1); | ||||
| 			assert.assert(get_cell(X.read(make_slk(), {type: "binary", cellDates: true}).Sheets["Sheet1"], "A1").v.getFullYear() < 1902); | ||||
| 			assert.equal(get_cell(X.read(make_slk(5), {type: "binary"}).Sheets["Sheet1"], "A1").v, 1); | ||||
| 			assert.assert(get_cell(X.read(make_slk(5), {type: "binary", cellDates: true}).Sheets["Sheet1"], "A1").v.getFullYear() < 1902); | ||||
| 		}); | ||||
| 		await t.step('should use 1904 when specified', async function(t) { | ||||
| 			assert.assert(get_cell(X.read(make_slk(1), {type: "binary", cellDates: true}).Sheets["Sheet1"], "A1").v.getFullYear() > 1902); | ||||
| 			assert.assert(get_cell(X.read(make_slk(4), {type: "binary", cellDates: true}).Sheets["Sheet1"], "A1").v.getFullYear() > 1902); | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
| Deno.test('numbers', async function(t) { | ||||
|  | ||||
							
								
								
									
										13
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										13
									
								
								tests/core.js
									
									
									
										generated
									
									
									
								
							| @ -2183,6 +2183,19 @@ describe('sylk', function() { | ||||
| 			} | ||||
| 		} : null); | ||||
| 	}); | ||||
| 	describe('date system', function() { | ||||
| 		function make_slk(d1904) { return "ID;PSheetJS\nP;Pd\\/m\\/yy\nP;Pd\\/m\\/yyyy\n" + (d1904 != null ? "O;D;V" + d1904 : "") + "\nF;P0;FG0G;X1;Y1\nC;K1\nE"; } | ||||
| 		it('should default to 1900', function() { | ||||
| 			assert.equal(get_cell(X.read(make_slk(), {type: "binary"}).Sheets.Sheet1, "A1").v, 1); | ||||
| 			assert(get_cell(X.read(make_slk(), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() < 1902); | ||||
| 			assert.equal(get_cell(X.read(make_slk(5), {type: "binary"}).Sheets.Sheet1, "A1").v, 1); | ||||
| 			assert(get_cell(X.read(make_slk(5), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() < 1902); | ||||
| 		}); | ||||
| 		it('should use 1904 when specified', function() { | ||||
| 			assert(get_cell(X.read(make_slk(1), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() > 1902); | ||||
| 			assert(get_cell(X.read(make_slk(4), {type: "binary", cellDates: true}).Sheets.Sheet1, "A1").v.getFullYear() > 1902); | ||||
| 		}); | ||||
| 	}); | ||||
| }); | ||||
| 
 | ||||
| (typeof Uint8Array !== "undefined" ? describe : describe.skip)('numbers', function() { | ||||
|  | ||||
							
								
								
									
										35
									
								
								tests/fixtures.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										35
									
								
								tests/fixtures.js
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										49
									
								
								xlsx.flow.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										49
									
								
								xlsx.flow.js
									
									
									
									
									
								
							| @ -7958,6 +7958,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		var next_cell_format/*:string|null*/ = null; | ||||
| 		var sht = {}, rowinfo/*:Array<RowInfo>*/ = [], colinfo/*:Array<ColInfo>*/ = [], cw/*:Array<string>*/ = []; | ||||
| 		var Mval = 0, j; | ||||
| 		var wb = { Workbook: { WBProps: {} } }; | ||||
| 		if(+opts.codepage >= 0) set_cp(+opts.codepage); | ||||
| 		for (; ri !== records.length; ++ri) { | ||||
| 			Mval = 0; | ||||
| @ -7968,7 +7969,14 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			case 'ID': break; /* header */ | ||||
| 			case 'E': break; /* EOF */ | ||||
| 			case 'B': break; /* dimensions */ | ||||
| 			case 'O': break; /* options? */ | ||||
| 			case 'O': /* workbook options */ | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'V': { | ||||
| 					var d1904 = parseInt(record[rj].slice(1), 10); | ||||
| 					// NOTE: it is technically an error if d1904 >= 5 or < 0
 | ||||
| 					if(d1904 >= 1 && d1904 <= 4) wb.Workbook.WBProps.date1904 = true; | ||||
| 				} break; | ||||
| 			} break; | ||||
| 			case 'W': break; /* window? */ | ||||
| 			case 'P': | ||||
| 				if(record[1].charAt(0) == 'P') | ||||
| @ -7978,9 +7986,9 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'A': break; // TODO: comment
 | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1), 10)-1; C_seen_X = true; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; if(!C_seen_X) C = 0; | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'K': | ||||
| @ -7990,7 +7998,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 					else if(val === 'FALSE') val = false; | ||||
| 					else if(!isNaN(fuzzynum(val))) { | ||||
| 						val = fuzzynum(val); | ||||
| 						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val); | ||||
| 						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(wb.Workbook.WBProps.date1904 ? val + 1462 : val); | ||||
| 					} else if(!isNaN(fuzzydate(val).getDate())) { | ||||
| 						val = parseDate(val); | ||||
| 					} | ||||
| @ -8007,8 +8015,8 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 					arr[R][C] = [arr[R][C], "S5S"]; | ||||
| 					break; | ||||
| 				case 'G': break; // unknown
 | ||||
| 				case 'R': _R = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'C': _C = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'R': _R = parseInt(record[rj].slice(1), 10)-1; break; | ||||
| 				case 'C': _C = parseInt(record[rj].slice(1), 10)-1; break; | ||||
| 				default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); | ||||
| 			} | ||||
| 			if(C_seen_K) { | ||||
| @ -8026,16 +8034,16 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			case 'F': | ||||
| 			var F_seen = 0; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1), 10)-1; ++F_seen; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; /*C = 0;*/ | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1), 10) / 20; break; | ||||
| 				case 'F': break; /* ??? */ | ||||
| 				case 'G': break; /* hide grid */ | ||||
| 				case 'P': | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1))]; | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1), 10)]; | ||||
| 					break; | ||||
| 				case 'S': break; /* cell style */ | ||||
| 				case 'D': break; /* column */ | ||||
| @ -8047,11 +8055,11 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 						colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); | ||||
| 					} break; | ||||
| 				case 'C': /* default column format */ | ||||
| 					C = parseInt(record[rj].slice(1))-1; | ||||
| 					C = parseInt(record[rj].slice(1), 10)-1; | ||||
| 					if(!colinfo[C]) colinfo[C] = {}; | ||||
| 					break; | ||||
| 				case 'R': /* row properties */ | ||||
| 					R = parseInt(record[rj].slice(1))-1; | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; | ||||
| 					if(!rowinfo[R]) rowinfo[R] = {}; | ||||
| 					if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } | ||||
| 					else if(Mval === 0) rowinfo[R].hidden = true; | ||||
| @ -8065,19 +8073,19 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		if(rowinfo.length > 0) sht['!rows'] = rowinfo; | ||||
| 		if(colinfo.length > 0) sht['!cols'] = colinfo; | ||||
| 		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); | ||||
| 		return [arr, sht]; | ||||
| 		return [arr, sht, wb]; | ||||
| 	} | ||||
| 
 | ||||
| 	function sylk_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { | ||||
| 	function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { | ||||
| 		var aoasht = sylk_to_aoa(d, opts); | ||||
| 		var aoa = aoasht[0], ws = aoasht[1]; | ||||
| 		var aoa = aoasht[0], ws = aoasht[1], wb = aoasht[2]; | ||||
| 		var o = aoa_to_sheet(aoa, opts); | ||||
| 		keys(ws).forEach(function(k) { o[k] = ws[k]; }); | ||||
| 		return o; | ||||
| 		var outwb = sheet_to_workbook(o, opts); | ||||
| 		keys(wb).forEach(function(k) { outwb[k] = wb[k]; }); | ||||
| 		return outwb; | ||||
| 	} | ||||
| 
 | ||||
| 	function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); } | ||||
| 
 | ||||
| 	function write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*//*::, opts*/)/*:string*/ { | ||||
| 		var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K"; | ||||
| 		switch(cell.t) { | ||||
| @ -8116,7 +8124,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 	} | ||||
| 
 | ||||
| 	function sheet_to_sylk(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ { | ||||
| 		var preamble/*:Array<string>*/ = ["ID;PWXL;N;E"], o/*:Array<string>*/ = []; | ||||
| 		var preamble/*:Array<string>*/ = ["ID;PSheetJS;N;E"], o/*:Array<string>*/ = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var RS = "\r\n"; | ||||
| @ -8140,7 +8148,6 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 
 | ||||
| 	return { | ||||
| 		to_workbook: sylk_to_workbook, | ||||
| 		to_sheet: sylk_to_sheet, | ||||
| 		from_sheet: sheet_to_sylk | ||||
| 	}; | ||||
| })(); | ||||
| @ -9474,7 +9481,7 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 						type = p.read_shift(1); | ||||
| 						sname = cnt == 0 ? "" : p.read_shift(cnt, 'cstr'); | ||||
| 					} | ||||
| 					if(!sname) sname = XLSX.utils.encode_col(sidx); | ||||
| 					if(!sname) sname = encode_col(sidx); | ||||
| 					/* TODO: backfill empty sheets */ | ||||
| 				} break; | ||||
| 				case 0x0602: { /* EOS */ | ||||
|  | ||||
							
								
								
									
										49
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										49
									
								
								xlsx.js
									
									
									
										generated
									
									
									
								
							| @ -7868,6 +7868,7 @@ var SYLK = (function() { | ||||
| 		var next_cell_format = null; | ||||
| 		var sht = {}, rowinfo = [], colinfo = [], cw = []; | ||||
| 		var Mval = 0, j; | ||||
| 		var wb = { Workbook: { WBProps: {} } }; | ||||
| 		if(+opts.codepage >= 0) set_cp(+opts.codepage); | ||||
| 		for (; ri !== records.length; ++ri) { | ||||
| 			Mval = 0; | ||||
| @ -7878,7 +7879,14 @@ var SYLK = (function() { | ||||
| 			case 'ID': break; /* header */ | ||||
| 			case 'E': break; /* EOF */ | ||||
| 			case 'B': break; /* dimensions */ | ||||
| 			case 'O': break; /* options? */ | ||||
| 			case 'O': /* workbook options */ | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'V': { | ||||
| 					var d1904 = parseInt(record[rj].slice(1), 10); | ||||
| 					// NOTE: it is technically an error if d1904 >= 5 or < 0
 | ||||
| 					if(d1904 >= 1 && d1904 <= 4) wb.Workbook.WBProps.date1904 = true; | ||||
| 				} break; | ||||
| 			} break; | ||||
| 			case 'W': break; /* window? */ | ||||
| 			case 'P': | ||||
| 				if(record[1].charAt(0) == 'P') | ||||
| @ -7888,9 +7896,9 @@ var SYLK = (function() { | ||||
| 			var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'A': break; // TODO: comment
 | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1), 10)-1; C_seen_X = true; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; if(!C_seen_X) C = 0; | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'K': | ||||
| @ -7900,7 +7908,7 @@ var SYLK = (function() { | ||||
| 					else if(val === 'FALSE') val = false; | ||||
| 					else if(!isNaN(fuzzynum(val))) { | ||||
| 						val = fuzzynum(val); | ||||
| 						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val); | ||||
| 						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(wb.Workbook.WBProps.date1904 ? val + 1462 : val); | ||||
| 					} else if(!isNaN(fuzzydate(val).getDate())) { | ||||
| 						val = parseDate(val); | ||||
| 					} | ||||
| @ -7917,8 +7925,8 @@ var SYLK = (function() { | ||||
| 					arr[R][C] = [arr[R][C], "S5S"]; | ||||
| 					break; | ||||
| 				case 'G': break; // unknown
 | ||||
| 				case 'R': _R = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'C': _C = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'R': _R = parseInt(record[rj].slice(1), 10)-1; break; | ||||
| 				case 'C': _C = parseInt(record[rj].slice(1), 10)-1; break; | ||||
| 				default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); | ||||
| 			} | ||||
| 			if(C_seen_K) { | ||||
| @ -7936,16 +7944,16 @@ var SYLK = (function() { | ||||
| 			case 'F': | ||||
| 			var F_seen = 0; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1), 10)-1; ++F_seen; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; /*C = 0;*/ | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1), 10) / 20; break; | ||||
| 				case 'F': break; /* ??? */ | ||||
| 				case 'G': break; /* hide grid */ | ||||
| 				case 'P': | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1))]; | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1), 10)]; | ||||
| 					break; | ||||
| 				case 'S': break; /* cell style */ | ||||
| 				case 'D': break; /* column */ | ||||
| @ -7957,11 +7965,11 @@ var SYLK = (function() { | ||||
| 						colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); | ||||
| 					} break; | ||||
| 				case 'C': /* default column format */ | ||||
| 					C = parseInt(record[rj].slice(1))-1; | ||||
| 					C = parseInt(record[rj].slice(1), 10)-1; | ||||
| 					if(!colinfo[C]) colinfo[C] = {}; | ||||
| 					break; | ||||
| 				case 'R': /* row properties */ | ||||
| 					R = parseInt(record[rj].slice(1))-1; | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; | ||||
| 					if(!rowinfo[R]) rowinfo[R] = {}; | ||||
| 					if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } | ||||
| 					else if(Mval === 0) rowinfo[R].hidden = true; | ||||
| @ -7975,19 +7983,19 @@ var SYLK = (function() { | ||||
| 		if(rowinfo.length > 0) sht['!rows'] = rowinfo; | ||||
| 		if(colinfo.length > 0) sht['!cols'] = colinfo; | ||||
| 		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); | ||||
| 		return [arr, sht]; | ||||
| 		return [arr, sht, wb]; | ||||
| 	} | ||||
| 
 | ||||
| 	function sylk_to_sheet(d, opts) { | ||||
| 	function sylk_to_workbook(d, opts) { | ||||
| 		var aoasht = sylk_to_aoa(d, opts); | ||||
| 		var aoa = aoasht[0], ws = aoasht[1]; | ||||
| 		var aoa = aoasht[0], ws = aoasht[1], wb = aoasht[2]; | ||||
| 		var o = aoa_to_sheet(aoa, opts); | ||||
| 		keys(ws).forEach(function(k) { o[k] = ws[k]; }); | ||||
| 		return o; | ||||
| 		var outwb = sheet_to_workbook(o, opts); | ||||
| 		keys(wb).forEach(function(k) { outwb[k] = wb[k]; }); | ||||
| 		return outwb; | ||||
| 	} | ||||
| 
 | ||||
| 	function sylk_to_workbook(d, opts) { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); } | ||||
| 
 | ||||
| 	function write_ws_cell_sylk(cell, ws, R, C) { | ||||
| 		var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K"; | ||||
| 		switch(cell.t) { | ||||
| @ -8026,7 +8034,7 @@ var SYLK = (function() { | ||||
| 	} | ||||
| 
 | ||||
| 	function sheet_to_sylk(ws, opts) { | ||||
| 		var preamble = ["ID;PWXL;N;E"], o = []; | ||||
| 		var preamble = ["ID;PSheetJS;N;E"], o = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var RS = "\r\n"; | ||||
| @ -8050,7 +8058,6 @@ var SYLK = (function() { | ||||
| 
 | ||||
| 	return { | ||||
| 		to_workbook: sylk_to_workbook, | ||||
| 		to_sheet: sylk_to_sheet, | ||||
| 		from_sheet: sheet_to_sylk | ||||
| 	}; | ||||
| })(); | ||||
| @ -9384,7 +9391,7 @@ var WK_ = (function() { | ||||
| 						type = p.read_shift(1); | ||||
| 						sname = cnt == 0 ? "" : p.read_shift(cnt, 'cstr'); | ||||
| 					} | ||||
| 					if(!sname) sname = XLSX.utils.encode_col(sidx); | ||||
| 					if(!sname) sname = encode_col(sidx); | ||||
| 					/* TODO: backfill empty sheets */ | ||||
| 				} break; | ||||
| 				case 0x0602: { /* EOS */ | ||||
|  | ||||
							
								
								
									
										49
									
								
								xlsx.mjs
									
									
									
										generated
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										49
									
								
								xlsx.mjs
									
									
									
										generated
									
									
									
								
							| @ -7946,6 +7946,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		var next_cell_format/*:string|null*/ = null; | ||||
| 		var sht = {}, rowinfo/*:Array<RowInfo>*/ = [], colinfo/*:Array<ColInfo>*/ = [], cw/*:Array<string>*/ = []; | ||||
| 		var Mval = 0, j; | ||||
| 		var wb = { Workbook: { WBProps: {} } }; | ||||
| 		if(+opts.codepage >= 0) set_cp(+opts.codepage); | ||||
| 		for (; ri !== records.length; ++ri) { | ||||
| 			Mval = 0; | ||||
| @ -7956,7 +7957,14 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			case 'ID': break; /* header */ | ||||
| 			case 'E': break; /* EOF */ | ||||
| 			case 'B': break; /* dimensions */ | ||||
| 			case 'O': break; /* options? */ | ||||
| 			case 'O': /* workbook options */ | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'V': { | ||||
| 					var d1904 = parseInt(record[rj].slice(1), 10); | ||||
| 					// NOTE: it is technically an error if d1904 >= 5 or < 0
 | ||||
| 					if(d1904 >= 1 && d1904 <= 4) wb.Workbook.WBProps.date1904 = true; | ||||
| 				} break; | ||||
| 			} break; | ||||
| 			case 'W': break; /* window? */ | ||||
| 			case 'P': | ||||
| 				if(record[1].charAt(0) == 'P') | ||||
| @ -7966,9 +7974,9 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			var C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'A': break; // TODO: comment
 | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; C_seen_X = true; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1), 10)-1; C_seen_X = true; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].slice(1))-1; if(!C_seen_X) C = 0; | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; if(!C_seen_X) C = 0; | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'K': | ||||
| @ -7978,7 +7986,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 					else if(val === 'FALSE') val = false; | ||||
| 					else if(!isNaN(fuzzynum(val))) { | ||||
| 						val = fuzzynum(val); | ||||
| 						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(val); | ||||
| 						if(next_cell_format !== null && fmt_is_date(next_cell_format)) val = numdate(wb.Workbook.WBProps.date1904 ? val + 1462 : val); | ||||
| 					} else if(!isNaN(fuzzydate(val).getDate())) { | ||||
| 						val = parseDate(val); | ||||
| 					} | ||||
| @ -7995,8 +8003,8 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 					arr[R][C] = [arr[R][C], "S5S"]; | ||||
| 					break; | ||||
| 				case 'G': break; // unknown
 | ||||
| 				case 'R': _R = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'C': _C = parseInt(record[rj].slice(1))-1; break; | ||||
| 				case 'R': _R = parseInt(record[rj].slice(1), 10)-1; break; | ||||
| 				case 'C': _C = parseInt(record[rj].slice(1), 10)-1; break; | ||||
| 				default: if(opts && opts.WTF) throw new Error("SYLK bad record " + rstr); | ||||
| 			} | ||||
| 			if(C_seen_K) { | ||||
| @ -8014,16 +8022,16 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 			case 'F': | ||||
| 			var F_seen = 0; | ||||
| 			for(rj=1; rj<record.length; ++rj) switch(record[rj].charAt(0)) { | ||||
| 				case 'X': C = parseInt(record[rj].slice(1))-1; ++F_seen; break; | ||||
| 				case 'X': C = parseInt(record[rj].slice(1), 10)-1; ++F_seen; break; | ||||
| 				case 'Y': | ||||
| 					R = parseInt(record[rj].slice(1))-1; /*C = 0;*/ | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; /*C = 0;*/ | ||||
| 					for(j = arr.length; j <= R; ++j) arr[j] = []; | ||||
| 					break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1)) / 20; break; | ||||
| 				case 'M': Mval = parseInt(record[rj].slice(1), 10) / 20; break; | ||||
| 				case 'F': break; /* ??? */ | ||||
| 				case 'G': break; /* hide grid */ | ||||
| 				case 'P': | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1))]; | ||||
| 					next_cell_format = formats[parseInt(record[rj].slice(1), 10)]; | ||||
| 					break; | ||||
| 				case 'S': break; /* cell style */ | ||||
| 				case 'D': break; /* column */ | ||||
| @ -8035,11 +8043,11 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 						colinfo[j-1] = Mval === 0 ? {hidden:true}: {wch:Mval}; process_col(colinfo[j-1]); | ||||
| 					} break; | ||||
| 				case 'C': /* default column format */ | ||||
| 					C = parseInt(record[rj].slice(1))-1; | ||||
| 					C = parseInt(record[rj].slice(1), 10)-1; | ||||
| 					if(!colinfo[C]) colinfo[C] = {}; | ||||
| 					break; | ||||
| 				case 'R': /* row properties */ | ||||
| 					R = parseInt(record[rj].slice(1))-1; | ||||
| 					R = parseInt(record[rj].slice(1), 10)-1; | ||||
| 					if(!rowinfo[R]) rowinfo[R] = {}; | ||||
| 					if(Mval > 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); } | ||||
| 					else if(Mval === 0) rowinfo[R].hidden = true; | ||||
| @ -8053,19 +8061,19 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 		if(rowinfo.length > 0) sht['!rows'] = rowinfo; | ||||
| 		if(colinfo.length > 0) sht['!cols'] = colinfo; | ||||
| 		if(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows); | ||||
| 		return [arr, sht]; | ||||
| 		return [arr, sht, wb]; | ||||
| 	} | ||||
| 
 | ||||
| 	function sylk_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ { | ||||
| 	function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { | ||||
| 		var aoasht = sylk_to_aoa(d, opts); | ||||
| 		var aoa = aoasht[0], ws = aoasht[1]; | ||||
| 		var aoa = aoasht[0], ws = aoasht[1], wb = aoasht[2]; | ||||
| 		var o = aoa_to_sheet(aoa, opts); | ||||
| 		keys(ws).forEach(function(k) { o[k] = ws[k]; }); | ||||
| 		return o; | ||||
| 		var outwb = sheet_to_workbook(o, opts); | ||||
| 		keys(wb).forEach(function(k) { outwb[k] = wb[k]; }); | ||||
| 		return outwb; | ||||
| 	} | ||||
| 
 | ||||
| 	function sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); } | ||||
| 
 | ||||
| 	function write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*//*::, opts*/)/*:string*/ { | ||||
| 		var o = "C;Y" + (R+1) + ";X" + (C+1) + ";K"; | ||||
| 		switch(cell.t) { | ||||
| @ -8104,7 +8112,7 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 	} | ||||
| 
 | ||||
| 	function sheet_to_sylk(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ { | ||||
| 		var preamble/*:Array<string>*/ = ["ID;PWXL;N;E"], o/*:Array<string>*/ = []; | ||||
| 		var preamble/*:Array<string>*/ = ["ID;PSheetJS;N;E"], o/*:Array<string>*/ = []; | ||||
| 		var r = safe_decode_range(ws['!ref']), cell/*:Cell*/; | ||||
| 		var dense = Array.isArray(ws); | ||||
| 		var RS = "\r\n"; | ||||
| @ -8128,7 +8136,6 @@ var SYLK = /*#__PURE__*/(function() { | ||||
| 
 | ||||
| 	return { | ||||
| 		to_workbook: sylk_to_workbook, | ||||
| 		to_sheet: sylk_to_sheet, | ||||
| 		from_sheet: sheet_to_sylk | ||||
| 	}; | ||||
| })(); | ||||
| @ -9462,7 +9469,7 @@ var WK_ = /*#__PURE__*/(function() { | ||||
| 						type = p.read_shift(1); | ||||
| 						sname = cnt == 0 ? "" : p.read_shift(cnt, 'cstr'); | ||||
| 					} | ||||
| 					if(!sname) sname = XLSX.utils.encode_col(sidx); | ||||
| 					if(!sname) sname = encode_col(sidx); | ||||
| 					/* TODO: backfill empty sheets */ | ||||
| 				} break; | ||||
| 				case 0x0602: { /* EOS */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user