forked from sheetjs/sheetjs
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* 18.2.28 (CT_WorkbookProtection) Defaults */
 | 
						|
var WBPropsDef = [
 | 
						|
	['allowRefreshQuery',           false, "bool"],
 | 
						|
	['autoCompressPictures',        true,  "bool"],
 | 
						|
	['backupFile',                  false, "bool"],
 | 
						|
	['checkCompatibility',          false, "bool"],
 | 
						|
	['CodeName',                    ''],
 | 
						|
	['date1904',                    false, "bool"],
 | 
						|
	['defaultThemeVersion',         0,      "int"],
 | 
						|
	['filterPrivacy',               false, "bool"],
 | 
						|
	['hidePivotFieldList',          false, "bool"],
 | 
						|
	['promptedSolutions',           false, "bool"],
 | 
						|
	['publishItems',                false, "bool"],
 | 
						|
	['refreshAllConnections',       false, "bool"],
 | 
						|
	['saveExternalLinkValues',      true,  "bool"],
 | 
						|
	['showBorderUnselectedTables',  true,  "bool"],
 | 
						|
	['showInkAnnotation',           true,  "bool"],
 | 
						|
	['showObjects',                 'all'],
 | 
						|
	['showPivotChartFilter',        false, "bool"],
 | 
						|
	['updateLinks', 'userSet']
 | 
						|
];
 | 
						|
 | 
						|
/* 18.2.30 (CT_BookView) Defaults */
 | 
						|
var WBViewDef = [
 | 
						|
	['activeTab',                   0,      "int"],
 | 
						|
	['autoFilterDateGrouping',      true,  "bool"],
 | 
						|
	['firstSheet',                  0,      "int"],
 | 
						|
	['minimized',                   false, "bool"],
 | 
						|
	['showHorizontalScroll',        true,  "bool"],
 | 
						|
	['showSheetTabs',               true,  "bool"],
 | 
						|
	['showVerticalScroll',          true,  "bool"],
 | 
						|
	['tabRatio',                    600,    "int"],
 | 
						|
	['visibility',                  'visible']
 | 
						|
	//window{Height,Width}, {x,y}Window
 | 
						|
];
 | 
						|
 | 
						|
/* 18.2.19 (CT_Sheet) Defaults */
 | 
						|
var SheetDef = [
 | 
						|
	//['state', 'visible']
 | 
						|
];
 | 
						|
 | 
						|
/* 18.2.2  (CT_CalcPr) Defaults */
 | 
						|
var CalcPrDef = [
 | 
						|
	['calcCompleted', 'true'],
 | 
						|
	['calcMode', 'auto'],
 | 
						|
	['calcOnSave', 'true'],
 | 
						|
	['concurrentCalc', 'true'],
 | 
						|
	['fullCalcOnLoad', 'false'],
 | 
						|
	['fullPrecision', 'true'],
 | 
						|
	['iterate', 'false'],
 | 
						|
	['iterateCount', '100'],
 | 
						|
	['iterateDelta', '0.001'],
 | 
						|
	['refMode', 'A1']
 | 
						|
];
 | 
						|
 | 
						|
/* 18.2.3 (CT_CustomWorkbookView) Defaults */
 | 
						|
/*var CustomWBViewDef = [
 | 
						|
	['autoUpdate', 'false'],
 | 
						|
	['changesSavedWin', 'false'],
 | 
						|
	['includeHiddenRowCol', 'true'],
 | 
						|
	['includePrintSettings', 'true'],
 | 
						|
	['maximized', 'false'],
 | 
						|
	['minimized', 'false'],
 | 
						|
	['onlySync', 'false'],
 | 
						|
	['personalView', 'false'],
 | 
						|
	['showComments', 'commIndicator'],
 | 
						|
	['showFormulaBar', 'true'],
 | 
						|
	['showHorizontalScroll', 'true'],
 | 
						|
	['showObjects', 'all'],
 | 
						|
	['showSheetTabs', 'true'],
 | 
						|
	['showStatusbar', 'true'],
 | 
						|
	['showVerticalScroll', 'true'],
 | 
						|
	['tabRatio', '600'],
 | 
						|
	['xWindow', '0'],
 | 
						|
	['yWindow', '0']
 | 
						|
];*/
 | 
						|
 | 
						|
