import { rowLocationByIndex, colLocationByIndex } from '../global/location'; import { countfunc } from '../global/count'; import { getBorderInfoCompute } from '../global/border'; import { isRealNum } from '../global/validate'; import { genarate, update } from '../global/format'; import { jfrefreshgrid } from '../global/refresh'; import editor from '../global/editor'; import formula from '../global/formula'; import conditionformat from './conditionformat'; import {checkProtectionLockedRangeList} from './protection'; import { selectHightlightShow } from './select'; import { getSheetIndex } from '../methods/get'; import { getObjType, replaceHtml } from '../utils/util'; import Store from '../store'; import locale from '../locale/locale'; import dayjs from 'dayjs' //选区下拉 const luckysheetDropCell = { iconHtml: '<div id="luckysheet-dropCell-icon" style="position: absolute;padding: 2px;background-color: #f1f1f1;z-index: 990;cursor: pointer;">'+ '<div id="icon_dropCell"></div>'+ '</div>', typeListHtml: '<div id="luckysheet-dropCell-typeList" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel">'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="0">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${copyCell}'+ '</div>'+ '</div>'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="1">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${sequence}'+ '</div>'+ '</div>'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="2">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${onlyFormat}'+ '</div>'+ '</div>'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="3">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${noFormat}'+ '</div>'+ '</div>'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="4">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${day}'+ '</div>'+ '</div>'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="5">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${workDay}'+ '</div>'+ '</div>'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="6">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${month}'+ '</div>'+ '</div>'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="7">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${year}'+ '</div>'+ '</div>'+ '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="8">'+ '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+ '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${chineseNumber}'+ '</div>'+ '</div>'+ '</div>', copyRange: {}, //复制范围 applyRange: {}, //应用范围 applyType: null, //0复制单元格,1填充序列,2仅填充格式,3不带格式填充,4以天数填充,5以工作日填充,6以月填充,7以年填充,8以中文小写数字序列填充 direction: null, //down-往下拖拽,right-往右拖拽,up-往上拖拽,left-往左拖拽 chnNumChar: {"零": 0, "一": 1, "二": 2, "三": 3, "四": 4, "五": 5, "六": 6, "七": 7, "八": 8, "九": 9}, chnNameValue: { "十": {value: 10, secUnit: false}, "百": {value: 100, secUnit: false}, "千": {value: 1000, secUnit: false}, "万": {value: 10000, secUnit: true}, "亿": {value: 100000000, secUnit: true} }, ChineseToNumber: function(chnStr){ let _this = this; let rtn = 0; let section = 0; let number = 0; let secUnit = false; let str = chnStr.split(""); for(let i = 0; i < str.length; i++){ let num = _this.chnNumChar[str[i]]; if(typeof num != "undefined"){ number = num; if(i == str.length - 1){ section += number; } } else{ let unit = _this.chnNameValue[str[i]].value; secUnit = _this.chnNameValue[str[i]].secUnit; if(secUnit){ section = (section + number) * unit; rtn += section; section = 0; } else{ section += (number * unit); } number = 0; } } return rtn + section; }, chnNumChar2: ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"], chnUnitSection: ["", "万", "亿", "万亿", "亿亿"], chnUnitChar: ["", "十", "百", "千"], SectionToChinese: function(section){ let _this = this; let strIns = '', chnStr = ''; let unitPos = 0; let zero = true; while(section > 0){ let v = section % 10; if(v == 0){ if(!zero){ zero = true; chnStr = _this.chnNumChar2[v] + chnStr; } } else{ zero = false; strIns = _this.chnNumChar2[v]; strIns += _this.chnUnitChar[unitPos]; chnStr = strIns + chnStr; } unitPos++; section = Math.floor(section / 10); } return chnStr; }, NumberToChinese: function(num){ let _this = this; let unitPos = 0; let strIns = '', chnStr = ''; let needZero = false; if(num == 0){ return _this.chnNumChar2[0]; } while(num > 0){ let section = num % 10000; if(needZero){ chnStr = _this.chnNumChar2[0] + chnStr; } strIns = _this.SectionToChinese(section); strIns += (section != 0) ? _this.chnUnitSection[unitPos] : _this.chnUnitSection[0]; chnStr = strIns + chnStr; needZero = (section < 1000) && (section > 0); num = Math.floor(num / 10000); unitPos++; } return chnStr; }, isChnNumber: function(txt){ let _this = this; let isChnNumber = true; if(txt.length == 1){ if(txt == "日" || (txt in _this.chnNumChar)){ isChnNumber = true; } else{ isChnNumber = false; } } else{ let str = txt.split(""); for(let i = 0; i < str.length; i++){ if(!((str[i] in _this.chnNumChar) || (str[i] in _this.chnNameValue))){ isChnNumber = false; break; } } } return isChnNumber; }, isExtendNumber: function(txt){ let reg = /0|([1-9]+[0-9]*)/g; let isExtendNumber = reg.test(txt); if(isExtendNumber){ let match = txt.match(reg); let matchTxt = match[match.length - 1]; let matchIndex = txt.lastIndexOf(matchTxt); let beforeTxt = txt.substr(0, matchIndex); let afterTxt = txt.substr(matchIndex + matchTxt.length); return [isExtendNumber, Number(matchTxt), beforeTxt, afterTxt]; } else { return [isExtendNumber] } }, isChnWeek1: function(txt){ let _this = this; let isChnWeek1; if(txt.length == 1){ if(txt == "日" || _this.ChineseToNumber(txt) < 7){ isChnWeek1 = true; } else{ isChnWeek1 = false; } } else{ isChnWeek1 = false; } return isChnWeek1; }, isChnWeek2: function(txt){ let isChnWeek2; if(txt.length == 2){ if(txt == "周一" || txt == "周二" || txt == "周三" || txt == "周四" || txt == "周五" || txt == "周六" || txt == "周日"){ isChnWeek2 = true; } else{ isChnWeek2 = false; } } else{ isChnWeek2 = false; } return isChnWeek2; }, isChnWeek3: function(txt){ let isChnWeek3; if(txt.length == 3){ if(txt == "星期一" || txt == "星期二" || txt == "星期三" || txt == "星期四" || txt == "星期五" || txt == "星期六" || txt == "星期日"){ isChnWeek3 = true; } else{ isChnWeek3 = false; } } else{ isChnWeek3 = false; } return isChnWeek3; }, createIcon: function(){ let _this = this; let copy_r = _this.copyRange["row"][1], copy_c = _this.copyRange["column"][1]; let apply_r = _this.applyRange["row"][1], apply_c = _this.applyRange["column"][1]; let row_index, col_index; if(apply_r >= copy_r && apply_c >= copy_c){ row_index = apply_r; col_index = apply_c; } else{ row_index = copy_r; col_index = copy_c; } let row = rowLocationByIndex(row_index)[1], row_pre = rowLocationByIndex(row_index)[0]; let col = colLocationByIndex(col_index)[1], col_pre = colLocationByIndex(col_index)[0]; $("#luckysheet-dropCell-icon").remove(); $("#luckysheet-cell-main").append(_this.iconHtml); $("#luckysheet-dropCell-icon").css({"left": col, "top": row}); //点击icon $("#luckysheet-dropCell-icon").mouseover(function(){ $(this).css("background-color", "#ffe8e8"); }).mouseleave(function(){ $(this).css("background-color", "#f1f1f1"); }).mousedown(function(event){ $("#luckysheet-dropCell-typeList").remove(); const _locale = locale(); const locale_dropCell = _locale.dropCell; $("body").first().append(replaceHtml(_this.typeListHtml,{ copyCell:locale_dropCell.copyCell, sequence:locale_dropCell.sequence, onlyFormat:locale_dropCell.onlyFormat, noFormat:locale_dropCell.noFormat, day:locale_dropCell.day, workDay:locale_dropCell.workDay, month:locale_dropCell.month, year:locale_dropCell.year, chineseNumber:locale_dropCell.chineseNumber, })); let typeItemHide = _this.typeItemHide(); if(!typeItemHide[0] && !typeItemHide[1] && !typeItemHide[2] && !typeItemHide[3] && !typeItemHide[4] && !typeItemHide[5] && !typeItemHide[6]){ $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=1]").hide(); $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]").hide(); $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]").hide(); $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]").hide(); $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]").hide(); $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]").hide(); } if(!typeItemHide[2]){ $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]").hide(); $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]").hide(); $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]").hide(); $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]").hide(); } if(!typeItemHide[3]){ $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]").hide(); } let left = $(this).offset().left; let top = $(this).offset().top + 25; let winH = $(window).height(), winW = $(window).width(); let menuW = $("#luckysheet-dropCell-typeList").width(), menuH = $("#luckysheet-dropCell-typeList").height(); if (left + menuW > winW) { left = left - menuW; } if (top + menuH > winH) { top = top - menuH - 38; } if (top < 0) { top = 0; } $("#luckysheet-dropCell-typeList").css({"left": left, "top": top}).show(); $("#luckysheet-dropCell-icon").mouseleave(function(){ $(this).css("backgroundColor", "#ffe8e8") }); let type = _this.applyType; $("#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type="+ type +"]").find("span").append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>'); event.stopPropagation(); }); //点击数据填充类型 $(document).off("click.dCtypeList").on("click.dCtypeList", "#luckysheet-dropCell-typeList .luckysheet-cols-menuitem", function(){ $("#luckysheet-dropCell-typeList .fa-check").remove(); $(this).find("span").append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>'); let type = $(this).attr("data-type"); _this.applyType = type; _this.update(); $("#luckysheet-dropCell-typeList").hide(); $("#luckysheet-dropCell-icon").css("backgroundColor", "#f1f1f1"); $("#luckysheet-dropCell-icon").mouseleave(function(){ $(this).css("backgroundColor", "#f1f1f1") }); countfunc(); }); }, typeItemHide: function(){ let _this = this; let copyRange = _this.copyRange; let str_r = copyRange["row"][0], end_r = copyRange["row"][1]; let str_c = copyRange["column"][0], end_c = copyRange["column"][1]; let hasNumber = false, hasExtendNumber = false, hasDate = false, hasChn = false, hasChnWeek1 = false, hasChnWeek2 = false, hasChnWeek3 = false; for(let r = str_r; r <= end_r; r++){ for(let c = str_c; c <= end_c; c++){ if(!!Store.flowdata[r][c]){ let cell = Store.flowdata[r][c]; if(getObjType(cell) == "object" && cell["v"] != null && cell["f"] == null){ if(cell["ct"] != null && cell["ct"].t == "n"){ hasNumber = true; } else if(cell["ct"] != null && cell["ct"].t == "d"){ hasDate = true; } else if(_this.isExtendNumber(cell["m"])[0]){ hasExtendNumber = true; } else if(_this.isChnNumber(cell["m"]) && cell["m"] != "日"){ hasChn = true; } else if(cell["m"] == "日"){ hasChnWeek1 = true; } else if(_this.isChnWeek2(cell["m"])){ hasChnWeek2 = true; } else if(_this.isChnWeek3(cell["m"])){ hasChnWeek3 = true; } } } } } return [hasNumber, hasExtendNumber, hasDate, hasChn, hasChnWeek1, hasChnWeek2, hasChnWeek3]; }, update: function(){ let _this = this; if(!checkProtectionLockedRangeList([_this.applyRange], Store.currentSheetIndex)){ return; } if(Store.allowEdit===false){ return; } let d = editor.deepCopyFlowData(Store.flowdata); let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]; let cfg = $.extend(true, {}, Store.config); let borderInfoCompute = getBorderInfoCompute(); let dataVerification = $.extend(true, {}, file["dataVerification"]); let direction = _this.direction; let type = _this.applyType; //复制范围 let copyRange = _this.copyRange; let copy_str_r = copyRange["row"][0], copy_end_r = copyRange["row"][1]; let copy_str_c = copyRange["column"][0], copy_end_c = copyRange["column"][1]; let copyData = _this.getCopyData(d, copy_str_r, copy_end_r, copy_str_c, copy_end_c, direction); let csLen; if(direction == "down" || direction == "up"){ csLen = copy_end_r - copy_str_r + 1; } else if(direction == "right" || direction == "left"){ csLen = copy_end_c - copy_str_c + 1; } //应用范围 let applyRange = _this.applyRange; let apply_str_r = applyRange["row"][0], apply_end_r = applyRange["row"][1]; let apply_str_c = applyRange["column"][0], apply_end_c = applyRange["column"][1]; if(direction == "down" || direction == "up"){ let asLen = apply_end_r - apply_str_r + 1; for(let i = apply_str_c; i <= apply_end_c; i++){ let copyD = copyData[i - apply_str_c]; let applyData = _this.getApplyData(copyD, csLen, asLen); if(direction == "down"){ for(let j = apply_str_r; j <= apply_end_r; j++){ let cell = applyData[j - apply_str_r]; if(cell.f != null){ let f = "=" + formula.functionCopy(cell.f, "down", j - apply_str_r + 1); let v = formula.execfunction(f, j, i); formula.execFunctionGroup(j, i, v[1], undefined, d); cell.f = v[2]; cell.v = v[1]; if(cell.spl != null){ cell.spl = v[3].data; } else{ if(isRealNum(cell.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(cell.v)){ if(cell.v == Infinity || cell.v == -Infinity){ cell.m = cell.v.toString(); } else{ if(cell.v.toString().indexOf("e") > -1){ let len = cell.v.toString().split(".")[1].split("e")[0].length; if(len > 5){ len = 5; } cell.m = cell.v.toExponential(len).toString(); } else{ let mask; if(cell.ct.fa === "##0.00"){ /* 如果是数字类型 */ mask = genarate(Math.round(cell.v * 1000000000) / 1000000000 + ".00") ; cell.m = mask[0].toString(); }else { mask = genarate(Math.round(cell.v * 1000000000) / 1000000000); cell.m = mask[0].toString(); } } } cell.ct = cell.ct || { "fa": "General", "t": "n" }; } else{ let mask = genarate(cell.v); cell.m = mask[0].toString(); cell.ct = mask[1]; } } } d[j][i] = cell; //边框 let bd_r = copy_str_r + (j - apply_str_r) % csLen; let bd_c = i; if(borderInfoCompute[bd_r + "_" + bd_c]){ let bd_obj = { "rangeType": "cell", "value": { "row_index": j, "col_index": i, "l": borderInfoCompute[bd_r + "_" + bd_c].l, "r": borderInfoCompute[bd_r + "_" + bd_c].r, "t": borderInfoCompute[bd_r + "_" + bd_c].t, "b": borderInfoCompute[bd_r + "_" + bd_c].b } } cfg["borderInfo"].push(bd_obj); } else if(borderInfoCompute[j + "_" + i]){ let bd_obj = { "rangeType": "cell", "value": { "row_index": j, "col_index": i, "l": null, "r": null, "t": null, "b": null } } cfg["borderInfo"].push(bd_obj); } //数据验证 if(dataVerification[bd_r + "_" + bd_c]){ dataVerification[j + "_" + i] = dataVerification[bd_r + "_" + bd_c]; } } } if(direction == "up"){ for(let j = apply_end_r; j >= apply_str_r; j--){ let cell = applyData[apply_end_r - j]; if(cell.f != null){ let f = "=" + formula.functionCopy(cell.f, "up", apply_end_r - j + 1); let v = formula.execfunction(f, j, i); formula.execFunctionGroup(j, i, v[1], undefined, d); cell.f = v[2]; cell.v = v[1]; if(cell.spl != null){ cell.spl = v[3].data; } else{ if(isRealNum(cell.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(cell.v)){ if(cell.v == Infinity || cell.v == -Infinity){ cell.m = cell.v.toString(); } else{ if(cell.v.toString().indexOf("e") > -1){ let len = cell.v.toString().split(".")[1].split("e")[0].length; if(len > 5){ len = 5; } cell.m = cell.v.toExponential(len).toString(); } else{ let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000); cell.m = mask[0].toString(); } } cell.ct = { "fa": "General", "t": "n" }; } else{ let mask = genarate(cell.v); cell.m = mask[0].toString(); cell.ct = mask[1]; } } } d[j][i] = cell; //边框 let bd_r = copy_end_r - (apply_end_r - j) % csLen; let bd_c = i; if(borderInfoCompute[bd_r + "_" + bd_c]){ let bd_obj = { "rangeType": "cell", "value": { "row_index": j, "col_index": i, "l": borderInfoCompute[bd_r + "_" + bd_c].l, "r": borderInfoCompute[bd_r + "_" + bd_c].r, "t": borderInfoCompute[bd_r + "_" + bd_c].t, "b": borderInfoCompute[bd_r + "_" + bd_c].b } } cfg["borderInfo"].push(bd_obj); } else if(borderInfoCompute[j + "_" + i]){ let bd_obj = { "rangeType": "cell", "value": { "row_index": j, "col_index": i, "l": null, "r": null, "t": null, "b": null } } cfg["borderInfo"].push(bd_obj); } //数据验证 if(dataVerification[bd_r + "_" + bd_c]){ dataVerification[j + "_" + i] = dataVerification[bd_r + "_" + bd_c]; } } } } } else if(direction == "right" || direction == "left"){ let asLen = apply_end_c - apply_str_c + 1; for(let i = apply_str_r; i <= apply_end_r; i++){ let copyD = copyData[i - apply_str_r]; let applyData = _this.getApplyData(copyD, csLen, asLen); if(direction == "right"){ for(let j = apply_str_c; j <= apply_end_c; j++){ let cell = applyData[j - apply_str_c]; if(cell.f != null){ let f = "=" + formula.functionCopy(cell.f, "right", j - apply_str_c + 1); let v = formula.execfunction(f, i, j); formula.execFunctionGroup(i, j, v[1], undefined, d); cell.f = v[2]; cell.v = v[1]; if(cell.spl != null){ cell.spl = v[3].data; } else{ if(isRealNum(cell.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(cell.v)){ if(cell.v == Infinity || cell.v == -Infinity){ cell.m = cell.v.toString(); } else{ if(cell.v.toString().indexOf("e") > -1){ let len = cell.v.toString().split(".")[1].split("e")[0].length; if(len > 5){ len = 5; } cell.m = cell.v.toExponential(len).toString(); } else{ let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000); cell.m = mask[0].toString(); } } cell.ct = { "fa": "General", "t": "n" }; } else{ let mask = genarate(cell.v); cell.m = mask[0].toString(); cell.ct = mask[1]; } } } d[i][j] = cell; //边框 let bd_r = i; let bd_c = copy_str_c + (j - apply_str_c) % csLen; if(borderInfoCompute[bd_r + "_" + bd_c]){ let bd_obj = { "rangeType": "cell", "value": { "row_index": i, "col_index": j, "l": borderInfoCompute[bd_r + "_" + bd_c].l, "r": borderInfoCompute[bd_r + "_" + bd_c].r, "t": borderInfoCompute[bd_r + "_" + bd_c].t, "b": borderInfoCompute[bd_r + "_" + bd_c].b } } cfg["borderInfo"].push(bd_obj); } else if(borderInfoCompute[i + "_" + j]){ let bd_obj = { "rangeType": "cell", "value": { "row_index": i, "col_index": j, "l": null, "r": null, "t": null, "b": null } } cfg["borderInfo"].push(bd_obj); } //数据验证 if(dataVerification[bd_r + "_" + bd_c]){ dataVerification[i + "_" + j] = dataVerification[bd_r + "_" + bd_c]; } } } if(direction == "left"){ for(let j = apply_end_c; j >= apply_str_c; j--){ let cell = applyData[apply_end_c - j]; if(cell.f != null){ let f = "=" + formula.functionCopy(cell.f, "left", apply_end_c - j + 1); let v = formula.execfunction(f, i, j); formula.execFunctionGroup(i, j, v[1], undefined, d); cell.f = v[2]; cell.v = v[1]; if(cell.spl != null){ cell.spl = v[3].data; } else{ if(isRealNum(cell.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(cell.v)){ if(cell.v == Infinity || cell.v == -Infinity){ cell.m = cell.v.toString(); } else{ if(cell.v.toString().indexOf("e") > -1){ let len = cell.v.toString().split(".")[1].split("e")[0].length; if(len > 5){ len = 5; } cell.m = cell.v.toExponential(len).toString(); } else{ let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000); cell.m = mask[0].toString(); } } cell.ct = { "fa": "General", "t": "n" }; } else{ let mask = genarate(cell.v); cell.m = mask[0].toString(); cell.ct = mask[1]; } } } d[i][j] = cell; //边框 let bd_r = i; let bd_c = copy_end_c - (apply_end_c - j) % csLen; if(borderInfoCompute[bd_r + "_" + bd_c]){ let bd_obj = { "rangeType": "cell", "value": { "row_index": i, "col_index": j, "l": borderInfoCompute[bd_r + "_" + bd_c].l, "r": borderInfoCompute[bd_r + "_" + bd_c].r, "t": borderInfoCompute[bd_r + "_" + bd_c].t, "b": borderInfoCompute[bd_r + "_" + bd_c].b } } cfg["borderInfo"].push(bd_obj); } else if(borderInfoCompute[i + "_" + j]){ let bd_obj = { "rangeType": "cell", "value": { "row_index": i, "col_index": j, "l": null, "r": null, "t": null, "b": null } } cfg["borderInfo"].push(bd_obj); } //数据验证 if(dataVerification[bd_r + "_" + bd_c]){ dataVerification[i + "_" + j] = dataVerification[bd_r + "_" + bd_c]; } } } } } //条件格式 let cdformat = $.extend(true, [], file["luckysheet_conditionformat_save"]); if(cdformat != null && cdformat.length > 0){ for(let i = 0; i < cdformat.length; i++){ let cdformat_cellrange = cdformat[i].cellrange; let emptyRange = []; for(let j = 0; j < cdformat_cellrange.length; j++){ let range = conditionformat.CFSplitRange(cdformat_cellrange[j], {"row": copyRange["row"], "column": copyRange["column"]}, {"row": applyRange["row"], "column": applyRange["column"]}, "operatePart"); if(range.length > 0){ emptyRange = emptyRange.concat(range); } } if(emptyRange.length > 0){ cdformat[i].cellrange.push(applyRange); } } } //刷新一次表格 let allParam = { "cfg": cfg, "cdformat": cdformat, "dataVerification": dataVerification } jfrefreshgrid(d, Store.luckysheet_select_save, allParam); selectHightlightShow(); }, getCopyData: function(d, r1, r2, c1, c2, direction){ let _this = this; let copyData = []; let a1, a2, b1, b2; if(direction == "down" || direction == "up"){ a1 = c1; a2 = c2; b1 = r1; b2 = r2; } else if(direction == "right" || direction == "left"){ a1 = r1; a2 = r2; b1 = c1; b2 = c2; } for(let a = a1; a <= a2; a++){ let obj = {}; let arrData = []; let arrIndex = []; let text = ""; let extendNumberBeforeStr = null; let extendNumberAfterStr = null; let isSameStr = true; for(let b = b1; b <= b2; b++){ //单元格 let data; if(direction == "down" || direction == "up"){ data = d[b][a]; } else if(direction == "right" || direction == "left"){ data = d[a][b]; } //单元格值类型 let str; if(!!data && !!data["v"] && data["f"] == null){ if(!!data["ct"] && data["ct"]["t"] == "n"){ str = "number"; extendNumberBeforeStr = null; extendNumberAfterStr = null; } else if(!!data["ct"] && data["ct"]["t"] == "d"){ str = "date"; extendNumberBeforeStr = null; extendNumberAfterStr = null; } else if(_this.isExtendNumber(data["m"])[0]){ str = "extendNumber"; let isExtendNumber = _this.isExtendNumber(data["m"]); if(extendNumberBeforeStr == null || extendNumberAfterStr == null){ isSameStr = true; extendNumberBeforeStr = isExtendNumber[2]; extendNumberAfterStr = isExtendNumber[3]; } else { if(isExtendNumber[2] != extendNumberBeforeStr || isExtendNumber[3] != extendNumberAfterStr){ isSameStr = false; extendNumberBeforeStr = isExtendNumber[2]; extendNumberAfterStr = isExtendNumber[3]; } else { isSameStr = true; } } } else if(_this.isChnNumber(data["m"])){ str = "chnNumber"; extendNumberBeforeStr = null; extendNumberAfterStr = null; } else if(_this.isChnWeek2(data["m"])){ str = "chnWeek2"; extendNumberBeforeStr = null; extendNumberAfterStr = null; } else if(_this.isChnWeek3(data["m"])){ str = "chnWeek3"; extendNumberBeforeStr = null; extendNumberAfterStr = null; } else{ str = "other"; extendNumberBeforeStr = null; extendNumberAfterStr = null; } } else{ str = "other"; extendNumberBeforeStr = null; extendNumberAfterStr = null; } if(str == "extendNumber"){ if(b == b1){ if(b1 == b2){ text = str; arrData.push(data); arrIndex.push(b - b1 + 1); obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } else{ text = str; arrData.push(data); arrIndex.push(b - b1 + 1); } } else if(b == b2){ if(text == str && isSameStr){ arrData.push(data); arrIndex.push(b - b1 + 1); if(text in obj){ obj[text].push({"data": arrData, "index": arrIndex}); } else{ obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } } else{ if(text in obj){ obj[text].push({"data": arrData, "index": arrIndex}); } else{ obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } text = str; arrData = []; arrData.push(data); arrIndex = []; arrIndex.push(b - b1 + 1); if(text in obj){ obj[text].push({"data": arrData, "index": arrIndex}); } else{ obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } } } else{ if(text == str && isSameStr){ arrData.push(data); arrIndex.push(b - b1 + 1); } else{ if(text in obj){ obj[text].push({"data": arrData, "index": arrIndex}); } else{ obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } text = str; arrData = []; arrData.push(data); arrIndex = []; arrIndex.push(b - b1 + 1); } } } else{ if(b == b1){ if(b1 == b2){ text = str; arrData.push(data); arrIndex.push(b - b1 + 1); obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } else{ text = str; arrData.push(data); arrIndex.push(b - b1 + 1); } } else if(b == b2){ if(text == str){ arrData.push(data); arrIndex.push(b - b1 + 1); if(text in obj){ obj[text].push({"data": arrData, "index": arrIndex}); } else{ obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } } else{ if(text in obj){ obj[text].push({"data": arrData, "index": arrIndex}); } else{ obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } text = str; arrData = []; arrData.push(data); arrIndex = []; arrIndex.push(b - b1 + 1); if(text in obj){ obj[text].push({"data": arrData, "index": arrIndex}); } else{ obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } } } else{ if(text == str){ arrData.push(data); arrIndex.push(b - b1 + 1); } else{ if(text in obj){ obj[text].push({"data": arrData, "index": arrIndex}); } else{ obj[text] = []; obj[text].push({"data": arrData, "index": arrIndex}); } text = str; arrData = []; arrData.push(data); arrIndex = []; arrIndex.push(b - b1 + 1); } } } } copyData.push(obj); } return copyData; }, getApplyData: function(copyD, csLen, asLen){ let _this = this; let applyData = []; let direction = _this.direction; let type = _this.applyType; let num = Math.floor(asLen / csLen); let rsd = asLen % csLen; //纯数字类型 let copyD_number = copyD["number"]; let applyD_number = []; if(!!copyD_number){ for(let i = 0; i < copyD_number.length; i++){ let s = _this.getLenS(copyD_number[i]["index"], rsd); let len = copyD_number[i]["index"].length * num + s; let arrData; if(type == "1" || type == "3"){ arrData = _this.getDataByType(copyD_number[i]["data"], len, direction, type, "number"); } else if(type == "2"){ arrData = _this.getDataByType(copyD_number[i]["data"], len, direction, type); } else{ arrData = _this.getDataByType(copyD_number[i]["data"], len, direction, "0"); } let arrIndex = _this.getDataIndex(csLen, asLen, copyD_number[i]["index"]); applyD_number.push({"data": arrData, "index": arrIndex}); } } //扩展数字型(即一串字符最后面的是数字) let copyD_extendNumber = copyD["extendNumber"]; let applyD_extendNumber = []; if(!!copyD_extendNumber){ for(let i = 0; i < copyD_extendNumber.length; i++){ let s = _this.getLenS(copyD_extendNumber[i]["index"], rsd); let len = copyD_extendNumber[i]["index"].length * num + s; let arrData; if(type == "1" || type == "3"){ arrData = _this.getDataByType(copyD_extendNumber[i]["data"], len, direction, type, "extendNumber"); } else if(type == "2"){ arrData = _this.getDataByType(copyD_extendNumber[i]["data"], len, direction, type); } else{ arrData = _this.getDataByType(copyD_extendNumber[i]["data"], len, direction, "0"); } let arrIndex = _this.getDataIndex(csLen, asLen, copyD_extendNumber[i]["index"]); applyD_extendNumber.push({"data": arrData, "index": arrIndex}); } } //日期类型 let copyD_date = copyD["date"]; let applyD_date = []; if(!!copyD_date){ for(let i = 0; i < copyD_date.length; i++){ let s = _this.getLenS(copyD_date[i]["index"], rsd); let len = copyD_date[i]["index"].length * num + s; let arrData; if(type == "1" || type == "3"){ arrData = _this.getDataByType(copyD_date[i]["data"], len, direction, type, "date"); } else if(type == "8"){ arrData = _this.getDataByType(copyD_date[i]["data"], len, direction, "0"); } else{ arrData = _this.getDataByType(copyD_date[i]["data"], len, direction, type); } let arrIndex = _this.getDataIndex(csLen, asLen, copyD_date[i]["index"]); applyD_date.push({"data": arrData, "index": arrIndex}); } } //中文小写数字 或 一~日 let copyD_chnNumber = copyD["chnNumber"]; let applyD_chnNumber = []; if(!!copyD_chnNumber){ for(let i = 0; i < copyD_chnNumber.length; i++){ let s = _this.getLenS(copyD_chnNumber[i]["index"], rsd); let len = copyD_chnNumber[i]["index"].length * num + s; let arrData; if(type == "1" || type == "3"){ arrData = _this.getDataByType(copyD_chnNumber[i]["data"], len, direction, type, "chnNumber"); } else if(type == "2" || type == "8"){ arrData = _this.getDataByType(copyD_chnNumber[i]["data"], len, direction, type); } else{ arrData = _this.getDataByType(copyD_chnNumber[i]["data"], len, direction, "0"); } let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnNumber[i]["index"]); applyD_chnNumber.push({"data": arrData, "index": arrIndex}); } } //周一~周日 let copyD_chnWeek2 = copyD["chnWeek2"]; let applyD_chnWeek2 = []; if(!!copyD_chnWeek2){ for(let i = 0; i < copyD_chnWeek2.length; i++){ let s = _this.getLenS(copyD_chnWeek2[i]["index"], rsd); let len = copyD_chnWeek2[i]["index"].length * num + s; let arrData; if(type == "1" || type == "3"){ arrData = _this.getDataByType(copyD_chnWeek2[i]["data"], len, direction, type, "chnWeek2"); } else if(type == "2"){ arrData = _this.getDataByType(copyD_chnWeek2[i]["data"], len, direction, type); } else{ arrData = _this.getDataByType(copyD_chnWeek2[i]["data"], len, direction, "0"); } let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnWeek2[i]["index"]); applyD_chnWeek2.push({"data": arrData, "index": arrIndex}); } } //星期一~星期日 let copyD_chnWeek3 = copyD["chnWeek3"]; let applyD_chnWeek3 = []; if(!!copyD_chnWeek3){ for(let i = 0; i < copyD_chnWeek3.length; i++){ let s = _this.getLenS(copyD_chnWeek3[i]["index"], rsd); let len = copyD_chnWeek3[i]["index"].length * num + s; let arrData; if(type == "1" || type == "3"){ arrData = _this.getDataByType(copyD_chnWeek3[i]["data"], len, direction, type, "chnWeek3"); } else if(type == "2"){ arrData = _this.getDataByType(copyD_chnWeek3[i]["data"], len, direction, type); } else{ arrData = _this.getDataByType(copyD_chnWeek3[i]["data"], len, direction, "0"); } let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnWeek3[i]["index"]); applyD_chnWeek3.push({"data": arrData, "index": arrIndex}); } } //其它 let copyD_other = copyD["other"]; let applyD_other = []; if(!!copyD_other){ for(let i = 0; i < copyD_other.length; i++){ let s = _this.getLenS(copyD_other[i]["index"], rsd); let len = copyD_other[i]["index"].length * num + s; let arrData; if(type == "2" || type == "3"){ arrData = _this.getDataByType(copyD_other[i]["data"], len, direction, type); } else{ arrData = _this.getDataByType(copyD_other[i]["data"], len, direction, "0"); } let arrIndex = _this.getDataIndex(csLen, asLen, copyD_other[i]["index"]); applyD_other.push({"data": arrData, "index": arrIndex}); } } for(let x = 1; x <= asLen; x++){ if(applyD_number.length > 0){ for(let y = 0; y < applyD_number.length; y++){ if(x in applyD_number[y]["index"]){ applyData.push(applyD_number[y]["data"][applyD_number[y]["index"][x]]); } } } if(applyD_extendNumber.length > 0){ for(let y = 0; y < applyD_extendNumber.length; y++){ if(x in applyD_extendNumber[y]["index"]){ applyData.push(applyD_extendNumber[y]["data"][applyD_extendNumber[y]["index"][x]]); } } } if(applyD_date.length > 0){ for(let y = 0; y < applyD_date.length; y++){ if(x in applyD_date[y]["index"]){ applyData.push(applyD_date[y]["data"][applyD_date[y]["index"][x]]); } } } if(applyD_chnNumber.length > 0){ for(let y = 0; y < applyD_chnNumber.length; y++){ if(x in applyD_chnNumber[y]["index"]){ applyData.push(applyD_chnNumber[y]["data"][applyD_chnNumber[y]["index"][x]]); } } } if(applyD_chnWeek2.length > 0){ for(let y = 0; y < applyD_chnWeek2.length; y++){ if(x in applyD_chnWeek2[y]["index"]){ applyData.push(applyD_chnWeek2[y]["data"][applyD_chnWeek2[y]["index"][x]]); } } } if(applyD_chnWeek3.length > 0){ for(let y = 0; y < applyD_chnWeek3.length; y++){ if(x in applyD_chnWeek3[y]["index"]){ applyData.push(applyD_chnWeek3[y]["data"][applyD_chnWeek3[y]["index"][x]]); } } } if(applyD_other.length > 0){ for(let y = 0; y < applyD_other.length; y++){ if(x in applyD_other[y]["index"]){ applyData.push(applyD_other[y]["data"][applyD_other[y]["index"][x]]); } } } } return applyData; }, getLenS: function(indexArr, rsd){ let s = 0; for(let j = 0; j < indexArr.length; j++){ if(indexArr[j] <= rsd){ s++; } else{ break; } } return s; }, getDataIndex: function(csLen, asLen, indexArr){ let obj = {}; let num = Math.floor(asLen / csLen); let rsd = asLen % csLen; let sum = 0; if(num > 0){ for(let i = 1; i <= num; i++){ for(let j = 0; j < indexArr.length; j++){ obj[indexArr[j] + (i - 1) * csLen] = sum; sum++; } } for(let a = 0; a < indexArr.length; a++){ if(indexArr[a] <= rsd){ obj[indexArr[a] + csLen * num] = sum; sum++; } else{ break; } } } else{ for(let a = 0; a < indexArr.length; a++){ if(indexArr[a] <= rsd){ obj[indexArr[a]] = sum; sum++; } else{ break; } } } return obj; }, getDataByType: function(data, len, direction, type ,dataType){ let _this = this; let applyData = []; if(type == "0"){ //复制单元格 if(direction == "up" || direction == "left"){ data.reverse(); } applyData = _this.FillCopy(data, len); } else if(type == "1"){ //填充序列 if(dataType == "number"){ //数据类型是 数字 applyData = _this.FillSeries(data, len, direction); } else if(dataType == "extendNumber"){ //扩展数字 if(data.length == 1){ let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillExtendNumber(data, len, step); } else{ let dataNumArr = []; for(let i = 0; i < data.length; i++){ let txt = data[i]["m"]; dataNumArr.push(Number(_this.isExtendNumber(txt)[1])); } if(direction == "up" || direction == "left"){ data.reverse(); dataNumArr.reverse(); } if(_this.isEqualDiff(dataNumArr)){ //等差数列,以等差为step let step = dataNumArr[1] - dataNumArr[0]; applyData = _this.FillExtendNumber(data, len, step); } else{ //不是等差数列,复制数据 applyData = _this.FillCopy(data, len); } } } else if(dataType == "date"){ //数据类型是 日期 if(data.length == 1){ //以一天为step let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillDays(data, len, step); } else{ if(direction == "up" || direction == "left"){ data.reverse(); } let judgeDate = _this.judgeDate(data); if(judgeDate[0] && judgeDate[3]){ //日一样,月差为等差数列,以月差为step let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months"); applyData = _this.FillMonths(data, len, step); } else if(!judgeDate[0] && judgeDate[2]){ //日不一样,日差为等差数列,以日差为step let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "days"); applyData = _this.FillDays(data, len, step); } else{ //其它,复制数据 applyData = _this.FillCopy(data, len); } } } else if(dataType == "chnNumber"){ //数据类型是 中文小写数字 if(data.length == 1){ if(data[0]["m"] == "日" || _this.ChineseToNumber(data[0]["m"]) < 7){ //数字小于7,以周一~周日序列填充 let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillChnWeek(data, len, step); } else{ //数字大于7,以中文小写数字序列填充 let step if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillChnNumber(data, len, step); } } else{ let hasweek = false; for(let i = 0; i < data.length; i++){ if(data[i]["m"] == "日"){ hasweek = true; break; } } let dataNumArr = []; let weekIndex = 0; for(let i = 0; i < data.length; i++){ if(data[i]["m"] == "日"){ if(i == 0){ dataNumArr.push(0); } else{ weekIndex++; dataNumArr.push(weekIndex * 7); } } else if(hasweek && _this.ChineseToNumber(data[i]["m"]) > 0 && _this.ChineseToNumber(data[i]["m"]) < 7){ dataNumArr.push(_this.ChineseToNumber(data[i]["m"]) + weekIndex * 7); } else{ dataNumArr.push(_this.ChineseToNumber(data[i]["m"])); } } if(direction == "up" || direction == "left"){ data.reverse(); dataNumArr.reverse(); } if(_this.isEqualDiff(dataNumArr)){ if(hasweek || (dataNumArr[dataNumArr.length - 1] < 6 && dataNumArr[0] > 0) || (dataNumArr[0] < 6 && dataNumArr[dataNumArr.length - 1] > 0)){ //以周一~周日序列填充 let step = dataNumArr[1] - dataNumArr[0]; applyData = _this.FillChnWeek(data, len, step); } else{ //以中文小写数字序列填充 let step = dataNumArr[1] - dataNumArr[0]; applyData = _this.FillChnNumber(data, len, step); } } else{ //不是等差数列,复制数据 applyData = _this.FillCopy(data, len); } } } else if(dataType == "chnWeek2"){ //周一~周日 if(data.length == 1){ let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillChnWeek2(data, len, step); } else{ let dataNumArr = []; let weekIndex = 0; for(let i = 0; i < data.length; i++){ let lastTxt = data[i]["m"].substr(data[i]["m"].length - 1, 1); if(data[i]["m"] == "周日"){ if(i == 0){ dataNumArr.push(0); } else{ weekIndex++; dataNumArr.push(weekIndex * 7); } } else{ dataNumArr.push(_this.ChineseToNumber(lastTxt) + weekIndex * 7); } } if(direction == "up" || direction == "left"){ data.reverse(); dataNumArr.reverse(); } if(_this.isEqualDiff(dataNumArr)){ //等差数列,以等差为step let step = dataNumArr[1] - dataNumArr[0]; applyData = _this.FillChnWeek2(data, len, step); } else{ //不是等差数列,复制数据 applyData = _this.FillCopy(data, len); } } } else if(dataType == "chnWeek3"){ //星期一~星期日 if(data.length == 1){ let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillChnWeek3(data, len, step); } else{ let dataNumArr = []; let weekIndex = 0; for(let i = 0; i < data.length; i++){ let lastTxt = data[i]["m"].substr(data[i]["m"].length - 1, 1); if(data[i]["m"] == "星期日"){ if(i == 0){ dataNumArr.push(0); } else{ weekIndex++; dataNumArr.push(weekIndex * 7); } } else{ dataNumArr.push(_this.ChineseToNumber(lastTxt) + weekIndex * 7); } } if(direction == "up" || direction == "left"){ data.reverse(); dataNumArr.reverse(); } if(_this.isEqualDiff(dataNumArr)){ //等差数列,以等差为step let step = dataNumArr[1] - dataNumArr[0]; applyData = _this.FillChnWeek3(data, len, step); } else{ //不是等差数列,复制数据 applyData = _this.FillCopy(data, len); } } } else{ //数据类型是 其它 if(direction == "up" || direction == "left"){ data.reverse(); } applyData = _this.FillCopy(data, len); } } else if(type == "2"){ //仅填充格式 if(direction == "up" || direction == "left"){ data.reverse(); } applyData = _this.FillOnlyFormat(data, len); } else if(type == "3"){ //不带格式填充 let dataArr = _this.getDataByType(data, len, direction, "1" ,dataType); applyData = _this.FillWithoutFormat(dataArr); } else if(type == "4"){ //以天数填充 if(data.length == 1){ //以一天为step let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillDays(data, len, step); } else if(data.length == 2){ //以日差为step if(direction == "up" || direction == "left"){ data.reverse(); } let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "days"); applyData = _this.FillDays(data, len, step); } else{ if(direction == "up" || direction == "left"){ data.reverse(); } let judgeDate = _this.judgeDate(data); if(judgeDate[0] && judgeDate[3]){ //日一样,且月差为等差数列,以月差为step let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months"); applyData = _this.FillMonths(data, len, step); } else if(!judgeDate[0] && judgeDate[2]){ //日不一样,且日差为等差数列,以日差为step let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "days"); applyData = _this.FillDays(data, len, step); } else{ //日差不是等差数列,复制数据 applyData = _this.FillCopy(data, len); } } } else if(type == "5"){ //以工作日填充 if(data.length == 1){ //以一天为step(若那天为休息日,则跳过) let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } let newLen = Math.round(len * 1.5); for(let i = 1; i <= newLen; i++){ let d = $.extend(true, {}, data[0]); let day = dayjs(d["m"]).add(i, "days").day(); if(day == 0 || day == 6){ continue; } let date = dayjs(d["m"]).add(step * i, "days").format("YYYY-MM-DD"); d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); if(applyData.length == len){ break; } } } else if(data.length == 2){ if(dayjs(data[1]["m"]).date() == dayjs(data[0]["m"]).date() && dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months") != 0){ //日一样,且月差大于一月,以月差为step(若那天为休息日,则向前取最近的工作日) if(direction == "up" || direction == "left"){ data.reverse(); } let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months"); for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let day = dayjs(data[data.length - 1]).add(step * i, "months").day(), date; if(day == 0){ date = dayjs(data[data.length - 1]).add(step * i, "months").subtract(2, "days").format("YYYY-MM-DD"); } else if(day == 6){ date = dayjs(data[data.length - 1]).add(step * i, "months").subtract(1, "days").format("YYYY-MM-DD"); } else{ date = dayjs(data[data.length - 1]).add(step * i, "months").format("YYYY-MM-DD"); } d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } else{ //日不一样 if(Math.abs(dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]))) > 7){ //若日差大于7天,以一月为step(若那天是休息日,则向前取最近的工作日) let step_month; if(direction == "down" || direction == "right"){ step_month = 1; } else if(direction == "up" || direction == "left"){ step_month = -1; data.reverse(); } let step; //以数组第一个为对比 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = Math.ceil(i / data.length); if(index == 0){ step = dayjs(d["m"]).add(step_month * num, "months").diff(dayjs(d["m"]), "days"); } let day = dayjs(d["m"]).add(step, "days").day(), date; if(day == 0){ date = dayjs(d["m"]).add(step, "days").subtract(2, "days").format("YYYY-MM-DD"); } else if(day == 6){ date = dayjs(d["m"]).add(step, "days").subtract(1, "days").format("YYYY-MM-DD"); } else{ date = dayjs(d["m"]).add(step, "days").format("YYYY-MM-DD"); } d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } else{ //若日差小于等于7天,以7天为step(若那天是休息日,则向前取最近的工作日) let step_day; if(direction == "down" || direction == "right"){ step_day = 7; } else if(direction == "up" || direction == "left"){ step_day = -7; data.reverse(); } let step; //以数组第一个为对比 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = Math.ceil(i / data.length); if(index == 0){ step = dayjs(d["m"]).add(step_day * num, "days").diff(dayjs(d["m"]), "days"); } let day = dayjs(d["m"]).add(step, "days").day(), date; if(day == 0){ date = dayjs(d["m"]).add(step, "days").subtract(2, "days").format("YYYY-MM-DD"); } else if(day == 6){ date = dayjs(d["m"]).add(step, "days").subtract(1, "days").format("YYYY-MM-DD"); } else{ date = dayjs(d["m"]).add(step, "days").format("YYYY-MM-DD"); } d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } } } else{ let judgeDate = _this.judgeDate(data); if(judgeDate[0] && judgeDate[3]){ //日一样,且月差为等差数列,以月差为step(若那天为休息日,则向前取最近的工作日) if(direction == "up" || direction == "left"){ data.reverse(); } let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months"); for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let day = dayjs(data[data.length - 1]["m"]).add(step * i, "months").day(), date; if(day == 0){ date = dayjs(data[data.length - 1]["m"]).add(step * i, "months").subtract(2, "days").format("YYYY-MM-DD"); } else if(day == 6){ date = dayjs(data[data.length - 1]["m"]).add(step * i, "months").subtract(1, "days").format("YYYY-MM-DD"); } else{ date = dayjs(data[data.length - 1]["m"]).add(step * i, "months").format("YYYY-MM-DD"); } d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } else if(!judgeDate[0] && judgeDate[2]){ //日不一样,且日差为等差数列 if(Math.abs(dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]))) > 7){ //若日差大于7天,以一月为step(若那天是休息日,则向前取最近的工作日) let step_month if(direction == "down" || direction == "right"){ step_month = 1; } else if(direction == "up" || direction == "left"){ step_month = -1; data.reverse(); } let step; //以数组第一个为对比 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = Math.ceil(i / data.length); if(index == 0){ step = dayjs(d["m"]).add(step_month * num, "months").diff(dayjs(d["m"]), "days"); } let day = dayjs(d["m"]).add(step, "days").day(), date; if(day == 0){ date = dayjs(d["m"]).add(step, "days").subtract(2, "days").format("YYYY-MM-DD"); } else if(day == 6){ date = dayjs(d["m"]).add(step, "days").subtract(1, "days").format("YYYY-MM-DD"); } else{ date = dayjs(d["m"]).add(step, "days").format("YYYY-MM-DD"); } d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } else{ //若日差小于等于7天,以7天为step(若那天是休息日,则向前取最近的工作日) let step_day; if(direction == "down" || direction == "right"){ step_day = 7; } else if(direction == "up" || direction == "left"){ step_day = -7; data.reverse(); } let step; //以数组第一个为对比 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = Math.ceil(i / data.length); if(index == 0){ step = dayjs(d["m"]).add(step_day * num, "days").diff(dayjs(d["m"]), "days"); } let day = dayjs(d["m"]).add(step, "days").day(), date; if(day == 0){ date = dayjs(d["m"]).add(step, "days").subtract(2, "days").format("YYYY-MM-DD"); } else if(day == 6){ date = dayjs(d["m"]).add(step, "days").subtract(1, "days").format("YYYY-MM-DD"); } else{ date = dayjs(d["m"]).add(step, "days").format("YYYY-MM-DD"); } d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } } else{ //日差不是等差数列,复制数据 if(direction == "up" || direction == "left"){ data.reverse(); } applyData = _this.FillCopy(data, len); } } } else if(type == "6"){ //以月填充 if(data.length == 1){ //以一月为step let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillMonths(data, len, step); } else if(data.length == 2){ if(dayjs(data[1]["m"]).date() == dayjs(data[0]["m"]).date() && dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months") != 0){ //日一样,且月差大于一月,以月差为step if(direction == "up" || direction == "left"){ data.reverse(); } let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months"); applyData = _this.FillMonths(data, len, step); } else{ //以一月为step let step_month; if(direction == "down" || direction == "right"){ step_month = 1; } else if(direction == "up" || direction == "left"){ step_month = -1; data.reverse(); } let step; //以数组第一个为对比 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = Math.ceil(i / data.length); if(index == 0){ step = dayjs(d["m"]).add(step_month * num, "months").diff(dayjs(d["m"]), "days"); } let date = dayjs(d["m"]).add(step, "days").format("YYYY-MM-DD"); d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } } else{ let judgeDate = _this.judgeDate(data); if(judgeDate[0] && judgeDate[3]){ //日一样,且月差为等差数列,以月差为step if(direction == "up" || direction == "left"){ data.reverse(); } let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months"); applyData = _this.FillMonths(data, len, step); } else if(!judgeDate[0] && judgeDate[2]){ //日不一样,且日差为等差数列,以一月为step let step_month; if(direction == "down" || direction == "right"){ step_month = 1; } else if(direction == "up" || direction == "left"){ step_month = -1; data.reverse(); } let step; //以数组第一个为对比 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = Math.ceil(i / data.length); if(index == 0){ step = dayjs(d["m"]).add(step_month * num, "months").diff(dayjs(d["m"]), "days"); } let date = dayjs(d["m"]).add(step, "days").format("YYYY-MM-DD"); d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } else{ //日差不是等差数列,复制数据 if(direction == "up" || direction == "left"){ data.reverse(); } applyData = _this.FillCopy(data, len); } } } else if(type == "7"){ //以年填充 if(data.length == 1){ //以一年为step let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillYears(data, len, step); } else if(data.length == 2){ if(dayjs(data[1]["m"]).date() == dayjs(data[0]["m"]).date() && dayjs(data[1]["m"]).month() == dayjs(data[0]["m"]).month() && dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "years") != 0){ //日月一样,且年差大于一年,以年差为step if(direction == "up" || direction == "left"){ data.reverse(); } let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "years"); applyData = _this.FillYears(data, len, step); } else{ //以一年为step let step_year; if(direction == "down" || direction == "right"){ step_year = 1; } else if(direction == "up" || direction == "left"){ step_year = -1; data.reverse(); } let step; //以数组第一个为对比 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = Math.ceil(i / data.length); if(index == 0){ step = dayjs(d["m"]).add(step_year * num, "years").diff(dayjs(d["m"]), "days"); } let date = dayjs(d["m"]).add(step, "days").format("YYYY-MM-DD"); d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } } else{ let judgeDate = _this.judgeDate(data); if(judgeDate[0] && judgeDate[1] && judgeDate[4]){ //日月一样,且年差为等差数列,以年差为step if(direction == "up" || direction == "left"){ data.reverse(); } let step = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "years"); applyData = _this.FillYears(data, len, step); } else if((judgeDate[0] && judgeDate[3]) || judgeDate[2]){ //日一样且月差为等差数列,或天差为等差数列,以一年为step let step_year; if(direction == "down" || direction == "right"){ step_year = 1; } else if(direction == "up" || direction == "left"){ step_year = -1; data.reverse(); } let step; //以数组第一个为对比 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = Math.ceil(i / data.length); if(index == 0){ step = dayjs(d["m"]).add(step_year * num, "years").diff(dayjs(d["m"]), "days"); } let date = dayjs(d["m"]).add(step, "days").format("YYYY-MM-DD"); d["m"] = date; d["v"] = genarate(date)[2]; applyData.push(d); } } else{ //日差不是等差数列,复制数据 if(direction == "up" || direction == "left"){ data.reverse(); } applyData = _this.FillCopy(data, len); } } } else if(type == "8"){ //以中文小写数字序列填充 if(data.length == 1){ let step; if(direction == "down" || direction == "right"){ step = 1; } else if(direction == "up" || direction == "left"){ step = -1; } applyData = _this.FillChnNumber(data, len, step); } else{ let dataNumArr = []; for(let i = 0; i < data.length; i++){ dataNumArr.push(_this.ChineseToNumber(data[i]["m"])); } if(direction == "up" || direction == "left"){ data.reverse(); dataNumArr.reverse(); } if(_this.isEqualDiff(dataNumArr)){ let step = dataNumArr[1] - dataNumArr[0]; applyData = _this.FillChnNumber(data, len, step); } else{ //不是等差数列,复制数据 applyData = _this.FillCopy(data, len); } } } return applyData; }, FillCopy: function(data, len){ let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); applyData.push(d); } return applyData; }, FillSeries: function(data, len, direction){ let _this = this; let applyData = []; let dataNumArr = []; for(let j = 0; j < data.length; j++){ dataNumArr.push(Number(data[j]["v"])); } if(data.length > 2 && _this.isEqualRatio(dataNumArr)){ //等比数列 for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num; if(direction == "down" || direction == "right"){ num = Number(data[data.length -1]["v"]) * Math.pow(Number(data[1]["v"]) / Number(data[0]["v"]), i); } else if(direction == "up" || direction == "left"){ num = Number(data[0]["v"]) / Math.pow(Number(data[1]["v"]) / Number(data[0]["v"]), i); } d["v"] = num; d["m"] = update(d["ct"]["fa"], num); applyData.push(d); } } else{ //线性数列 let xArr = _this.getXArr(data.length); for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let y; if(direction == "down" || direction == "right"){ y = _this.forecast(data.length + i, dataNumArr, xArr); } else if(direction == "up" || direction == "left"){ y = _this.forecast(1 - i, dataNumArr, xArr); } d["v"] = y; d["m"] = update(d["ct"]["fa"], y); applyData.push(d); } } return applyData; }, FillExtendNumber: function(data, len, step){ let _this = this; let applyData = []; let reg = /0|([1-9]+[0-9]*)/g; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let last = data[data.length - 1]["m"]; let match = last.match(reg) let lastTxt = match[match.length -1]; let num = Math.abs(Number(lastTxt) + step * i); let lastIndex = last.lastIndexOf(lastTxt); let valueTxt = last.substr(0, lastIndex) + num.toString() + last.substr(lastIndex + lastTxt.length); d["v"] = valueTxt; d["m"] = valueTxt; applyData.push(d); } return applyData; }, FillOnlyFormat: function(data, len){ let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); delete d["f"]; delete d["m"]; delete d["v"]; applyData.push(d); } return applyData; }, FillWithoutFormat: function(dataArr){ let applyData = []; for(let i = 0; i < dataArr.length; i++){ let d = $.extend(true, {}, dataArr[i]); let obj; if(d["f"] == null){ obj = {"m": d["v"].toString(), "v": d["v"]}; } else{ obj = {"f": d["f"], "m": d["v"].toString(), "v": d["v"]}; } applyData.push(obj); } return applyData; }, FillDays: function(data, len, step){ let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let date = update("yyyy-MM-dd", d["v"]); date = dayjs(date).add(step * i, "days").format("YYYY-MM-DD"); d["v"] = genarate(date)[2]; d["m"] = update(d["ct"]["fa"], d["v"]); applyData.push(d); } return applyData; }, FillMonths: function(data, len, step){ let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let date = update("yyyy-MM-dd", d["v"]); date = dayjs(date).add(step * i, "months").format("YYYY-MM-DD"); d["v"] = genarate(date)[2]; d["m"] = update(d["ct"]["fa"], d["v"]); applyData.push(d); } return applyData; }, FillYears: function(data, len, step){ let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let date = update("yyyy-MM-dd", d["v"]); date = dayjs(date).add(step * i, "years").format("YYYY-MM-DD"); d["v"] = genarate(date)[2]; d["m"] = update(d["ct"]["fa"], d["v"]); applyData.push(d); } return applyData; }, FillChnWeek: function(data, len, step){ let _this = this; let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num; if(data[data.length - 1]["m"] == "日"){ num = 7 + step * i; } else{ num = _this.ChineseToNumber(data[data.length - 1]["m"]) + step * i; } if(num < 0){ num = Math.ceil(Math.abs(num) / 7) * 7 + num; } let rsd = num % 7; if(rsd == 0){ d["m"] = "日"; d["v"] = "日"; } else if(rsd == 1){ d["m"] = "一"; d["v"] = "一"; } else if(rsd == 2){ d["m"] = "二"; d["v"] = "二"; } else if(rsd == 3){ d["m"] = "三"; d["v"] = "三"; } else if(rsd == 4){ d["m"] = "四"; d["v"] = "四"; } else if(rsd == 5){ d["m"] = "五"; d["v"] = "五"; } else if(rsd == 6){ d["m"] = "六"; d["v"] = "六"; } applyData.push(d); } return applyData; }, FillChnWeek2: function(data, len, step){ let _this = this; let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num; if(data[data.length - 1]["m"] == "周日"){ num = 7 + step * i; } else{ let last = data[data.length - 1]["m"]; let txt = last.substr(last.length - 1, 1); num = _this.ChineseToNumber(txt) + step * i; } if(num < 0){ num = Math.ceil(Math.abs(num) / 7) * 7 + num; } let rsd = num % 7; if(rsd == 0){ d["m"] = "周日"; d["v"] = "周日"; } else if(rsd == 1){ d["m"] = "周一"; d["v"] = "周一"; } else if(rsd == 2){ d["m"] = "周二"; d["v"] = "周二"; } else if(rsd == 3){ d["m"] = "周三"; d["v"] = "周三"; } else if(rsd == 4){ d["m"] = "周四"; d["v"] = "周四"; } else if(rsd == 5){ d["m"] = "周五"; d["v"] = "周五"; } else if(rsd == 6){ d["m"] = "周六"; d["v"] = "周六"; } applyData.push(d); } return applyData; }, FillChnWeek3: function(data, len, step){ let _this = this; let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num; if(data[data.length - 1]["m"] == "星期日"){ num = 7 + step * i; } else{ let last = data[data.length - 1]["m"]; let txt = last.substr(last.length - 1, 1); num = _this.ChineseToNumber(txt) + step * i; } if(num < 0){ num = Math.ceil(Math.abs(num) / 7) * 7 + num; } let rsd = num % 7; if(rsd == 0){ d["m"] = "星期日"; d["v"] = "星期日"; } else if(rsd == 1){ d["m"] = "星期一"; d["v"] = "星期一"; } else if(rsd == 2){ d["m"] = "星期二"; d["v"] = "星期二"; } else if(rsd == 3){ d["m"] = "星期三"; d["v"] = "星期三"; } else if(rsd == 4){ d["m"] = "星期四"; d["v"] = "星期四"; } else if(rsd == 5){ d["m"] = "星期五"; d["v"] = "星期五"; } else if(rsd == 6){ d["m"] = "星期六"; d["v"] = "星期六"; } applyData.push(d); } return applyData; }, FillChnNumber: function(data, len, step){ let _this = this; let applyData = []; for(let i = 1; i <= len; i++){ let index = (i - 1) % data.length; let d = $.extend(true, {}, data[index]); let num = _this.ChineseToNumber(data[data.length - 1]["m"]) + step * i, txt; if(num <= 0){ txt = "零"; } else{ txt = _this.NumberToChinese(num); } d["v"] = txt; d["m"] = txt.toString(); applyData.push(d); } return applyData; }, isEqualDiff: function(arr){ let diff = true; let step = arr[1] - arr[0]; for(let i = 1; i < arr.length; i++){ if(arr[i] - arr[i - 1] != step){ diff = false; break; } } return diff; }, isEqualRatio: function(arr){ let ratio = true; let step = arr[1] / arr[0]; for(let i = 1; i < arr.length; i++){ if(arr[i] / arr[i - 1] != step){ ratio = false; break; } } return ratio; }, getXArr: function(len){ let xArr = []; for(let i = 1; i <= len; i++){ xArr.push(i); } return xArr; }, forecast: function(x, yArr, xArr){ function getAverage(arr){ let sum = 0; for(let i = 0; i < arr.length; i++){ sum += arr[i]; } return sum / arr.length; } let ax = getAverage(xArr); //x数组 平均值 let ay = getAverage(yArr); //y数组 平均值 let sum_d = 0, sum_n = 0; for(let j = 0; j < xArr.length; j++){ //分母和 sum_d += (xArr[j] - ax)*(yArr[j] - ay); //分子和 sum_n += (xArr[j] - ax)*(xArr[j] - ax); } let b; if(sum_n == 0){ b = 1; } else{ b = sum_d / sum_n; } let a = ay - b * ax; return Math.round((a + b * x) * 100000) / 100000; }, judgeDate: function(data){ let isSameDay = true, isSameMonth = true, isEqualDiffDays = true, isEqualDiffMonths = true, isEqualDiffYears = true; let sameDay = dayjs(data[0]["m"]).date(), sameMonth = dayjs(data[0]["m"]).month(); let equalDiffDays = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "days"); let equalDiffMonths = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "months"); let equalDiffYears = dayjs(data[1]["m"]).diff(dayjs(data[0]["m"]), "years"); for(let i = 1; i < data.length; i++){ //日是否一样 if(dayjs(data[i]["m"]).date() != sameDay){ isSameDay = false; } //月是否一样 if(dayjs(data[i]["m"]).month() != sameMonth){ isSameMonth = false; } //日差是否是 等差数列 if(dayjs(data[i]["m"]).diff(dayjs(data[i - 1]["m"]), "days") != equalDiffDays){ isEqualDiffDays = false; } //月差是否是 等差数列 if(dayjs(data[i]["m"]).diff(dayjs(data[i - 1]["m"]), "months") != equalDiffMonths){ isEqualDiffMonths = false; } //年差是否是 等差数列 if(dayjs(data[i]["m"]).diff(dayjs(data[i - 1]["m"]), "years") != equalDiffYears){ isEqualDiffYears = false; } } if(equalDiffDays == 0){ isEqualDiffDays = false; } if(equalDiffMonths == 0){ isEqualDiffMonths = false; } if(equalDiffYears == 0){ isEqualDiffYears = false; } return [isSameDay, isSameMonth, isEqualDiffDays, isEqualDiffMonths, isEqualDiffYears]; } } export default luckysheetDropCell;