产品一张表luckysheet前端代码库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

781 lines
19 KiB

import { columeHeader_word, columeHeader_word_index, luckysheetdefaultFont } from '../controllers/constant';
import menuButton from '../controllers/menuButton';
import { isdatatype, isdatatypemulti } from '../global/datecontroll';
import { hasChinaword,isRealNum } from '../global/validate';
import Store from '../store';
import locale from '../locale/locale';
/**
* Common tool methods
*/
/**
* Determine whether a string is in standard JSON format
* @param {String} str
*/
function isJsonString(str) {
try {
if (typeof JSON.parse(str) == "object") {
return true;
}
}
catch (e) { }
return false;
}
/**
* extend two objects
* @param {Object } jsonbject1
* @param {Object } jsonbject2
*/
function common_extend(jsonbject1, jsonbject2) {
let resultJsonObject = {};
for (let attr in jsonbject1) {
resultJsonObject[attr] = jsonbject1[attr];
}
for (let attr in jsonbject2) {
resultJsonObject[attr] = jsonbject2[attr];
}
return resultJsonObject;
};
// 替换temp中的${xxx}为指定内容 ,temp:字符串,这里指html代码,dataarry:一个对象{"xxx":"替换的内容"}
// 例:luckysheet.replaceHtml("${image}",{"image":"abc","jskdjslf":"abc"}) ==> abc
function replaceHtml(temp, dataarry) {
return temp.replace(/\$\{([\w]+)\}/g, function (s1, s2) { let s = dataarry[s2]; if (typeof (s) != "undefined") { return s; } else { return s1; } });
};
//获取数据类型
function getObjType(obj) {
let toString = Object.prototype.toString;
let map = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object'
}
// if(obj instanceof Element){
// return 'element';
// }
return map[toString.call(obj)];
}
//颜色 16进制转rgb
function hexToRgb(hex) {
let color = [], rgb = [];
hex = hex.replace(/#/, "");
if (hex.length == 3) { // 处理 "#abc" 成 "#aabbcc"
let tmp = [];
for (let i = 0; i < 3; i++) {
tmp.push(hex.charAt(i) + hex.charAt(i));
}
hex = tmp.join("");
}
for (let i = 0; i < 3; i++) {
color[i] = "0x" + hex.substr(i + 2, 2);
rgb.push(parseInt(Number(color[i])));
}
return 'rgb(' + rgb.join(",") + ')';
};
//颜色 rgb转16进制
function rgbTohex(color) {
let rgb;
if (color.indexOf("rgba") > -1) {
rgb = color.replace("rgba(", "").replace(")", "").split(',');
}
else {
rgb = color.replace("rgb(", "").replace(")", "").split(',');
}
let r = parseInt(rgb[0]);
let g = parseInt(rgb[1]);
let b = parseInt(rgb[2]);
let hex = "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
return hex;
};
//列下标 字母转数字
function ABCatNum(a) {
// abc = abc.toUpperCase();
// let abc_len = abc.length;
// if (abc_len == 0) {
// return NaN;
// }
// let abc_array = abc.split("");
// let wordlen = columeHeader_word.length;
// let ret = 0;
// for (let i = abc_len - 1; i >= 0; i--) {
// if (i == abc_len - 1) {
// ret += columeHeader_word_index[abc_array[i]];
// }
// else {
// ret += Math.pow(wordlen, abc_len - i - 1) * (columeHeader_word_index[abc_array[i]] + 1);
// }
// }
// return ret;
if(a==null || a.length==0){
return NaN;
}
var str=a.toLowerCase().split("");
var num=0;
var al = str.length;
var getCharNumber = function(charx){
return charx.charCodeAt() -96;
};
var numout = 0;
var charnum = 0;
for(var i = 0; i < al; i++){
charnum = getCharNumber(str[i]);
numout += charnum * Math.pow(26, al-i-1);
};
// console.log(a, numout-1);
if(numout==0){
return NaN;
}
return numout-1;
};
//列下标 数字转字母
function chatatABC(n) {
// let wordlen = columeHeader_word.length;
// if (index < wordlen) {
// return columeHeader_word[index];
// }
// else {
// let last = 0, pre = 0, ret = "";
// let i = 1, n = 0;
// while (index >= (wordlen / (wordlen - 1)) * (Math.pow(wordlen, i++) - 1)) {
// n = i;
// }
// let index_ab = index - (wordlen / (wordlen - 1)) * (Math.pow(wordlen, n - 1) - 1);//970
// last = index_ab + 1;
// for (let x = n; x > 0; x--) {
// let last1 = last, x1 = x;//-702=268, 3
// if (x == 1) {
// last1 = last1 % wordlen;
// if (last1 == 0) {
// last1 = 26;
// }
// return ret + columeHeader_word[last1 - 1];
// }
// last1 = Math.ceil(last1 / Math.pow(wordlen, x - 1));
// //last1 = last1 % wordlen;
// ret += columeHeader_word[last1 - 1];
// if (x > 1) {
// last = last - (last1 - 1) * wordlen;
// }
// }
// }
var orda = 'a'.charCodeAt(0);
var ordz = 'z'.charCodeAt(0);
var len = ordz - orda + 1;
var s = "";
while( n >= 0 ) {
s = String.fromCharCode(n % len + orda) + s;
n = Math.floor(n / len) - 1;
}
return s.toUpperCase();
};
function ceateABC(index) {
let wordlen = columeHeader_word.length;
if (index < wordlen) {
return columeHeader_word;
}
else {
let relist = [];
let i = 2, n = 0;
while (index < (wordlen / (wordlen - 1)) * (Math.pow(wordlen, i) - 1)) {
n = i;
i++;
}
for (let x = 0; x < n; x++) {
if (x == 0) {
relist = relist.concat(columeHeader_word);
}
else {
relist = relist.concat(createABCdim(x), index);
}
}
}
};
function createABCdim(x, count) {
let chwl = columeHeader_word.length;
if (x == 1) {
let ret = [];
let c = 0, con = true;
for (let i = 0; i < chwl; i++) {
let b = columeHeader_word[i];
for (let n = 0; n < chwl; n++) {
let bq = b + columeHeader_word[n];
ret.push(bq);
c++;
if (c > index) {
return ret;
}
}
}
}
else if (x == 2) {
let ret = [];
let c = 0, con = true;
for (let i = 0; i < chwl; i++) {
let bb = columeHeader_word[i];
for (let w = 0; w < chwl; w++) {
let aa = columeHeader_word[w];
for (let n = 0; n < chwl; n++) {
let bqa = bb + aa + columeHeader_word[n];
ret.push(bqa);
c++;
if (c > index) {
return ret;
}
}
}
}
}
};
/**
* 计算字符串字节长度
* @param {*} val 字符串
* @param {*} subLen 要截取的字符串长度
*/
function getByteLen(val,subLen) {
if(subLen === 0){
return "";
}
if (val == null) {
return 0;
}
let len = 0;
for (let i = 0; i < val.length; i++) {
let a = val.charAt(i);
if (a.match(/[^\x00-\xff]/ig) != null) {
len += 2;
}
else {
len += 1;
}
if(isRealNum(subLen) && len === ~~subLen){
return val.substring(0,i)
}
}
return len;
};
//数组去重
function ArrayUnique(dataArr) {
let result = [];
let obj = {};
if (dataArr.length > 0) {
for (let i = 0; i < dataArr.length; i++) {
let item = dataArr[i];
if (!obj[item]) {
result.push(item);
obj[item] = 1;
}
}
}
return result
}
//获取字体配置
function luckysheetfontformat(format) {
let fontarray = locale().fontarray;
if (getObjType(format) == "object") {
let font = "";
//font-style
if (format.it == "0" || format.it == null) {
font += "normal ";
}
else {
font += "italic ";
}
//font-variant
font += "normal ";
//font-weight
if (format.bl == "0" || format.bl == null) {
font += "normal ";
}
else {
font += "bold ";
}
//font-size/line-height
if (!format.fs) {
font += Store.defaultFontSize + "pt ";
}
else {
font += Math.ceil(format.fs) + "pt ";
}
if (!format.ff) {
font += fontarray[0] + ', "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif';
}
else {
let fontfamily = null;
let fontjson = locale().fontjson;
if (isdatatypemulti(format.ff)["num"]) {
fontfamily = fontarray[parseInt(format.ff)];
}
else {
// fontfamily = fontarray[fontjson[format.ff]];
fontfamily = format.ff;
fontfamily = fontfamily.replace(/"/g, "").replace(/'/g, "");
if(fontfamily.indexOf(" ")>-1){
fontfamily = '"' + fontfamily + '"';
}
if(fontfamily!=null && document.fonts && !document.fonts.check("12px "+fontfamily)){
menuButton.addFontTolist(fontfamily);
}
}
if (fontfamily == null) {
fontfamily = fontarray[0];
}
font += fontfamily + ', "Helvetica Neue", Helvetica, Arial, "PingFang SC", "Hiragino Sans GB", "Heiti SC", "Microsoft YaHei", "WenQuanYi Micro Hei", sans-serif';
}
return font;
}
else {
return luckysheetdefaultFont();
}
}
//右键菜单
function showrightclickmenu($menu, x, y) {
let winH = $(window).height(), winW = $(window).width();
let menuW = $menu.width(), menuH = $menu.height();
let top = y, left = x;
if (x + menuW > winW) {
left = x - menuW;
}
if (y + menuH > winH) {
top = y - menuH;
}
if (top < 0) {
top = 0;
}
$menu.css({ "top": top, "left": left }).show();
}
//单元格编辑聚焦
function luckysheetactiveCell() {
if (!!Store.fullscreenmode) {
setTimeout(function () {
$("#luckysheet-rich-text-editor").focus().select();
}, 50);
}
}
//单元格编辑聚焦
function luckysheetContainerFocus() {
// $("#" + Store.container).focus({
// preventScroll: true
// });
// fix jquery error: Uncaught TypeError: ((n.event.special[g.origType] || {}).handle || g.handler).apply is not a function
$("#" + Store.container).attr("tabindex", 0).focus();
}
//数字格式
function numFormat(num, type) {
if (num == null || isNaN(parseFloat(num)) || hasChinaword(num) || num == -Infinity || num == Infinity) {
return null;
}
let floatlen = 6, ismustfloat = false;
if (type == null || type == "auto") {
if (num < 1) {
floatlen = 6;
}
else {
floatlen = 1;
}
}
else {
if (isdatatype(type) == "num") {
floatlen = parseInt(type);
ismustfloat = true;
}
else {
floatlen = 6;
}
}
let format = "", value = null;
for (let i = 0; i < floatlen; i++) {
format += "0";
}
if (!ismustfloat) {
format = "[" + format + "]";
}
if (num >= 1e+21) {
value = parseFloat(numeral(num).value());
}
else {
value = parseFloat(numeral(num).format("0." + format));
}
return value;
}
function numfloatlen(n) {
if (n != null && !isNaN(parseFloat(n)) && !hasChinaword(n)) {
let value = numeral(n).value();
let lens = value.toString().split(".");
if (lens.length == 1) {
lens = 0;
}
else {
lens = lens[1].length;
}
return lens;
}
else {
return null;
}
}
//二级菜单显示位置
function mouseclickposition($menu, x, y, p) {
let winH = $(window).height(), winW = $(window).width();
let menuW = $menu.width(), menuH = $menu.height();
let top = y, left = x;
if (p == null) {
p = "lefttop";
}
if (p == "lefttop") {
$menu.css({ "top": y, "left": x }).show();
}
else if (p == "righttop") {
$menu.css({ "top": y, "left": x - menuW }).show();
}
else if (p == "leftbottom") {
$menu.css({ "bottom": winH - y - 12, "left": x }).show();
}
else if (p == "rightbottom") {
$menu.css({ "bottom": winH - y - 12, "left": x - menuW }).show();
}
}
/**
* 元素选择器
* @param {String} selector css选择器
* @param {String} context 指定父级DOM
*/
function $$(selector, context) {
context = context || document
var elements = context.querySelectorAll(selector)
return elements.length == 1
? Array.prototype.slice.call(elements)[0]
: Array.prototype.slice.call(elements)
}
/**
* 串行加载指定的脚本
* 串行加载[异步]逐个加载,每个加载完成后加载下一个
* 全部加载完成后执行回调
* @param {Array|String} scripts 指定要加载的脚本
* @param {Object} options 属性设置
* @param {Function} callback 成功后回调的函数
* @return {Array} 所有生成的脚本元素对象数组
*/
function seriesLoadScripts(scripts, options, callback) {
if (typeof (scripts) !== 'object') {
var scripts = [scripts];
}
var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;
var s = [];
var last = scripts.length - 1;
//递归
var recursiveLoad = function (i) {
s[i] = document.createElement('script');
s[i].setAttribute('type', 'text/javascript');
// Attach handlers for all browsers
// 异步
s[i].onload = s[i].onreadystatechange = function () {
if (!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') {
this.onload = this.onreadystatechange = null;
this.parentNode.removeChild(this);
if (i !== last) {
recursiveLoad(i + 1);
} else if (typeof (callback) === 'function') {
callback()
};
}
}
// 同步
s[i].setAttribute('src', scripts[i]);
// 设置属性
if (typeof options === 'object') {
for (var attr in options) {
s[i].setAttribute(attr, options[attr]);
}
}
HEAD.appendChild(s[i]);
};
recursiveLoad(0);
}
/**
* 并行加载指定的脚本
* 并行加载[同步]同时加载,不管上个是否加载完成,直接加载全部
* 全部加载完成后执行回调
* @param {Array|String} scripts 指定要加载的脚本
* @param {Object} options 属性设置
* @param {Function} callback 成功后回调的函数
* @return {Array} 所有生成的脚本元素对象数组
*/
function parallelLoadScripts(scripts, options, callback) {
if (typeof (scripts) !== 'object') {
var scripts = [scripts];
}
var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;
var s = [];
var loaded = 0;
for (var i = 0; i < scripts.length; i++) {
s[i] = document.createElement('script');
s[i].setAttribute('type', 'text/javascript');
// Attach handlers for all browsers
// 异步
s[i].onload = s[i].onreadystatechange = function () {
if (!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') {
loaded++;
this.onload = this.onreadystatechange = null;
this.parentNode.removeChild(this);
if (loaded === scripts.length && typeof (callback) === 'function') callback();
}
};
// 同步
s[i].setAttribute('src', scripts[i]);
// 设置属性
if (typeof options === 'object') {
for (var attr in options) {
s[i].setAttribute(attr, options[attr]);
}
}
HEAD.appendChild(s[i]);
}
}
/**
* 动态添加css
* @param {String} url 指定要加载的css地址
*/
function loadLink(url) {
var doc = document;
var link = doc.createElement("link");
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
link.setAttribute("href", url);
var heads = doc.getElementsByTagName("head");
if (heads.length) {
heads[0].appendChild(link);
}
else {
doc.documentElement.appendChild(link);
}
}
/**
* 动态添加一组css
* @param {String} url 指定要加载的css地址
*/
function loadLinks(urls) {
if (typeof (urls) !== 'object') {
urls = [urls];
}
if (urls.length) {
urls.forEach(url => {
loadLink(url);
});
}
}
function transformRangeToAbsolute(txt1){
if(txt1 ==null ||txt1.length==0){
return null;
}
let txtArray = txt1.split(",");
let ret = "";
for(let i=0;i<txtArray.length;i++){
let txt = txtArray[i];
let txtSplit = txt.split("!"), sheetName="", rangeTxt="";
if(txtSplit.length>1){
sheetName = txtSplit[0];
rangeTxt = txtSplit[1];
}
else{
rangeTxt = txtSplit[0];
}
let rangeTxtArray = rangeTxt.split(":");
let rangeRet = "";
for(let a=0;a<rangeTxtArray.length;a++){
let t = rangeTxtArray[a];
let row = t.replace(/[^0-9]/g, "");
let col = t.replace(/[^A-Za-z]/g, "");
let rangeTT = ""
if(col!=""){
rangeTT += "$" + col;
}
if(row!=""){
rangeTT += "$" + row;
}
rangeRet+=rangeTT+":";
}
rangeRet = rangeRet.substr(0, rangeRet.length-1);
ret += sheetName + rangeRet + ",";
}
return ret.substr(0, ret.length-1);
}
function openSelfModel(id, isshowMask=true){
let $t = $("#"+id)
.find(".luckysheet-modal-dialog-content")
.css("min-width", 300)
.end(),
myh = $t.outerHeight(),
myw = $t.outerWidth();
let winw = $(window).width(), winh = $(window).height();
let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop();
$t.css({
"left": (winw + scrollLeft - myw) / 2,
"top": (winh + scrollTop - myh) / 3
}).show();
if(isshowMask){
$("#luckysheet-modal-dialog-mask").show();
}
}
export {
isJsonString,
common_extend,
replaceHtml,
getObjType,
hexToRgb,
rgbTohex,
ABCatNum,
chatatABC,
ceateABC,
createABCdim,
getByteLen,
ArrayUnique,
luckysheetfontformat,
showrightclickmenu,
luckysheetactiveCell,
numFormat,
numfloatlen,
mouseclickposition,
$$,
seriesLoadScripts,
parallelLoadScripts,
loadLinks,
luckysheetContainerFocus,
transformRangeToAbsolute,
openSelfModel
}