nscomponentsreact
Version:
React Wrapper Components for NSComponents
1,822 lines (1,673 loc) • 92.4 kB
JavaScript
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 __nsGlobal = (function () {
if (typeof globalThis !== "undefined") return globalThis;
if (typeof self !== "undefined") return self;
if (typeof window !== "undefined") return window;
if (typeof global !== "undefined") return global;
return Function("return this")();
})();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(__nsGlobal,"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 = {};