function push_defaults_array(target, defaults) {
 | 
						|
	for(var j = 0; j != target.length; ++j) { var w = target[j];
 | 
						|
		for(var i=0; i != defaults.length; ++i) { var z = defaults[i];
 | 
						|
			if(w[z[0]] == null) w[z[0]] = z[1];
 | 
						|
			else switch(z[2]) {
 | 
						|
			case "bool": if(typeof w[z[0]] == "string") w[z[0]] = parsexmlbool(w[z[0]]); break;
 | 
						|
			case "int": if(typeof w[z[0]] == "string") w[z[0]] = parseInt(w[z[0]], 10); break;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
function push_defaults(target, defaults) {
 | 
						|
	for(var i = 0; i != defaults.length; ++i) { var z = defaults[i];
 | 
						|
		if(target[z[0]] == null) target[z[0]] = z[1];
 | 
						|
		else switch(z[2]) {
 | 
						|
			case "bool": if(typeof target[z[0]] == "string") target[z[0]] = parsexmlbool(target[z[0]]); break;
 | 
						|
			case "int": if(typeof target[z[0]] == "string") target[z[0]] = parseInt(target[z[0]], 10); break;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
function parse_wb_defaults(wb) {
 | 
						|
	push_defaults(wb.WBProps, WBPropsDef);
 | 
						|
	push_defaults(wb.CalcPr, CalcPrDef);
 | 
						|
 | 
						|
	push_defaults_array(wb.WBView, WBViewDef);
 | 
						|
	push_defaults_array(wb.Sheets, SheetDef);
 | 
						|
 | 
						|
	_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);
 | 
						|
}
 | 
						|
 | 
						|
function safe1904(wb/*:Workbook*/)/*:string*/ {
 | 
						|
	/* TODO: store date1904 somewhere else */
 | 
						|
	if(!wb.Workbook) return "false";
 | 
						|
	if(!wb.Workbook.WBProps) return "false";
 | 
						|
	return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false";
 | 
						|
}
 | 
						|
 | 
						|
var badchars = /*#__PURE__*/":][*?\/\\".split("");
 | 
						|
function check_ws_name(n/*:string*/, safe/*:?boolean*/)/*:boolean*/ {
 | 
						|
	try {
 | 
						|
		if(n == "") throw new Error("Sheet name cannot be blank");
 | 
						|
		if(n.length > 31) throw new Error("Sheet name cannot exceed 31 chars");
 | 
						|
		if(n.charCodeAt(0) == 0x27 || n.charCodeAt(n.length - 1) == 0x27) throw new Error("Sheet name cannot start or end with apostrophe (')");
 | 
						|
		if(n.toLowerCase() == "history") throw new Error("Sheet name cannot be 'History'");
 | 
						|
		badchars.forEach(function(c) {
 | 
						|
			if(n.indexOf(c) == -1) return;
 | 
						|
			throw new Error("Sheet name cannot contain : \\ / ? * [ ]");
 | 
						|
		});
 | 
						|
	} catch(e) { if(safe) return false; throw e; }
 | 
						|
	return true;
 | 
						|
}
 | 
						|
function check_wb_names(N, S, codes) {
 | 
						|
	N.forEach(function(n,i) {
 | 
						|
		check_ws_name(n);
 | 
						|
		for(var j = 0; j < i; ++j) if(n == N[j]) throw new Error("Duplicate Sheet Name: " + n);
 | 
						|
		if(codes) {
 | 
						|
			var cn = (S && S[i] && S[i].CodeName) || n;
 | 
						|
			if(cn.charCodeAt(0) == 95 && cn.length > 22) throw new Error("Bad Code Name: Worksheet" + cn);
 | 
						|
		}
 | 
						|
	});
 | 
						|
}
 | 
						|
function check_wb(wb) {
 | 
						|
	if(!wb || !wb.SheetNames || !wb.Sheets) throw new Error("Invalid Workbook");
 | 
						|
	if(!wb.SheetNames.length) throw new Error("Workbook is empty");
 | 
						|
	var Sheets = (wb.Workbook && wb.Workbook.Sheets) || [];
 | 
						|
	check_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw);
 | 
						|
	for(var i = 0; i < wb.SheetNames.length; ++i) check_ws(wb.Sheets[wb.SheetNames[i]], wb.SheetNames[i], i);
 | 
						|
	wb.SheetNames.forEach(function(n, i) {
 | 
						|
		var ws = wb.Sheets[n];
 | 
						|
		if(!ws || !ws["!autofilter"]) return;
 | 
						|
		var DN;
 | 
						|
		if(!wb.Workbook) wb.Workbook = {};
 | 
						|
		if(!wb.Workbook.Names) wb.Workbook.Names = [];
 | 
						|
		wb.Workbook.Names.forEach(function(dn) { if(dn.Name == "_xlnm._FilterDatabase" && dn.Sheet == i) DN = dn; });
 | 
						|
		var nn = formula_quote_sheet_name(n) + "!" + fix_range(ws["!autofilter"].ref);
 | 
						|
		if(DN) DN.Ref = nn;
 | 
						|
		else wb.Workbook.Names.push({Name: "_xlnm._FilterDatabase", Sheet: i, Ref: nn});
 | 
						|
	});
 | 
						|
	/* TODO: validate workbook */
 | 
						|
}
 |