UNPKG

nscomponentsreact

Version:

React Wrapper Components for NSComponents

1,826 lines (1,677 loc) 92.1 kB
var nsModuleExport = function(root,name,prototype) { if(typeof exports === 'object' && typeof module === 'object') { module.exports[name] = prototype; } else if (typeof define === "function" && define.amd) { define(name,[], function () {return prototype;}); } else if(typeof exports === 'object') { exports[name] = prototype; } else { root[name] = prototype; } };var nsIsWeb = function(root) { if(typeof exports === 'object' && typeof module === 'object') { return false; } else if (typeof define === "function" && define.amd) { return false; } else if(typeof exports === 'object') { return false; } else { return true; } };if(!nsIsWeb()) { var nsutilRef = require('./nsUtil.min.js'); var NSUtil = nsutilRef.NSUtil; } var NSZip = (function() { var NSZip = function(config) { var self = this; var setting = {}; var objFiles = {}; var util = null; var initialize = function() { if(!config) { config = {}; } /*setting = { fileName: config["fileName"] || "download", mimeType: config["mimeType"] || "application/zip" }; if (setting.fileName.indexOf(".") === -1) { setting.fileName = setting.fileName + ".zip"; }*/ util = new ZipUtil(); }; var getFile = function(type,mimeType) { var objRet = null; type = type ? type : "blob"; switch(type) { case "blob": objRet = getBlob(mimeType); break; } return objRet; }; var addFolders = function(arrPath) { var arrReturn = null; if(arrPath && arrPath.length > 0) { arrReturn = []; for(var index = 0;index < arrPath.length;index++) { arrReturn.push(addFolder(arrPath[index])); } } return arrReturn; }; var addFolder = function(path) { return createFolder(path); }; var addFile = function(path,content,prop) { return createFile(path,content,prop,false); }; var createFolder = function(path) { path = util.addSlashAtEnd(path); if(objFiles[path]) { return objFiles[path].zipFile; } return createFile(path,null,null,true); }; var createFile = function(path,content,prop,isDir) { prop = prop ? prop : {}; var item = {path: path,content: content,origContent: content}; item.created = new Date(); item.dataType = util.getDataType(content); item.isDir = isDir ? true : false; var parent = util.getParentFolder(path); if(parent) { createFolder(parent); } item.isBase64 = (item.type == "base64"); item.isBinary = (item.type == "binary"); var isUnicodeString = (item.dataType === "string") && item.isBase64 && item.isBinary; if (item.type != "binary") { item.isBinary = !isUnicodeString; } if(item.isDir || !path || !path.length) { item.dataType = "string"; item.isBase64 = false; item.isBinary = true; item.content = ""; } item.content = getContent(item); var zipFile = new ZipFile(util,item,self); objFiles[path] = {item: item,zipFile: zipFile}; return zipFile; }; var getContent = function(item) { var refine = function(data) { var dataType = item.dataType; if(dataType) { if(dataType === "string") { if(item.isBase64) { data = util.base64Decode(data); } else if(item.isBinary) { /*var arrData = new Uint8Array(data.length); data = util.fillArrayWithString(data,arrData);*/ } } else if (dataType === "arraybuffer") { data = new Uint8Array(item); } } else { console.warn("DataType cannot be detected for file " + item.path); } return data; }; var content = item.content; var isBlob = (content instanceof Blob || ['[object File]', '[object Blob]'].indexOf(Object.prototype.toString.call(content)) !== -1); if(isBlob && typeof FileReader !== "undefined") { return new Promise(function (resolve, reject) { var reader = new FileReader(); reader.onload = function(event) { item.content = refine(event.target.result); resolve(event.target.result); }; reader.onerror = function(event) { console.error(event.target.error); reject(event.target.error); }; reader.readAsArrayBuffer(content); }); } return refine(content); }; var clear = function() { objFiles = {}; }; var getBlob = function(mimeType) { mimeType = mimeType ? mimeType : "application/zip"; var textOutput = buildFileStream(); var uInt8Output = util.buildUint8Array(textOutput); clear(); return new Blob([uInt8Output], { type: setting.mimeType }); }; var buildFileStream = function(initContent) { initContent = initContent ? initContent : ""; var len = Object.keys(objFiles).length; var middleContent = ""; var lL = 0; var cL = 0; for(var path in objFiles) { var file = objFiles[path].item; var objHeader = getHeader(file, lL); var fileHeader = objHeader.fileHeader; var folderHeader = objHeader.folderHeader; var content = objHeader.content; lL += fileHeader.length + content.length; cL += folderHeader.length; initContent += fileHeader + content; middleContent += folderHeader; } var endContent = buildFolderEnd(len, cL, lL); return initContent + middleContent + endContent; }; var getHeader = function(file,offset) { var content = util.utf8_encode(file.content); var path = file.path; var created = file.created; var utfPath = util.utf8_encode(path); var isUTF8 = (utfPath !== path); var time = util.convertTime(created); var dt = util.convertDate(created); var extraFields = ""; if (isUTF8) { var uExtraFieldPath = util.decToHex(1, 1) + util.decToHex(util.getFromCrc32Table(utfPath), 4) + utfPath; extraFields = "\x75\x70" + util.decToHex(uExtraFieldPath.length, 2) + uExtraFieldPath; } var header = '\x0A\x00' + (isUTF8 ? '\x00\x08' : '\x00\x00') + // general purpose bit flag '\x00\x00' + util.decToHex(time, 2) + // last modified time util.decToHex(dt, 2) + // last modified date util.decToHex(content ? util.getFromCrc32Table(content) : 0, 4) + util.decToHex(content ? content.length : 0, 4) + // compressed size util.decToHex(content ? content.length : 0, 4) + // uncompressed size util.decToHex(utfPath.length, 2) + // file name length util.decToHex(extraFields.length, 2); // extra field length var fileHeader = 'PK\x03\x04' + header + utfPath + extraFields; var folderHeader = 'PK\x01\x02' + // central header '\x14\x00' + header + // file header '\x00\x00' + '\x00\x00' + '\x00\x00' + (content ? '\x00\x00\x00\x00' : '\x10\x00\x00\x00') + // external file attributes util.decToHex(offset, 4) + // relative offset of local header utfPath + // file name extraFields; // extra field return { fileHeader: fileHeader, folderHeader: folderHeader, content: content || '' }; }; var buildFolderEnd = function(totalEntries,size,startOffset) { var retValue = "PK\x05\x06" + "\x00\x00" + "\x00\x00"; retValue += util.decToHex(totalEntries, 2); retValue += util.decToHex(totalEntries, 2); retValue += util.decToHex(size, 4); retValue += util.decToHex(startOffset, 4); retValue += "\x00\x00"; return retValue; }; var downloadFile = function(fileName,mimeType,type,content) { fileName = fileName ? fileName : "download"; if (fileName.indexOf(".") === -1) { fileName = fileName + ".zip"; } content = content ? content : getFile(type,mimeType); util.downloadFile(fileName,content); }; var ZipFile = function(util,item,objRoot) { var self = this; var addFolder = function(path) { return objRoot.addFolder(getPath(path)); }; var addFile = function(path,content) { return objRoot.addFile(getPath(path),content); }; var getPath = function(path) { return item.path + path; }; if(item.isDir) { self.addFolder = addFolder; self.addFile = addFile; } }; var ZipUtil = function() { var self = this; var crcTable = []; var base64Key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var initialize = function() { crcTable = makeCRCTable(); }; //https://stackoverflow.com/questions/18638900/javascript-crc32 var makeCRCTable = function() { var c; var crcTable = []; for(var n =0; n < 256; n++) { c = n; for(var k =0; k < 8; k++) { c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); } crcTable[n] = c; } return crcTable; }; var getFromCrc32Table = function(content, crc) { if(typeof content === "undefined" || !content.length) { return 0; } if(!crc) { crc = 0; } crc ^= (-1); var dataType = util.getDataType(content); if(dataType === "string") { var ch = 0; var k = 0; var l = 0; var len = content.length; for (var count = 0;count < len;count++) { ch = content.charCodeAt(count); k = (crc ^ ch) & 0xFF; l = crcTable[k]; crc = (crc >>> 8) ^ l; } } else { var ch = 0; var k = 0; var l = 0; var len = content.length; for (var count = 0;count < len;count++) { ch = content[count]; k = (crc ^ ch) & 0xFF; l = crcTable[k]; crc = (crc >>> 8) ^ l; } } return crc ^ (-1); }; var buildUint8Array = function(content) { var retValue = new Uint8Array(content.length); for (var count = 0; count < content.length; count++) { retValue[count] = content.charCodeAt(count); } return retValue; }; //http://www.navioo.com/javascript/tutorials/Javascript_utf8_encode_1529.html // Encodes an ISO-8859-1 string to UTF-8 var utf8_encode = function(str) { var retValue = ""; var str = str.replace(/\r\n/g, "\n"); var len = str.length; var start = 0; var end = 0; var enc = null; var ch = null; for(var count = 0;count < len;count++) { ch = str.charCodeAt(count); enc = null; if(ch < 128) { end++; } else if(ch > 127 && ch < 2048) { enc = String.fromCharCode(ch >> 6 | 192); enc += String.fromCharCode((ch & 63) | 128); } else { enc = String.fromCharCode((ch >> 12) | 224); enc += String.fromCharCode(((ch >> 6) & 63) | 128); enc += String.fromCharCode((ch & 63) | 128); } if (enc != null) { if (end > start) { retValue += str.substring(start, end); } retValue += enc; start = end = count + 1; } } if (end > start) { retValue += str.substring(start,str.length); } return retValue; }; //http://www.navioo.com/javascript/tutorials/Javascript_utf8_decode_1528.html // Converts a UTF-8 encoded string to ISO-8859-1 var utf8_decode = function(str) { var arrReturn = []; var count = 0; var retCount = 0; var char1 = 0; var char2 = 0; var char3 = 0; str += ""; while (count < str.length) { char1 = str.charCodeAt(count); if (char1 < 128) { arrReturn[retCount++] = String.fromCharCode(char1); count++; } else if ((char1 > 191) && (char1 < 224)) { char2 = str.charCodeAt(count+1); arrReturn[retCount++] = String.fromCharCode(((char1 & 31) << 6) | (char2 & 63)); count += 2; } else { char2 = str.charCodeAt(count+1); char3 = str.charCodeAt(count+2); arrReturn[retCount++] = String.fromCharCode(((char1 & 15) << 12) | ((char2 & 63) << 6) | (char3 & 63)); count += 3; } } return arrReturn.join(''); }; var decToHex = function(number, bytes) { var retValue = ""; for(var count = 0;count < bytes;count++) { retValue += String.fromCharCode(number & 0xFF); number = number >>> 8; } return retValue; }; var fillArrayWithString = function(str,arrData) { for (var count = 0;count < str.length;count++) { arrData[count] = str.charCodeAt(count) & 0xFF; } return arrData; }; var convertTime = function(date) { var hour = date.getUTCHours(); hour = hour << 6; hour = hour | date.getUTCMinutes(); hour = hour << 5; hour = hour | date.getUTCSeconds() / 2; return hour; }; var convertDate = function(date) { var retDate = date.getUTCFullYear() - 1980; retDate = retDate << 4; retDate = retDate | (date.getUTCMonth() + 1); retDate = retDate << 5; retDate = retDate | date.getUTCDate(); return retDate; }; var addSlashAtEnd = function(path) { if (path.slice(-1) !== "/") { path += "/"; } return path; }; var getParentFolder = function(path) { if (path.slice(-1) === '/') { path = path.substring(0, path.length - 1); } var lastSlash = path.lastIndexOf('/'); return (lastSlash > 0) ? path.substring(0, lastSlash) : ""; }; var getDataType = function(data) { if (typeof data === "string") { return "string"; } if (Object.prototype.toString.call(data) === "[object Array]") { return "array"; } if (typeof Buffer !== "undefined" && data instanceof Buffer) { return "nodebuffer"; } if (data instanceof Uint8Array) { return "uint8array"; } if (data instanceof ArrayBuffer) { return "arraybuffer"; } }; var base64Decode = function(data) { var chr1, chr2, chr3; var enc1, enc2, enc3, enc4; var i = 0, resultIndex = 0; if(data.indexOf('base64,') > -1) { var index = data.indexOf('base64,') + 'base64,'.length; data = data.substring(index); } data = data.replace(/[^A-Za-z0-9\+\/\=]/g, ""); var totalLength = data.length * 3 / 4; if(data.charAt(data.length - 1) === base64Key.charAt(64)) { totalLength--; } if(data.charAt(data.length - 2) === base64Key.charAt(64)) { totalLength--; } //totalLength is base64 expected length if (totalLength % 1 !== 0) { throw new Error("Invalid base64 data"); } var retValue = new Uint8Array(totalLength|0); while (i < data.length) { enc1 = base64Key.indexOf(data.charAt(i++)); enc2 = base64Key.indexOf(data.charAt(i++)); enc3 = base64Key.indexOf(data.charAt(i++)); enc4 = base64Key.indexOf(data.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; retValue[resultIndex++] = chr1; if (enc3 !== 64) { retValue[resultIndex++] = chr2; } if (enc4 !== 64) { retValue[resultIndex++] = chr3; } } return retValue; }; var downloadFile = function(fileName,content) { if ("msSaveOrOpenBlob" in window.navigator) { window.navigator.msSaveOrOpenBlob(content, fileName); } else { var element = document.createElement("a"); var url = window.URL.createObjectURL(content); element.setAttribute("href", url); element.setAttribute("download", fileName); element.style.display = "none"; document.body.appendChild(element); element.click(); window.URL.revokeObjectURL(url); document.body.removeChild(element); } }; initialize(); self.getFromCrc32Table = getFromCrc32Table; self.buildUint8Array = buildUint8Array; self.utf8_encode = utf8_encode; self.utf8_decode = utf8_decode; self.decToHex = decToHex; self.fillArrayWithString = fillArrayWithString; self.convertTime = convertTime; self.convertDate = convertDate; self.addSlashAtEnd = addSlashAtEnd; self.getParentFolder = getParentFolder; self.getDataType = getDataType; self.base64Decode = base64Decode; self.downloadFile = downloadFile; }; initialize(); self.addFolder = addFolder; self.addFolders = addFolders; self.addFile = addFile; self.getBlob = getBlob; self.getFile = getFile; self.downloadFile = downloadFile; }; return NSZip; })(); nsModuleExport(this,"NSZip",NSZip);var NSXlsxExport = (function() { var NSXlsxExport = function(config) { var self = this; var xlsxUtil = null; var workbook = null; var styles = null; var setting = {}; var sharedString = null; var initialize = function() { if(!config) { config = {}; } xlsxUtil = new XlsxUtil(); setting = { fileName: config["fileName"] || "download", sheets: config["sheets"], maxCharWidth: config["maxCharWidth"] }; if(!setting.sheets || setting.sheets.length == 0) { xlsxUtil.throwNSError("sheets is not defined in config"); } if(setting.fileName.indexOf(".") === -1) { setting.fileName = setting.fileName + ".xlsx"; } styles = new XlsxStyle(xlsxUtil); sharedString = new XlsxSharedStrings(xlsxUtil); workbook = new XlsxWorkbook(xlsxUtil,styles,sharedString,setting.sheets,setting); }; var process = function() { var mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; var zip = new NSZip(); var xl = zip.addFolder("xl"); save(zip,xl); zip.downloadFile(setting.fileName,mimeType); }; var save = function(zip,xl) { var strWorkbook = workbook.process(); saveSheets(zip,xl); saveStyles(zip,xl); saveSharedStrings(zip,xl); zip.addFile('[Content_Types].xml', getContentTypesXml()); zip.addFile('_rels/.rels', getRels()); xl.addFile('workbook.xml', strWorkbook); xl.addFile('_rels/workbook.xml.rels', getWorkbookXMLRels()); }; var saveSheets = function(zip,xl) { for(var count = 0;count < setting.sheets.length;count++) { var sheet = workbook.getSheet(count); xl.addFile(sheet.getPath(),sheet.getSheetData()); xlsxUtil.addSheetProp("relationship",sheet.getRelationship()); xlsxUtil.addSheetProp("override",sheet.getOverride()); } }; var getWorkbookXMLRels = function() { var relationShip = {style:{type:xlsxUtil.schemas.stylesheet,target:'styles.xml'}, sharedStrings:{type:xlsxUtil.schemas.sharedStrings,target:'sharedStrings.xml'} }; var arrChild = []; var index = setting.sheets.length; for(var key in relationShip) { var item = relationShip[key]; arrChild.push(xlsxUtil.getXML({ name: 'Relationship', attributes: {'Id':'rId' + (++index),'Type': item.type,'Target': item.target} })); } arrChild.push(xlsxUtil.getSheetProp("relationship")); return xlsxUtil.getXML({ name: 'Relationships', ns: 'relationshipPackage', children: arrChild }); }; var saveStyles = function(zip,xl) { xl.addFile('styles.xml', styles.getTag()); }; var saveSharedStrings = function(zip,xl) { if (sharedString.hasString() > 0) { xl.addFile('sharedStrings.xml', sharedString.getTag()); } }; var getRels = function() { var rels = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n ' + '<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">\n ' + '<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>\n ' + '</Relationships>'; return rels; }; var getContentTypesXml = function() { var override = {workbook:{partName:'/xl/workbook.xml',contentType:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'}, styles:{partName:'/xl/styles.xml',contentType:'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'} }; if (sharedString.hasString() > 0) { override["sharedStrings"] = {partName:'/xl/sharedStrings.xml',contentType:'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'} } var arrChild = []; arrChild.push('<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>'); arrChild.push('<Default Extension="xml" ContentType="application/xml"/>'); for(var key in override) { var item = override[key]; arrChild.push(xlsxUtil.getXML({ name: 'Override', attributes: {'PartName': item.partName,'ContentType': item.contentType} })); } arrChild.push(xlsxUtil.getSheetProp("override")); return xlsxUtil.getXML({ name: 'Types', ns: 'contentTypes', children: arrChild }); }; var XlsxStyle = function(util) { var self = this; var objTypes = {numberFormats:{def: StyleNumberFormat}, fonts:{def: StyleFonts}, fills:{def: StyleFills}, borders:{def: StyleBorder}, cells:{def: StyleCells}}; var defaultTableStyle = ''; var mergeCache = {}; var initialize = function() { for(var key in objTypes) { objTypes[key]["ins"] = new objTypes[key]["def"](util,self); } }; var addFormat = function(style,name) { return objTypes["cells"]["ins"].add(style,name); }; var getStyle = function(name) { return objTypes["cells"]["ins"].getStyle(name); }; var getStyleID = function(name) { return objTypes["cells"]["ins"].getStyleID(name); }; var addFillOutFormat = function(objStyle) { if (getStyle(objStyle).fillOut) { return objStyle; } var style = objTypes["cells"]["ins"].cutVisible(objTypes["cells"]["ins"].fullGet(objStyle)); if(!util.isObjectEmpty(style)) { return addFormat(style); } return null; }; var merge = function(format) { var formats = []; for(var count = 0;count < arguments.length;count++) { if(arguments[count]) { formats.push(arguments[count]); } } if (formats.length === 0) { return null; } else if (formats.length === 1) { return addFormat(formats[0]); } else { //https://www.w3schools.com/jsref/jsref_reduce.asp var id = formats.reduce(function (total, currentValue,currentIndex, arr) { return total + JSON.stringify(currentValue); }, ''); var merged = mergeCache[id]; if (!merged) { var cells = objTypes["cells"]["ins"]; var newFormat = {}; for(var index = 0;index < formats.length;index++) { var format = formats[index]; newFormat = cells.merge(newFormat,cells.fullGet(format)); } merged = cells.add(newFormat,null,{ merge: true}); mergeCache[id] = merged; } return merged; } return null; }; var addFontFormat = function(format, name) { return objTypes["fonts"]["ins"].add(format, name); }; var addBorderFormat = function(format, name) { return objTypes["borders"]["ins"].add(format, name); }; var addPatternFormat = function(format, name) { return objTypes["fills"]["ins"].add(format, name, {fillType:'pattern'}); }; var addGradientFormat = function(format, name) { return objTypes["fills"]["ins"].add(format, name, {fillType:'gradient'}); }; var addNumberFormat = function(format, name) { return objTypes["numberFormats"]["ins"].add(format, name); }; var addTableFormat = function(format, name) { //return objTypes["numberFormats"]["ins"].add(format, name); }; var addTableElementFormat = function(format, name) { //return objTypes["numberFormats"]["ins"].add(format, name); }; var setDefaultTableStyle = function(format, name) { //return objTypes["numberFormats"]["ins"].add(format, name); }; var getTag = function(objStyle) { var arrChildren = []; for(var key in objTypes) { //console.log(key + " :: " + objTypes[key]["ins"].getFinalTag()); arrChildren.push(objTypes[key]["ins"].getFinalTag()); } return util.getXML({ name: 'styleSheet', ns: 'spreadsheetml', children: arrChildren }); }; initialize(); self.addFormat = addFormat; self.getStyle = getStyle; self.getStyleID = getStyleID; self.addFillOutFormat = addFillOutFormat; self.merge = merge; self.addFontFormat = addFontFormat; self.addBorderFormat = addBorderFormat; self.addPatternFormat = addPatternFormat; self.addGradientFormat = addGradientFormat; self.addNumberFormat = addNumberFormat; self.addTableFormat = addTableFormat; self.addTableElementFormat = addTableElementFormat; self.setDefaultTableStyle = setDefaultTableStyle; self.getTag = getTag; self.objTypes = objTypes; }; var StyleCells = function(util,xlsxStyle) { var self = this; var style = new XlsxBaseStyle(util,xlsxStyle); style.formatName = "format"; style.saveName = "cellXfs"; var alignment = new XlsxAlignment(util); var protection = new XlsxProtection(util); var ALLOWED_PARTS = ['format', 'fill', 'border', 'font']; var XLS_NAMES = ['numFmtId', 'fillId', 'borderId', 'fontId']; var initialize = function() { style.formats.push({format: style.getStyleObj({})}); for(var key in util.numberPredifined) { style.predefined[key] = {format: key}; } style.idIndex = style.formats.length; style.saveEmpty = false; }; style.getStyleObj = function(objStyle,prop) { var retValue = {}; if (objStyle.format) { retValue.format = xlsxStyle.objTypes["numberFormats"]["ins"].add(objStyle.format); } if (objStyle.font) { retValue.font = xlsxStyle.objTypes["fonts"]["ins"].add(objStyle.font); } if (objStyle.pattern) { retValue.fill = xlsxStyle.objTypes["fills"]["ins"].add(objStyle.pattern, null, { fillType: 'pattern' }); } else if (objStyle.gradient) { retValue.fill = xlsxStyle.objTypes["fills"]["ins"].add(objStyle.gradient, null, { fillType: 'gradient' }); } else if (prop && prop.merge && objStyle.fill) { retValue.fill = xlsxStyle.objTypes["fills"]["ins"].add(objStyle.fill, null, prop); } if (objStyle.border) { retValue.border = xlsxStyle.objTypes["borders"]["ins"].add(objStyle.border); } var alignmentValue = prop && prop.merge ? alignment.getStyleObj(objStyle.alignment) : alignment.getStyleObj(objStyle); if (alignmentValue) { retValue.alignment = alignmentValue; } var protectionValue = prop && prop.merge ? protection.getStyleObj(objStyle.protection) : protection.getStyleObj(objStyle); if (protectionValue) { retValue.protection = protectionValue; } if (objStyle.fillOut) { retValue.fillOut = objStyle.fillOut; } return retValue; }; style.fullGet = function(objStyle) { if (style.getStyleID(objStyle)) { objStyle = style.getStyle(objStyle); } else { objStyle = style.getStyleObj(objStyle); } var retValue = {}; if (objStyle.format) { retValue.format = xlsxStyle.objTypes["numberFormats"]["ins"].getStyle(objStyle.format); } if (objStyle.font) { retValue.font = xlsxStyle.objTypes["fonts"]["ins"].getStyle(objStyle.font); } if (objStyle.fill) { retValue.fill = xlsxStyle.objTypes["fills"]["ins"].getStyle(objStyle.fill); } if (objStyle.border) { retValue.border = xlsxStyle.objTypes["borders"]["ins"].getStyle(objStyle.border); } if (objStyle.alignment) { retValue.alignment = objStyle.alignment; } if (objStyle.protection) { retValue.protection = objStyle.protection; } return retValue; }; style.cutVisible = function(objStyle) { var retValue = {}; if (objStyle.format) { retValue.format = objStyle.format; } if (objStyle.font) { retValue.font = objStyle.font; } if (objStyle.alignment) { retValue.alignment = objStyle.alignment; } if (objStyle.protection) { retValue.protection = objStyle.protection; } return retValue; }; style.merge = function(formatTo,formatFrom) { if (formatTo.format || formatFrom.format) { formatTo.format = xlsxStyle.objTypes["numberFormats"]["ins"].merge(formatTo.format, formatFrom.format); } if (formatTo.font || formatFrom.font) { formatTo.font = xlsxStyle.objTypes["fonts"]["ins"].merge(formatTo.font, formatFrom.font); } if (formatTo.fill || formatFrom.fill) { formatTo.fill = xlsxStyle.objTypes["fills"]["ins"].merge(formatTo.fill, formatFrom.fill); } if (formatTo.border || formatFrom.border) { formatTo.border = xlsxStyle.objTypes["borders"]["ins"].merge(formatTo.border, formatFrom.border); } if (formatTo.alignment || formatFrom.alignment) { formatTo.alignment = alignment.merge(formatTo.alignment, formatFrom.alignment); } if (formatTo.protection || formatFrom.protection) { formatTo.protection = protection.merge(formatTo.protection, formatFrom.protection); } return formatTo; }; style.getTag = function(objStyle) { var attributes = {}; var children = []; if (objStyle.alignment) { children.push(alignment.getTag(objStyle.alignment)); attributes['applyAlignment'] = true; } if (objStyle.protection) { children.push(protection.getTag(objStyle.protection)); attributes['applyProtection'] = true; } for(var key in objStyle) { if(ALLOWED_PARTS.indexOf(key) > -1) { var value = objStyle[key]; var xlsName = XLS_NAMES[ALLOWED_PARTS.indexOf(key)]; if (key === 'format') { attributes[xlsName] = xlsxStyle.objTypes["numberFormats"]["ins"].getStyleID(value); attributes['applyNumberFormat'] = true; } else if (key === 'fill') { attributes[xlsName] = xlsxStyle.objTypes["fills"]["ins"].getStyleID(value); attributes['applyFill'] = true; } else if (key === 'border') { attributes[xlsName] = xlsxStyle.objTypes["borders"]["ins"].getStyleID(value); attributes['applyBorder'] = true; } else if (key === 'font') { attributes[xlsName] = xlsxStyle.objTypes["fonts"]["ins"].getStyleID(value); attributes['applyFont'] = true; } } } return util.getXML({ name: 'xf', attributes: attributes, children: children }); }; initialize(); return style; }; var StyleBorder = function(util,xlsxStyle) { var self = this; var style = new XlsxBaseStyle(util,xlsxStyle); style.formatName = "border"; style.saveName = "borders"; var mainBorders = ['left', 'right', 'top', 'bottom']; var borders = ['left', 'right', 'top', 'bottom', 'diagonal']; var borderStyle = { dashDot: 'dashDot', dashDotDot: 'dashDotDot', dashed: 'dashed', dotted: 'dotted', double: 'double', hair: 'hair', medium: 'medium', mediumDashDot: 'mediumDashDot', mediumDashDotDot: 'mediumDashDotDot', mediumDashed: 'mediumDashed', none: 'none', slantDashDot: 'slantDashDot', thick: 'thick', thin: 'thin' }; var initialize = function() { style.formats.push({format: style.getStyleObj({})}); style.idIndex = style.formats.length; }; style.getStyleObj = function(objStyle) { var retValue = {}; if(!objStyle) { objStyle = {}; } if(objStyle["style"] || objStyle["color"]) { if (!objStyle["style"] || borderStyle[objStyle["style"]]) { for(var index = 0;index < mainBorders.length;index++) { retValue[mainBorders[index]] = {style: objStyle.style,color: objStyle.color}; } } } else { for(var index = 0;index < borders.length;index++) { var name = borders[index]; var border = objStyle[name]; if (border && (!objStyle.style || borderStyle[border.style])) { retValue[name] = {style: border.style,color: border.color }; } else { retValue[name] = {}; } } } return retValue; }; style.getTag = function(objStyle) { var tagChildren = []; for(var index = 0;index < borders.length;index++) { var childTag = borders[index]; var border = objStyle[childTag]; var attributes = null; var children = null; if (border) { if (border.style) { attributes = {'style': border.style}; } if (border.color) { children = [util.getColorTag(border.color)]; } } tagChildren.push(util.getXML({ name: childTag, attributes: attributes, children: children })); } return util.getXML({ name: 'border', children: tagChildren }); }; style.merge = function(formatTo,formatFrom) { formatTo = (!util.isUndefinedOrNull(formatTo)) ? formatTo : style.getStyleObj({}); if (formatFrom) { for(var index = 0;index < borders.length;index++) { var childTag = borders[index]; var borderFrom = formatFrom[childTag]; if (borderFrom && borderFrom.style) { formatTo[childTag].style = borderFrom.style; } if (borderFrom && borderFrom.color) { formatTo[childTag].color = borderFrom.color; } } } return formatTo; }; initialize(); style.borderStyle = borderStyle; return style; }; var StyleFills = function(util,xlsxStyle) { var self = this; var style = new XlsxBaseStyle(util,xlsxStyle); style.formatName = "fill"; style.saveName = "fills"; var PATTERN_TYPES = ['none', 'solid', 'darkGray', 'mediumGray', 'lightGray', 'gray125', 'gray0625', 'darkHorizontal', 'darkVertical', 'darkDown', 'darkUp', 'darkGrid', 'darkTrellis', 'lightHorizontal', 'lightVertical', 'lightDown', 'lightUp', 'lightGrid', 'lightTrellis']; var initialize = function() { style.formats.push({format: style.getStyleObj({ type: 'none' }, { fillType: 'pattern' }) }, { format: style.getStyleObj({ type: 'gray125' }, { fillType: 'pattern' }) }); style.idIndex = style.formats.length; }; style.getStyleObj = function(objStyle,prop) { var retValue = {}; retValue["fillType"] = prop.merge ? objStyle.fillType : prop.fillType; if(retValue["fillType"] === "pattern") { var fgColor = (prop.merge ? objStyle.fgColor : objStyle.color) || 'FFFFFFFF'; var bgColor = (prop.merge ? objStyle.bgColor : objStyle.backColor) || 'FFFFFFFF'; var patternType = prop.merge ? objStyle.patternType : objStyle.type; retValue["patternType"] = util.hasInArray(PATTERN_TYPES, patternType) ? patternType : 'solid'; if (prop.isTable && retValue.patternType === 'solid') { retValue["fgColor"] = bgColor; retValue["bgColor"] = fgColor; } else { retValue["fgColor"] = fgColor; retValue["bgColor"] = bgColor; } } else { if (!util.isUndefinedOrNull(objStyle['left'])) { retValue.left = objStyle.left || 0; retValue.right = objStyle.right || 0; retValue.top = objStyle.top || 0; retValue.bottom = objStyle.bottom || 0; } else { retValue.degree = objStyle.degree || 0; } retValue.start = objStyle.start || 'FFFFFFFF'; retValue.end = objStyle.end || 'FFFFFFFF'; } return retValue; }; style.getTag = function(objStyle) { var children = (objStyle.fillType === 'pattern') ? [getPatternTag(objStyle)] : [getGradientTag(objStyle)]; return util.getXML({ name: 'fill', children: children }); }; var getPatternTag = function(objStyle) { var attributes = {'patternType': objStyle.patternType}; var children = [util.getXML({ name: 'fgColor', attributes: {'rgb': util.getCanonColor(objStyle.fgColor)} }), util.getXML({ name: 'bgColor', attributes: {'rgb': util.getCanonColor(objStyle.bgColor)} })]; return util.getXML({ name: 'patternFill', attributes: attributes, children: children }); }; var getGradientTag = function(objStyle) { var attributes = {}; if (objStyle.degree) { attributes['degree'] = objStyle.degree; } else if (objStyle.left) { attributes['type'] = 'path'; attributes['left'] = objStyle.left; attributes['right'] = objStyle.right; attributes['top'] = objStyle.top; attributes['bottom'] = objStyle.bottom; } var children = [util.getXML({ name: 'stop', attributes: {'position': 0}, children: [util.getColorTag(objStyle.start)] }), util.getXML({ name: 'stop', attributes: {'position': 1}, children: [util.getColorTag(objStyle.end)] })]; return util.getXML({ name: 'gradientFill', attributes: attributes, children: children }); }; initialize(); return style; }; var StyleFonts = function(util,xlsxStyle) { var self = this; var style = new XlsxBaseStyle(util,xlsxStyle); style.formatName = "font"; style.saveName = "fonts"; var initialize = function() { style.formats.push({format: style.getStyleObj({})}); style.idIndex = style.formats.length; }; style.getStyleObj = function(objStyle) { var retValue = {}; if (objStyle['bold']) { retValue.bold = !!objStyle.bold; } if (objStyle['italic']) { retValue.italic = !!objStyle.italic; } if (objStyle.superscript) { retValue.vertAlign = 'superscript'; } if (objStyle.subscript) { retValue.vertAlign = 'subscript'; } if (objStyle.underline) { var arrUnderline = ['double', 'singleAccounting', 'doubleAccounting']; if (arrUnderline.indexOf(objStyle.underline) > -1) { retValue.underline = objStyle.underline; } else { retValue.underline = true; } } if (objStyle['strike']) { retValue.strike = !!objStyle.strike; } if (objStyle.outline) { retValue.outline = true; } if (objStyle.shadow) { retValue.shadow = true; } if (objStyle.size) { retValue.size = objStyle.size; } if (objStyle.color) { retValue.color = objStyle.color; } if (objStyle.fontName) { retValue.fontName = objStyle.fontName; } return retValue; }; style.getTag = function(objStyle) { var children = []; if (objStyle.size) { children.push(util.getXML({ name: 'sz', attributes: {'val': objStyle.size} })); } if (objStyle.fontName) { children.push(util.getXML({ name: 'name', attributes: {'val': objStyle.fontName} })); } if (objStyle['bold']) { if (objStyle.bold) { children.push(util.getXML({ name: 'b' })); } else { children.push(util.getXML({ name: 'b', attributes: {'val': 0} })); } } if (objStyle['italic']) { if (objStyle.italic) { children.push(util.getXML({ name: 'i' })); } else { children.push(util.getXML({ name: 'i', attributes: {'val': 0}})); } } if (objStyle.vertAlign) { children.push(util.getXML({ name: 'vertAlign', attributes: {'val': objStyle.vertAlign} })); } if (objStyle.underline) { var attrs = null; if (objStyle.underline !== true) { attrs = {'val': objStyle.underline}; } children.push(util.getXML({ name: 'u', attributes: attrs })); } if (objStyle['strike']) { if (objStyle.strike) { children.push(util.getXML({ name: 'strike' })); } else { children.push(util.getXML({ name: 'strike', attributes: {'val': 0} })); } } if (objStyle.shadow) { children.push(util.getXML({ name: 'shadow' })); } if (objStyle.outline) { children.push(util.getXML({ name: 'outline' })); } if (objStyle.color) { children.push(util.getColorTag(objStyle.color)); } return util.getXML({ name: 'font', children: children }); }; style.merge = function(formatTo,formatFrom) { var retValue = {}; for(var key in formatTo) { retValue[key] = formatTo[key]; } for(var key in formatFrom) { retValue[key] = formatFrom[key]; } retValue.color = formatFrom && formatFrom.color || formatTo && formatTo.color; return retValue; }; initialize(); return style; }; var StyleNumberFormat = function(util,xlsxStyle) { var self = this; var style = new XlsxBaseStyle(util,xlsxStyle); style.formatName = "numberFormat"; style.saveName = "numFmts"; var initialize = function() { for(var key in util.numberPredifined) { style.formatsByNames[key] = {format: key, formatId: util.numberPredifined[key].formatId}; } style.idIndex = 164; }; style.getStyleObj = function(objStyle) { return objStyle; }; style.getTag = function(objStyle,styleFormat) { var attributes = {'numFmtId': styleFormat.formatId,'formatCode': objStyle}; return util.getXML({ name: 'numFmt', attributes: attributes }); }; initialize(); return style; }; var XlsxAlignment = function(util) { var self = this; var HORIZONTAL = ['left', 'center', 'right', 'fill', 'justify', 'centerContinuous', 'distributed']; var VERTICAL = ['top', 'center', 'bottom', 'justify', 'distributed']; var getStyleObj = function(objStyle) { if(objStyle) { var retValue = {}; if (objStyle['horizontal'] && HORIZONTAL.indexOf(objStyle.horizontal) > -1) { retValue.horizontal = objStyle.horizontal; } if (objStyle['vertical'] && VERTICAL.indexOf(objStyle.vertical) > -1) { retValue.vertical = objStyle.vertical; } if (objStyle['indent']) { retValue.indent = objStyle.indent; } if (objStyle['justifyLastLine']) { retValue.justifyLastLine = objStyle.justifyLastLine ? 1 : 0; } if (objStyle['readingOrder'] && _.includes([0, 1, 2], objStyle.readingOrder)) { retValue.readingOrder = objStyle.readingOrder; } if (objStyle['relativeIndent']) { retValue.relativeIndent = objStyle.relativeIndent; } if (objStyle['shrinkToFit']) { retValue.shrinkToFit = objStyle.shrinkToFit ? 1 : 0; } if (objStyle['textRotation']) { retValue.textRotation = objStyle.textRotation; } if (objStyle['wrapText']) { retValue.wrapText = objStyle.wrapText ? 1 : 0; } if(!util.isObjectEmpty(retValue)) { return retValue; } } return null; }; var merge = function(objTo,objFrom) { var retValue = {}; for (var key in objFrom) { retValue[key] = objFrom[key]; } for (var key in objTo) { retValue[key] = objTo[key]; } return retValue; }; var getTag = function(format) { return util.getXML({ name: 'alignment', attributes: format }); }; self.getStyleObj = getStyleObj; self.merge = merge; self.getTag = getTag; }; var XlsxProtection = function(util) { var self = this; var getStyleObj = function(objStyle) { if(objStyle) { var retValue = {}; if (objStyle['locked']) { retValue.locked = objStyle.locked ? 1 : 0; } if (objStyle['hidden']) { retValue.hidden = objStyle.hidden ? 1 : 0; } if(!util.isObjectEmpty(retValue)) { return retValue; } } return null; }; var merge = function(objTo,objFrom) { var retValue = {}; for (var key in objFrom) { retValue[key] = objFrom[key]; } for (var key in objTo) { retValue[key] = objTo[key]; } return retValue; }; var getTag = function(format) { return util.getXML({ name: 'protection', attributes: format }); }; self.getStyleObj = getStyleObj; self.merge = merge; self.getTag = getTag; }; var XlsxBaseStyle = function(util,xlsxStyle) { var self = this; self.util = util; self.xlsxStyle = xlsxStyle; self.formatName = null; self.saveName = null; self.nameIndex = 1; self.idIndex = 0; self.formats = []; self.formatsByData = {}; self.formatsByNames = {}; self.predefined = {}; self.saveEmpty = true; self.add = function(style,name,prop) { prop = prop ? prop : {}; if (name && self.formatsByNames[name]) { var objStyle = self.getStyleObj(style,prop); var strStyle = self