30 Star 71 Fork 30

Sail / ejsExcel

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
ejs4xlx.js 19.63 KB
一键复制 编辑 原始数据 按行查看 历史
Sail 提交于 2017-08-16 13:46 . <%showSheet()%>显示所在工作表
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620
/*!
* EJS
* Copyright(c) 2012 TJ Holowaychuk <tj@vision-media.ca>
* MIT Licensed
*/
/**
* Module dependencies.
*/
var fs = require('fs');
var path = require('path');
var basename = path.basename;
var dirname = path.dirname;
var extname = path.extname;
var join = path.join;
var isType = function(type) {
return function(obj) {
return Object.prototype.toString.call(obj) === "[object " + type + "]";
};
};
var isObject = isType("Object");
var isString = isType("String");
var isArray = Array.isArray || isType("Array");
var isFunction = isType("Function");
var UID = Date.now()
var uniqueID = function() {
return (UID++).toString(36);
}
var charToNum = function(str) {
var i, j, len, m, ref, temp, val;
str = new String(str);
val = 0;
len = str.length;
for (j = m = 0, ref = len; 0 <= ref ? m < ref : m > ref; j = 0 <= ref ? ++m : --m) {
i = len - 1 - j;
temp = str.charCodeAt(i) - 65 + 1;
val += temp * Math.pow(26, j);
}
return val;
};
/**
* Filters.
*
* @type Object
*/
var filters = exports.filters = require('./filters');
/**
* Translate filtered code into function calls.
*
* @param {String} js
* @return {String}
* @api private
*/
function filtered(js) {
return js.substr(1).split('|').reduce(function(js, filter){
var parts = filter.split(':')
, name = parts.shift()
, args = parts.shift() || '';
if (args) args = ', ' + args;
return 'filters.' + name + '(' + js + args + ')';
});
};
/**
* Re-throw the given `err` in context to the
* `str` of ejs, `filename`, and `lineno`.
*
* @param {Error} err
* @param {String} str
* @param {String} filename
* @param {String} lineno
* @api private
*/
function rethrow(err, str, filename, lineno){
var lines = str.split('\n')
, start = Math.max(lineno - 3, 0)
, end = Math.min(lines.length, lineno + 3);
// Error context
var context = lines.slice(start, end).map(function(line, i){
var curr = i + start + 1;
return (curr == lineno ? ' >> ' : ' ')
+ curr
+ '| '
+ line;
}).join('\n');
// Alter exception message
err.path = filename;
err.message = (filename || 'ejs') + ':'
+ lineno + '\n'
+ context + '\n\n'
+ err.message;
throw err;
}
/**
* Parse the given `str` of ejs, returning the function body.
*
* @param {String} str
* @return {String}
* @api public
*/
var parse = exports.parse = function(str, options){
//sail 2013-04-21
if(Buffer.isBuffer(str)) str = str.toString();
options = options || {};
var open = options.open || exports.open || '<%'
, close = options.close || exports.close || '%>'
, beforeBuf = options.beforeBuf || exports.beforeBuf || ''
, filename = options.filename
//=,- 符号时生成的字符串针对xml转义符进行转义,在ejsExcel中会使用到
, reXmlEq = options.reXmlEq
, buf = [];
buf.push('var buf = [];');
buf.push(beforeBuf);
buf.push(';buf.push(Buffer.from(\'');
var lineno = 1;
//sail
var isForRowBegin = false;
var isForRowEnd = false;
var isForCellBegin = false;
var isForCellEnd = false;
//行号
var rowRn = undefined;
//列号
var cellRn = undefined;
var isCEnd = false;
var isCbegin = false;
var isRowBegin = false;
var isRowEnd = false;
var consumeEOL = false;
var forRBegin = false;
var forREnd = false;
var forRNumArr = [];
var forCBegin = false;
var forCEnd = false;
var forCNumArr = [];
var ifRBegin = false;
var ifREnd = false;
var ifCBegin = false;
var ifCEnd = false;
var pixEq = "";
for (var i = 0, len = str.length; i < len; ++i) {
if (str.slice(i, open.length + i) == open) {
i += open.length;
//sail
pixEq = str.substr(i, 1);
var prefix, postfix, line = lineno;
if(pixEq === "=" || pixEq === "-" || pixEq === "~" || pixEq === "#") {
prefix = "'));buf.push(Buffer.from(";
postfix = "));buf.push(Buffer.from('";
++i;
} else {
prefix = "'));";
postfix = ";buf.push(Buffer.from('";
}
var end = str.indexOf(close, i)
, js = str.substring(i, end)
, start = i
, include = null
, n = 0;
if ('-' == js[js.length-1]){
js = js.substring(0, js.length - 2);
consumeEOL = true;
}
js = js.trim();
if(0 == js.indexOf('forRow')) {
var uid = uniqueID();
var name = js.slice(6);
isForRowBegin = true;
isForRowEnd = false;
var nameArr = [];
nameArr[0] = name.substring(0,name.indexOf(" in "));
nameArr[1] = name.substring(name.indexOf(" in ")+4);
var pixJs = "";
if(nameArr[1].indexOf("|||") !== -1) {
pixJs = nameArr[1].substring(nameArr[1].indexOf("|||")+3);
nameArr[1] = nameArr[1].substring(0,nameArr[1].indexOf("|||"));
}
var itemName = nameArr[0].trim();
var iName = "";
if(itemName.indexOf(",") !== -1) {
var tmpArr = itemName.split(",");
itemName = tmpArr[0].trim();
if(tmpArr[1].trim() !== "") {
iName = "var "+tmpArr[1].trim()+"=I_m"+uid+";";
}
}
var arrName = nameArr[1].trim();
var strTmp = buf.join('');
var mthArr = strTmp.match(/<row r="/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<row r="/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "'));var I_rLen"+uid+"="+arrName+";if(Array.isArray(I_rLen"+uid+")){I_rLen"+uid+"=I_rLen"+uid+".length;} for(var I_m"+uid+"=0;I_m"+uid+"<I_rLen"+uid+";I_m"+uid+"++){yield Promise_sleep(0);"+iName+"var "+itemName+"="+arrName+"[I_m"+uid+"];if(typeof("+arrName+")===\"number\"){"+itemName+"=I_m"+uid+";}"+pixJs+";buf.push(Buffer.from('"+mthLt;
}
return s;
});
buf = [strTmp];
js = '';
}
//sail 2015-06-24 --begin
else if(0 == js.indexOf('ifRBegin')) {
ifRBegin = true;
ifREnd = false;
forRNumArr.push(rowRn);
var jsStr = js.slice(8);
var strTmp = buf.join('');
var mthArr = strTmp.match(/<row r="/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<row r="/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "'));if("+jsStr+"){buf.push(Buffer.from('"+mthLt;
}
return s;
});
buf = [strTmp];
js = '';
} else if(0 == js.indexOf('ifREnd')) {
ifRBegin = false;
ifREnd = true;
if(forRNumArr.length === 0) throw new Error("ifREnd must begin with ifRBegin");
var rjsNum = rowRn-forRNumArr.pop();
var rjsStr = js.slice(6);
var strTmp = buf.join('');
var mthArr = strTmp.match(/<\/row>/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<\/row>/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "</row>'));_r+="+rjsNum+";}_r-="+rjsNum+";buf.push(Buffer.from('";
}
return s;
});
buf = [strTmp];
js = '';
}
else if(0 == js.indexOf('ifCBegin')) {
ifCBegin = true;
ifCEnd = false;
forCNumArr.push(cellRn);
var jsStr = js.slice(8);
var strTmp = buf.join('');
var mthArr = strTmp.match(/<c r="/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<c r="/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "'));if("+jsStr+"){buf.push(Buffer.from('"+mthLt;
}
return s;
});
buf = [strTmp];
js = '';
} else if(0 == js.indexOf('ifCEnd')) {
ifCBegin = false;
ifCEnd = true;
if(forCNumArr.length === 0) throw new Error("ifCEnd must be begin with ifCBegin");
var rjsNum = charToNum(cellRn)-charToNum(forCNumArr.pop());
var rjsStr = js.slice(6);
var strTmp = buf.join('');
var mthArr = strTmp.match(/<\/c>/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<\/c>/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "</c>'));_c+="+rjsNum+";}_c-="+rjsNum+";buf.push(Buffer.from('";
}
return s;
});
buf = [strTmp];
js = '';
}
else if(0 == js.indexOf('forCBegin')) {
forCBegin = true;
forCEnd = false;
forCNumArr.push(cellRn);
var uid = uniqueID();
var name = js.slice(9);
var nameArr = [];
nameArr[0] = name.substring(0,name.indexOf(" in "));
nameArr[1] = name.substring(name.indexOf(" in ")+4);
var pixJs = "";
if(nameArr[1].indexOf("|||") !== -1) {
pixJs = nameArr[1].substring(nameArr[1].indexOf("|||")+3);
nameArr[1] = nameArr[1].substring(0,nameArr[1].indexOf("|||"));
}
var itemName = nameArr[0].trim();
var iName = "";
if(itemName.indexOf(",") !== -1) {
var tmpArr = itemName.split(",");
itemName = tmpArr[0].trim();
if(tmpArr[1].trim() !== "") {
iName = "var "+tmpArr[1].trim()+"=I_c"+uid+";";
}
}
var arrName = nameArr[1].trim();
var strTmp = buf.join('');
var mthArr = strTmp.match(/<c r="/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<c r="/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "'));var I_cLen"+uid+"="+arrName+";if(Array.isArray(I_cLen"+uid+")){I_cLen"+uid+"=I_cLen"+uid+".length;} for(var I_c"+uid+"=0;I_c"+uid+"<I_cLen"+uid+";I_c"+uid+"++){yield Promise_sleep(0);"+iName+"var "+itemName+"="+arrName+"[I_c"+uid+"];if(typeof("+arrName+")===\"number\"){"+itemName+"=I_c"+uid+";}"+pixJs+";buf.push(Buffer.from('"+mthLt;
}
return s;
});
buf = [strTmp];
js = '';
} else if(0 == js.indexOf('forCEnd')) {
forCBegin = false;
forCEnd = true;
if(forCNumArr.length === 0) throw new Error("forCEnd must be begin with forCBegin");
var rjsNum = charToNum(cellRn)-charToNum(forCNumArr.pop());
var strTmp = buf.join('');
var mthArr = strTmp.match(/<\/c>/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<\/c>/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "</c>'));_c+="+rjsNum+";}_c-="+rjsNum+";buf.push(Buffer.from('";
}
return s;
});
buf = [strTmp];
js = '';
}
//sail 2015-06-24 --end
//sail 2014-04-09 --begin
else if(0 == js.indexOf('forRBegin')) {
forRBegin = true;
forREnd = false;
forRNumArr.push(rowRn);
var uid = uniqueID();
var name = js.slice(9);
var nameArr = [];
nameArr[0] = name.substring(0,name.indexOf(" in "));
nameArr[1] = name.substring(name.indexOf(" in ")+4);
var pixJs = "";
if(nameArr[1].indexOf("|||") !== -1) {
pixJs = nameArr[1].substring(nameArr[1].indexOf("|||")+3);
nameArr[1] = nameArr[1].substring(0,nameArr[1].indexOf("|||"));
}
var itemName = nameArr[0].trim();
var iName = "";
if(itemName.indexOf(",") !== -1) {
var tmpArr = itemName.split(",");
itemName = tmpArr[0].trim();
if(tmpArr[1].trim() !== "") {
iName = "var "+tmpArr[1].trim()+"=I_m"+uid+";";
}
}
var arrName = nameArr[1].trim();
var strTmp = buf.join('');
var mthArr = strTmp.match(/<row r="/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<row r="/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "'));var I_rLen"+uid+"="+arrName+";if(Array.isArray(I_rLen"+uid+")){I_rLen"+uid+"=I_rLen"+uid+".length;} for(var I_m"+uid+"=0;I_m"+uid+"<I_rLen"+uid+";I_m"+uid+"++){yield Promise_sleep(0);"+iName+"var "+itemName+"="+arrName+"[I_m"+uid+"];if(typeof("+arrName+")===\"number\"){"+itemName+"=I_m"+uid+";}"+pixJs+";buf.push(Buffer.from('"+mthLt;
}
return s;
});
buf = [strTmp];
js = '';
}
else if(0 == js.indexOf('forREnd')) {
forRBegin = false;
forREnd = true;
if(forRNumArr.length === 0) throw new Error("forREnd must begin with forRBegin");
var rjsNum = rowRn-forRNumArr.pop();
var strTmp = buf.join('');
var mthArr = strTmp.match(/<\/row>/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<\/row>/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "</row>'));_r+="+rjsNum+";}_r-="+rjsNum+";buf.push(Buffer.from('";
}
return s;
});
buf = [strTmp];
js = '';
}
//sail 2014-04-09 --end
else if(0 === js.indexOf('forCell')) {
var uid = uniqueID();
var name = js.slice(7);
isForCellBegin = true;
isForCellEnd = false;
var nameArr = [];
nameArr[0] = name.substring(0,name.indexOf(" in "));
nameArr[1] = name.substring(name.indexOf(" in ")+4);
var pixJs = "";
if(nameArr[1].indexOf("|||") !== -1) {
pixJs = nameArr[1].substring(nameArr[1].indexOf("|||")+3);
nameArr[1] = nameArr[1].substring(0,nameArr[1].indexOf("|||"));
}
var itemName = nameArr[0].trim();
var iName = "";
if(itemName.indexOf(",") !== -1) {
var tmpArr = itemName.split(",");
itemName = tmpArr[0].trim();
if(tmpArr[1].trim() !== "") {
iName = "var "+tmpArr[1].trim()+"=I_c"+uid+";";
}
}
var arrName = nameArr[1].trim();
var strTmp = buf.join('');
var mthArr = strTmp.match(/<c r="/gm);
var mthLt = mthArr[mthArr.length-1];
var repNum = 0;
strTmp = strTmp.replace(/<c r="/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "'));var I_cLen"+uid+" = "+arrName+";if(Array.isArray(I_cLen"+uid+")){I_cLen"+uid+"=I_cLen"+uid+".length;} for(var I_c"+uid+"=0;I_c"+uid+"<I_cLen"+uid+";I_c"+uid+"++){yield Promise_sleep(0);"+iName+"var "+itemName+"="+arrName+"[I_c"+uid+"];if(typeof("+arrName+")===\"number\"){"+itemName+"=I_c"+uid+";}"+pixJs+";buf.push(Buffer.from('"+mthLt;
}
return s;
});
buf = [strTmp];
js = '';
}
//图片
else if(0 == js.indexOf('_img_(')) {
if(options !== undefined && options.fileName !== undefined) {
js = js.substring(0,js.length-1);
var cellNum = 1;
for(var sei=0; sei<cellRn.length; sei++) {
cellNum += cellRn.charCodeAt(sei)-65+(cellRn.length-1-sei)*26;
}
js = "yield "+js+",\""+options.fileName.replace(/\"/gm,"\\\"")+"\",("+rowRn+"+_r),("+cellNum+"+_c))";
}
}
//二维码图片
else if(0 == js.indexOf('_qrcode_(')) {
if(options !== undefined && options.fileName !== undefined) {
js = js.substring(0,js.length-1);
var cellNum = 1;
for(var sei=0; sei<cellRn.length; sei++) {
cellNum += cellRn.charCodeAt(sei)-65+(cellRn.length-1-sei)*26;
}
js = "yield "+js+",\""+options.fileName.replace(/\"/gm,"\\\"")+"\",("+rowRn+"+_r),("+cellNum+"+_c))";
}
}
//分组
else if(0 === js.indexOf('_outlineLevel_(')) {
js = js.substring(0,js.length-1);
js += ",buf)";
}
//隐藏当前工作表 2017-01-18
else if(0 == js.indexOf('_hideSheet_(')) {
if(options && options.fileName) {
js = js.substring(0,js.length-1);
js += "\""+options.fileName.replace(/\"/gm,"\\\"")+"\")";
}
}
//显示当前工作表 2017-01-18
else if(0 == js.indexOf('_showSheet_(')) {
if(options && options.fileName) {
js = js.substring(0,js.length-1);
js += "\""+options.fileName.replace(/\"/gm,"\\\"")+"\")";
}
}
//删除当前工作表 2017-01-18
else if(0 == js.indexOf('_deleteSheet_(')) {
if(options && options.fileName) {
js = js.substring(0,js.length-1);
js += "\""+options.fileName.replace(/\"/gm,"\\\"")+"\")";
}
}
while (~(n = js.indexOf("\n", n))) n++, lineno++;
if (js.substr(0, 1) == ':') js = filtered(js);
if (js) {
//if (js.lastIndexOf('//') > js.lastIndexOf('\n')) js += '\n';
//sail 2012-04-21
//=,- 符号时生成的字符串针对xml转义符进行转义,在ejsExcel中会使用到
if(reXmlEq !== undefined && (pixEq === "=" || pixEq === "~" || pixEq === "#")) {
var rxeObj = reXmlEq(pixEq,js,buf.join(''));
js = rxeObj.jsStr;
buf = [rxeObj.str];
}
//sail 2012-04-21 end
buf.push(prefix, js, postfix);
}
i += end - start + close.length - 1;
}
else if(str.substr(i,8) === "<row r=\"") {
isRowBegin = true;
isRowEnd = false;
forCNumArr = []
i += 7;
buf.push("<row r=\"");
}
else if(isRowBegin === true && isRowEnd === false && str.substr(i,1) === "\"") {
isRowEnd = true;
isRowBegin = false;
var strTmp = buf.join('')+"\"";
var mthArr = strTmp.match(/<row r="\d+"/gm);
var mthLt = mthArr[mthArr.length-1];
//行号
rowRn = mthLt.replace(/<row r="/gm,"").replace(/"/gm,"");
var repNum = 0;
strTmp = strTmp.replace(/<row r="\d+"/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "<row r=\"'));_c=0;_row="+rowRn+"+_r;buf.push(Buffer.from(String(_row)));buf.push(Buffer.from('\"";
}
return s;
});
buf = [strTmp];
}
else if(str.substr(i,6) === "<c r=\"") {
isCbegin = true;
isCEnd = false;
i += 5;
buf.push("<c r=\"");
}
else if(isCbegin === true && isCEnd === false && str.substr(i,1) === "\"") {
isCEnd = true;
isCbegin = false;
var strTmp = buf.join('')+"\"";
var mthArr = strTmp.match(/<c r="[A-Z]+[0-9]+"/gm);
var mthLt = mthArr[mthArr.length-1];
cellRn = mthLt.replace(/<c r="/gm,"").replace(/\d+"/gm,"");
var repNum = 0;
strTmp = strTmp.replace(/<c r="[A-Z]+[0-9]+"/gm,function(s){
repNum++;
if(mthArr.length === repNum) {
return "<c r=\"'));_col=_charPlus_('"+cellRn+"',_c);_rc=_col+_row;buf.push(Buffer.from(_rc));buf.push(Buffer.from('\"";
}
return s;
});
buf = [strTmp];
}
//sail
else if(isForRowBegin === true && isForRowEnd === false && str.substr(i,6) === "</row>") {
isForRowEnd = true;
isForRowBegin = false;
i += 5;
buf.push("</row>'));_r++;}_r--;buf.push(Buffer.from('");
}
else if(isForCellBegin === true && isForCellEnd === false && str.substr(i,4) === "</c>") {
isForCellEnd = true;
isForCellBegin = false;
i += 3;
buf.push("</c>'));_c++;}_c--;buf.push(Buffer.from('");
}
else if (str.substr(i, 1) == "\\") {
buf.push("\\\\");
} else if (str.substr(i, 1) == "'") {
buf.push("\\'");
} else if (str.substr(i, 1) == "\r") {
buf.push(" ");
} else if (str.substr(i, 1) == "\n") {
if (consumeEOL) {
consumeEOL = false;
} else {
buf.push("\\n");
lineno++;
}
} else {
pixEq = "";
buf.push(str.substr(i, 1));
}
}
buf.push("'));");
buf.push("buf = Buffer.concat(buf);return buf;");
//fs.writeFileSync("D:/abc.js",buf.join(''));
//process.exit();
return buf.join('');
};
/**
* Resolve include `name` relative to `filename`.
*
* @param {String} name
* @param {String} filename
* @return {String}
* @api private
*/
function resolveInclude(name, filename) {
var path = join(dirname(filename), name);
var ext = extname(name);
if (!ext) path += '.ejs';
return path;
}
NodeJS
1
https://gitee.com/ccteams/ejsExcel.git
git@gitee.com:ccteams/ejsExcel.git
ccteams
ejsExcel
ejsExcel
master

搜索帮助