import { getSheetIndex, getRangetxt } from '../methods/get'; import { replaceHtml, getObjType, chatatABC } from '../utils/util'; import formula from '../global/formula'; import { isRealNull, isEditMode } from '../global/validate'; import tooltip from '../global/tooltip'; import { luckysheetrefreshgrid } from '../global/refresh'; import { getcellvalue } from '../global/getdata'; import { genarate } from '../global/format'; import { modelHTML, luckysheet_CFiconsImg } from './constant'; import server from './server'; import { selectionCopyShow } from './select'; import sheetmanage from './sheetmanage'; import locale from '../locale/locale'; import {checkProtectionFormatCells} from './protection'; import Store from '../store'; import dayjs from 'dayjs' //条件格式 const conditionformat = { fileClone: [], editorRule: null, //{"sheetIndex": sheetIndex,"itemIndex": itemIndex,"data": luckysheetfile[sheetIndex].luckysheet_conditionformat_save[itemIndex]} ruleTypeHtml: function(){ const conditionformat_Text = locale().conditionformat; return `<div class="ruleTypeBox"> <div class="ruleTypeItem"> <span class="icon iconfont luckysheet-iconfont-youjiantou"></span> <span>${conditionformat_Text.ruleTypeItem1}</span> </div> <div class="ruleTypeItem"> <span class="icon iconfont luckysheet-iconfont-youjiantou"></span> <span>${conditionformat_Text.ruleTypeItem2}</span> </div> <div class="ruleTypeItem"> <span class="icon iconfont luckysheet-iconfont-youjiantou"></span> <span>${conditionformat_Text.ruleTypeItem3}</span> </div> <div class="ruleTypeItem"> <span class="icon iconfont luckysheet-iconfont-youjiantou"></span> <span>${conditionformat_Text.ruleTypeItem4}</span> </div> <div class="ruleTypeItem"> <span class="icon iconfont luckysheet-iconfont-youjiantou"></span> <span>${conditionformat_Text.ruleTypeItem5}</span> </div> <div class="ruleTypeItem"> <span class="icon iconfont luckysheet-iconfont-youjiantou"></span> <span>${conditionformat_Text.ruleTypeItem6}</span> </div> </div>`; }, textCellColorHtml: function(){ const conditionformat_Text = locale().conditionformat; return `<div id="textCellColor"> <div class="colorbox"> <input id="checkTextColor" type="checkbox" checked="checked"> <label for="checkTextColor">${conditionformat_Text.textColor}:</label> <input id="textcolorshow" data-tips="${conditionformat_Text.textColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#9c0006" style="display: none;"> </div> <div class="colorbox"> <input id="checkCellColor" type="checkbox" checked="checked"> <label for="checkCellColor">${conditionformat_Text.cellColor}:</label> <input id="cellcolorshow" data-tips="${conditionformat_Text.cellColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#ffc7ce" style="display: none;"> </div> </div>`; }, selectRange: [], selectStatus: false, dataBarList: [ { "format": ["#638ec6", "#ffffff"] }, //蓝-白渐变 数据条 { "format": ["#63c384", "#ffffff"] }, //绿-白渐变 数据条 { "format": ["#ff555a", "#ffffff"] }, //红-白渐变 数据条 { "format": ["#ffb628", "#ffffff"] }, //橙-白渐变 数据条 { "format": ["#008aef", "#ffffff"] }, //浅蓝-白渐变 数据条 { "format": ["#d6007b", "#ffffff"] }, //紫-白渐变 数据条 { "format": ["#638ec6"] }, //蓝色 数据条 { "format": ["#63c384"] }, //绿色 数据条 { "format": ["#ff555a"] }, //红色 数据条 { "format": ["#ffb628"] }, //橙色 数据条 { "format": ["#008aef"] }, //浅蓝色 数据条 { "format": ["#d6007b"] } //紫色 数据条 ], colorGradationList: [ { "format": ["rgb(99, 190, 123)", "rgb(255, 235, 132)", "rgb(248, 105, 107)"] }, //绿-黄-红色阶 { "format": ["rgb(248, 105, 107)", "rgb(255, 235, 132)", "rgb(99, 190, 123)"] }, //红-黄-绿色阶 { "format": ["rgb(99, 190, 123)", "rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, //绿-白-红色阶 { "format": ["rgb(248, 105, 107)", "rgb(252, 252, 255)", "rgb(99, 190, 123)"] }, //红-白-绿色阶 { "format": ["rgb(90, 138, 198)", "rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, //蓝-白-红色阶 { "format": ["rgb(248, 105, 107)", "rgb(252, 252, 255)", "rgb(90, 138, 198)"] }, //红-白-蓝色阶 { "format": ["rgb(252, 252, 255)", "rgb(248, 105, 107)"] }, //白-红色阶 { "format": ["rgb(248, 105, 107)", "rgb(252, 252, 255)"] }, //红-白色阶 { "format": ["rgb(99, 190, 123)", "rgb(252, 252, 255)"] }, //绿-白色阶 { "format": ["rgb(252, 252, 255)", "rgb(99, 190, 123)"] }, //白-绿色阶 { "format": ["rgb(99, 190, 123)", "rgb(255, 235, 132)"] }, //绿-黄色阶 { "format": ["rgb(255, 235, 132)", "rgb(99, 190, 123)"] } //黄-绿色阶 ], init: function(){ let _this = this; const conditionformat_Text = locale().conditionformat; // 管理规则 $(document).off("change.CFchooseSheet").on("change.CFchooseSheet", "#luckysheet-administerRule-dialog .chooseSheet", function(){ let index = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); _this.getConditionRuleList(index); }); $(document).off("click.CFadministerRuleItem").on("click.CFadministerRuleItem", "#luckysheet-administerRule-dialog .ruleList .listBox .item", function(){ $(this).addClass("on").siblings().removeClass("on"); }); $(document).off("click.CFadministerRuleConfirm").on("click.CFadministerRuleConfirm", "#luckysheet-administerRule-dialog-confirm", function(){ if(!checkProtectionFormatCells(Store.currentSheetIndex)){ return; } //保存之前的规则 let fileH = $.extend(true, [], Store.luckysheetfile); let historyRules = _this.getHistoryRules(fileH); //保存当前的规则 let fileClone = $.extend(true, [], _this.fileClone); for(let c = 0; c < fileClone.length; c++){ let sheetIndex = fileClone[c]["index"]; Store.luckysheetfile[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"] = fileClone[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"]; } let fileC = $.extend(true, [], Store.luckysheetfile); let currentRules = _this.getCurrentRules(fileC); //刷新一次表格 _this.ref(historyRules, currentRules); //隐藏一些dom $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-administerRule-dialog").hide(); //发送给后台 if(server.allowUpdate){ let files = $.extend(true, [], Store.luckysheetfile); for(let i = 0; i < files.length; i++){ server.saveParam("all", files[i]["index"], files[i]["luckysheet_conditionformat_save"], { "k": "luckysheet_conditionformat_save" }); } } }); $(document).off("click.CFadministerRuleClose").on("click.CFadministerRuleClose", "#luckysheet-administerRule-dialog-close", function(){ $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-administerRule-dialog").hide(); _this.fileClone = []; }); $(document).off("click.CFadministerRuleFa").on("click.CFadministerRuleFa", "#luckysheet-administerRule-dialog .item .fa-table", function(){ $(this).parents("#luckysheet-administerRule-dialog").hide(); let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet select option:selected").val(); if(sheetIndex != Store.currentSheetIndex){ sheetmanage.changeSheetExec(sheetIndex); } let txt = $(this).siblings("input").val().trim(); let dataItem = $(this).parents(".item").attr("data-item"); _this.multiRangeDialog(dataItem, txt); _this.selectRange = []; let range = _this.getRangeByTxt(txt); if(range.length > 0){ for(let s = 0; s < range.length; s++){ let r1 = range[s].row[0], r2 = range[s].row[1]; let c1 = range[s].column[0], c2 = range[s].column[1]; let row = Store.visibledatarow[r2], row_pre = r1 - 1 == -1 ? 0 : Store.visibledatarow[r1 - 1]; let col = Store.visibledatacolumn[c2], col_pre = c1 - 1 == -1 ? 0 : Store.visibledatacolumn[c1 - 1]; _this.selectRange.push({ "left": col_pre, "width": col - col_pre - 1, "top": row_pre, "height": row - row_pre - 1, "left_move": col_pre, "width_move": col - col_pre - 1, "top_move": row_pre, "height_move": row - row_pre - 1, "row": [r1, r2], "column": [c1, c2], "row_focus": r1, "column_focus": c1 }); } } selectionCopyShow(_this.selectRange); }); $(document).off("click.CFmultiRangeConfirm").on("click.CFmultiRangeConfirm", "#luckysheet-multiRange-dialog-confirm", function(){ $(this).parents("#luckysheet-multiRange-dialog").hide(); let dataItem = $(this).attr("data-item"); let v = $(this).parents("#luckysheet-multiRange-dialog").find("input").val(); $("#luckysheet-administerRule-dialog .item[data-item="+dataItem+"] input").val(v); let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); _this.fileClone[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"][dataItem].cellrange = _this.getRangeByTxt(v); $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-administerRule-dialog").show(); let range = []; selectionCopyShow(range); }); $(document).off("click.CFmultiRangeClose").on("click.CFmultiRangeClose", "#luckysheet-multiRange-dialog-close", function(){ $(this).parents("#luckysheet-multiRange-dialog").hide(); $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-administerRule-dialog").show(); $("#luckysheet-formula-functionrange-select").hide(); $("#luckysheet-row-count-show").hide(); $("#luckysheet-column-count-show").hide(); let range = []; selectionCopyShow(range); }); // 新建规则 $(document).off("click.CFnewConditionRule").on("click.CFnewConditionRule", "#newConditionRule", function(){ let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); if(!checkProtectionFormatCells(sheetIndex)){ return; } if(Store.luckysheet_select_save.length == 0){ if(isEditMode()){ alert(conditionformat_Text.pleaseSelectRange); } else{ tooltip.info(conditionformat_Text.pleaseSelectRange, ""); } return; } _this.newConditionRuleDialog(1); }); $(document).off("click.CFnewConditionRuleConfirm").on("click.CFnewConditionRuleConfirm", "#luckysheet-newConditionRule-dialog-confirm", function(){ if(!checkProtectionFormatCells(Store.currentSheetIndex)){ return; } let index = $("#luckysheet-newConditionRule-dialog .ruleTypeItem.on").index(); let type1 = $("#luckysheet-newConditionRule-dialog #type1 option:selected").val(); let type2 = $("#luckysheet-newConditionRule-dialog ." + type1 + "Box #type2 option:selected").val(); let format, rule; if(index == 0){ if(type1 == "dataBar"){ //数据条 let color = $(this).parents("#luckysheet-newConditionRule-dialog").find(".dataBarBox .luckysheet-conditionformat-config-color").spectrum("get").toHexString(); if(type2 == "gradient"){ //渐变填充 format = [color, "#ffffff"]; } else if(type2 == "solid"){ //实心填充 format = [color]; } rule = { "type": "dataBar", "cellrange": $.extend(true, [], Store.luckysheet_select_save), "format": format }; } else if(type1 == "colorGradation"){ //色阶 let maxcolor = $(this).parents("#luckysheet-newConditionRule-dialog").find(".colorGradationBox .maxVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(); let midcolor = $(this).parents("#luckysheet-newConditionRule-dialog").find(".colorGradationBox .midVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(); let mincolor = $(this).parents("#luckysheet-newConditionRule-dialog").find(".colorGradationBox .minVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(); if(type2 == "threeColor"){ //三色 format = [maxcolor, midcolor, mincolor]; } else if(type2 == "twoColor"){ //双色 format = [maxcolor, mincolor]; } rule = { "type": "colorGradation", "cellrange": $.extend(true, [], Store.luckysheet_select_save), "format": format }; } else if(type1 == "icons"){ //图标集 let len = $(this).parents("#luckysheet-newConditionRule-dialog").find(".iconsBox .model").attr("data-len"); let leftMin = $(this).parents("#luckysheet-newConditionRule-dialog").find(".iconsBox .model").attr("data-leftmin"); let top = $(this).parents("#luckysheet-newConditionRule-dialog").find(".iconsBox .model").attr("data-top"); format = { "len": len, "leftMin": leftMin, "top": top }; rule = { "type": "icons", "cellrange": $.extend(true, [], Store.luckysheet_select_save), "format": format }; } } else{ let conditionName = "", conditionRange = [], conditionValue = []; if(index == 1){ if(type1 == "number"){ //单元格值 conditionName = type2; if(type2 == "betweenness"){ let v1 = $("#luckysheet-newConditionRule-dialog #conditionVal input").val().trim(); let v2 = $("#luckysheet-newConditionRule-dialog #conditionVal2 input").val().trim(); //条件值是否是选区 let rangeArr1 = _this.getRangeByTxt(v1); if(rangeArr1.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr1.length == 1){ let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1]; let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1]; if(r1 == r2 && c1 == c2){ v1 = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr1[0].row, "column": rangeArr1[0].column }); conditionValue.push(v1); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr1.length == 0){ if(isNaN(v1) || v1 == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v1); } } let rangeArr2 = _this.getRangeByTxt(v2); if(rangeArr2.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr2.length == 1){ let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1]; let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1]; if(r1 == r2 && c1 == c2){ v2 = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr2[0].row, "column": rangeArr2[0].column }); conditionValue.push(v2); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr2.length == 0){ if(isNaN(v2) || v2 == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v2); } } } else{ //条件值 let v = $("#luckysheet-newConditionRule-dialog #conditionVal input").val().trim(); //条件值是否是选区 let rangeArr = _this.getRangeByTxt(v); if(rangeArr.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr.length == 1){ let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]; let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]; if(r1 == r2 && c1 == c2){ v = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column }); conditionValue.push(v); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr.length == 0){ if(isNaN(v) || v == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v); } } } } else if(type1 == "text"){ //特定文本 conditionName = "textContains"; //条件值 let v = $("#luckysheet-newConditionRule-dialog #conditionVal input").val().trim(); //条件值是否是选区 let rangeArr = _this.getRangeByTxt(v); if(rangeArr.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr.length == 1){ let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]; let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]; if(r1 == r2 && c1 == c2){ v = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column }); conditionValue.push(v); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr.length == 0){ if(v == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v); } } } else if(type1 == "date"){ //发生日期 conditionName = "occurrenceDate"; //条件值 let v = $("#luckysheet-newConditionRule-dialog #daterange-btn").val(); if(v == "" || v == null){ _this.infoDialog(conditionformat_Text.pleaseSelectADate, ""); return; } conditionValue.push(v); } } else if(index == 2){ //排名靠前靠后 //条件名称 if(type1 == "top"){ if($("#luckysheet-newConditionRule-dialog #isPercent").is(":selected")){ conditionName = "top10%"; } else{ conditionName = "top10"; } } else if(type1 == "last"){ if($("#luckysheet-newConditionRule-dialog #isPercent").is(":selected")){ conditionName = "last10%"; } else{ conditionName = "last10"; } } //条件值 let v = $("#luckysheet-newConditionRule-dialog #conditionVal input").val().trim(); if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){ _this.infoDialog(conditionformat_Text.pleaseEnterInteger, ""); return; } conditionValue.push(parseInt(v)); } else if(index == 3){ //平均值 if(type1 == "AboveAverage"){ conditionName = "AboveAverage"; conditionValue.push("AboveAverage"); } else if(type1 == "SubAverage"){ conditionName = "SubAverage"; conditionValue.push("SubAverage"); } } else if(index == 4){ //重复值 conditionName = "duplicateValue"; conditionValue.push(type1); } else if(index == 5){ //公式 conditionName = "formula"; //条件值 let v = $("#luckysheet-newConditionRule-dialog #formulaConditionVal input").val().trim(); if(v == ""){ _this.infoDialog("Condition value cannot be empty!", ""); return; } conditionValue.push(v); } //格式颜色 let textcolor; if($("#luckysheet-newConditionRule-dialog #checkTextColor").is(":checked")){ textcolor = $("#luckysheet-newConditionRule-dialog #textcolorshow").spectrum("get").toHexString(); } else{ textcolor = null; } let cellcolor; if($("#luckysheet-newConditionRule-dialog #checkCellColor").is(":checked")){ cellcolor = $("#luckysheet-newConditionRule-dialog #cellcolorshow").spectrum("get").toHexString(); } else{ cellcolor = null; } format = { "textColor": textcolor, "cellColor": cellcolor }; rule = { "type": "default", "cellrange": $.extend(true, [], Store.luckysheet_select_save), "format": format, "conditionName": conditionName, "conditionRange": conditionRange, "conditionValue": conditionValue }; } $("#luckysheet-newConditionRule-dialog").hide(); //新建规则的入口 let source = $(this).attr("data-source"); if(source == 0){ $("#luckysheet-modal-dialog-mask").hide(); //保存之前的规则 let fileH = $.extend(true, [], Store.luckysheetfile); let historyRules = _this.getHistoryRules(fileH); //保存当前的规则 let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"]; ruleArr.push(rule); Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] = ruleArr; let fileC = $.extend(true, [], Store.luckysheetfile); let currentRules = _this.getCurrentRules(fileC); //刷新一次表格 _this.ref(historyRules, currentRules); //发送给后台 if(server.allowUpdate){ server.saveParam("all", Store.currentSheetIndex, ruleArr, { "k": "luckysheet_conditionformat_save" }); } } else if(source == 1){ //临时存储新规则 let ruleArr = !!_this.fileClone[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] ? _this.fileClone[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] : []; ruleArr.push(rule); _this.fileClone[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] = ruleArr; //新建规则隐藏,管理规则显示 _this.administerRuleDialog(); } }); $(document).off("click.CFnewConditionRuleClose").on("click.CFnewConditionRuleClose", "#luckysheet-newConditionRule-dialog-close", function(){ //新建规则的入口 let source = $(this).attr("data-source"); if(source == 0){ $("#luckysheet-modal-dialog-mask").hide(); } if(source == 1){ $("#luckysheet-administerRule-dialog").show(); } //新建规则隐藏 $("#luckysheet-newConditionRule-dialog").hide(); //隐藏虚线框 $("#luckysheet-formula-functionrange-select").hide(); $("#luckysheet-row-count-show").hide(); $("#luckysheet-column-count-show").hide(); }); // 编辑规则 $(document).off("click.CFeditorConditionRule").on("click.CFeditorConditionRule", "#editorConditionRule", function(){ let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); if(!checkProtectionFormatCells(sheetIndex)){ return; } let itemIndex = $("#luckysheet-administerRule-dialog .ruleList .listBox .item.on").attr("data-item"); let rule = { "sheetIndex": sheetIndex, "itemIndex": itemIndex, "data": _this.fileClone[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"][itemIndex] }; _this.editorRule = rule; _this.editorConditionRuleDialog(); }); $(document).off("click.CFeditorConditionRuleConfirm").on("click.CFeditorConditionRuleConfirm", "#luckysheet-editorConditionRule-dialog-confirm",function(){ let index = $("#luckysheet-editorConditionRule-dialog .ruleTypeItem.on").index(); let type1 = $("#luckysheet-editorConditionRule-dialog #type1 option:selected").val(); let type2 = $("#luckysheet-editorConditionRule-dialog ." + type1 + "Box #type2 option:selected").val(); let cellrange = _this.editorRule["data"].cellrange; let format, rule; if(index == 0){ if(type1 == "dataBar"){ //数据条 let color = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".dataBarBox .luckysheet-conditionformat-config-color").spectrum("get").toHexString(); if(type2 == "gradient"){ //渐变填充 format = [color, "#ffffff"]; } else if(type2 == "solid"){ //实心填充 format = [color]; } rule = { "type": "dataBar", "cellrange": cellrange, "format": format }; } else if(type1 == "colorGradation"){ //色阶 let maxcolor = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".colorGradationBox .maxVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(); let midcolor = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".colorGradationBox .midVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(); let mincolor = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".colorGradationBox .minVal .luckysheet-conditionformat-config-color").spectrum("get").toRgbString(); if(type2 == "threeColor"){ //三色 format = [maxcolor, midcolor, mincolor]; } else if(type2 == "twoColor"){ //双色 format = [maxcolor, mincolor]; } rule = { "type": "colorGradation", "cellrange": cellrange, "format": format }; } else if(type1 == "icons"){ //图标集 let len = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".iconsBox .model").attr("data-len"); let leftMin = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".iconsBox .model").attr("data-leftmin"); let top = $(this).parents("#luckysheet-editorConditionRule-dialog").find(".iconsBox .model").attr("data-top"); format = { "len": len, "leftMin": leftMin, "top": top }; rule = { "type": "icons", "cellrange": cellrange, "format": format }; } } else{ let conditionName = "", conditionRange = [], conditionValue = []; if(index == 1){ if(type1 == "number"){ //单元格值 conditionName = type2; if(type2 == "betweenness"){ let v1 = $("#luckysheet-editorConditionRule-dialog #conditionVal input").val().trim(); let v2 = $("#luckysheet-editorConditionRule-dialog #conditionVal2 input").val().trim(); //条件值是否是选区 let rangeArr1 = _this.getRangeByTxt(v1); if(rangeArr1.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr1.length == 1){ let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1]; let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1]; if(r1 == r2 && c1 == c2){ v1 = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr1[0].row, "column": rangeArr1[0].column }); conditionValue.push(v1); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr1.length == 0){ if(isNaN(v1) || v1 == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v1); } } let rangeArr2 = _this.getRangeByTxt(v2); if(rangeArr2.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr2.length == 1){ let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1]; let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1]; if(r1 == r2 && c1 == c2){ v2 = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr2[0].row, "column": rangeArr2[0].column }); conditionValue.push(v2); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr2.length == 0){ if(isNaN(v2) || v2 == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v2); } } } else{ //条件值 let v = $("#luckysheet-editorConditionRule-dialog #conditionVal input").val().trim(); //条件值是否是选区 let rangeArr = _this.getRangeByTxt(v); if(rangeArr.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr.length == 1){ let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]; let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]; if(r1 == r2 && c1 == c2){ v = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column }); conditionValue.push(v); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr.length == 0){ if(isNaN(v) || v == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v); } } } } else if(type1 == "text"){ //特定文本 conditionName = "textContains"; //条件值 let v = $("#luckysheet-editorConditionRule-dialog #conditionVal input").val().trim(); //条件值是否是选区 let rangeArr = _this.getRangeByTxt(v); if(rangeArr.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr.length == 1){ let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]; let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]; if(r1 == r2 && c1 == c2){ v = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column }); conditionValue.push(v); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr.length == 0){ if(isNaN(v) || v == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v); } } } else if(type1 == "date"){ //发生日期 conditionName = "occurrenceDate"; //条件值 let v = $("#luckysheet-editorConditionRule-dialog #daterange-btn").val(); if(v == "" || v == null){ _this.infoDialog(conditionformat_Text.pleaseSelectADate, ""); return; } conditionValue.push(v); } } else if(index == 2){ //排名靠前靠后 //条件名称 if(type1 == "top"){ if($("#luckysheet-editorConditionRule-dialog #isPercent").is(":selected")){ conditionName = "top10%"; } else{ conditionName = "top10"; } } else if(type1 == "last"){ if($("#luckysheet-editorConditionRule-dialog #isPercent").is(":selected")){ conditionName = "last10%"; } else{ conditionName = "last10"; } } //条件值 let v = $("#luckysheet-editorConditionRule-dialog #conditionVal input").val().trim(); if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){ _this.infoDialog(conditionformat_Text.pleaseEnterInteger, ""); return; } conditionValue.push(v); } else if(index == 3){ //平均值 if(type1 == "AboveAverage"){ conditionName = "AboveAverage"; conditionValue.push("AboveAverage"); } else if(type1 == "SubAverage"){ conditionName = "SubAverage"; conditionValue.push("SubAverage"); } } else if(index == 4){ //重复值 conditionName = "duplicateValue"; conditionValue.push(type1); } else if(index == 5){ //公式 conditionName = "formula"; //条件值 let v = $("#luckysheet-editorConditionRule-dialog #formulaConditionVal input").val().trim(); console.log(v) if(v == ""){ _this.infoDialog("Condition value cannot be empty!", ""); return; } conditionValue.push(v); } //格式颜色 let textcolor; if($("#luckysheet-editorConditionRule-dialog #checkTextColor").is(":checked")){ textcolor = $("#luckysheet-editorConditionRule-dialog #textcolorshow").spectrum("get").toHexString(); } else{ textcolor = null; } let cellcolor; if($("#luckysheet-editorConditionRule-dialog #checkCellColor").is(":checked")){ cellcolor = $("#luckysheet-editorConditionRule-dialog #cellcolorshow").spectrum("get").toHexString(); } else{ cellcolor = null; } format = { "textColor": textcolor, "cellColor": cellcolor }; rule = { "type": "default", "cellrange": cellrange, "format": format, "conditionName": conditionName, "conditionRange": conditionRange, "conditionValue": conditionValue }; } //修改编辑的规则 let sheetIndex = _this.editorRule["sheetIndex"]; let itemIndex = _this.editorRule["itemIndex"]; _this.fileClone[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"][itemIndex] = rule; //编辑规则隐藏,管理规则显示 $("#luckysheet-editorConditionRule-dialog").hide(); _this.administerRuleDialog(); }); $(document).off("click.CFeditorConditionRuleClose").on("click.CFeditorConditionRuleClose", "#luckysheet-editorConditionRule-dialog-close",function(){ //编辑规则隐藏,管理规则显示 $("#luckysheet-editorConditionRule-dialog").hide(); $("#luckysheet-administerRule-dialog").show(); //隐藏虚线框 $("#luckysheet-formula-functionrange-select").hide(); $("#luckysheet-row-count-show").hide(); $("#luckysheet-column-count-show").hide(); }); // 新建规则、编辑规则 类型切换 $(document).off("click.CFnewEditorRuleItem").on("click.CFnewEditorRuleItem", ".luckysheet-newEditorRule-dialog .ruleTypeItem", function(){ $(this).addClass("on").siblings().removeClass("on"); let index = $(this).index(); $(this).parents(".luckysheet-newEditorRule-dialog").find(".ruleExplainBox").html(_this.getRuleExplain(index)); _this.colorSelectInit(); }); $(document).off("change.CFnewEditorRuleType1").on("change.CFnewEditorRuleType1", ".luckysheet-newEditorRule-dialog #type1", function(){ let optionVal = $(this).find("option:selected").val(); if(optionVal == "dataBar" || optionVal == "colorGradation" || optionVal == "icons" || optionVal == "number" || optionVal == "text" || optionVal == "date"){ $(this).parents(".luckysheet-newEditorRule-dialog").find("." + optionVal + "Box").show().siblings().hide(); } if(optionVal == "date"){ _this.daterangeInit($(this).parents(".luckysheet-newEditorRule-dialog").attr("id")); } }); $(document).off("change.CFnewEditorRuleType2").on("change.CFnewEditorRuleType2", ".luckysheet-newEditorRule-dialog #type2", function(){ let type1 = $(this).parents(".luckysheet-newEditorRule-dialog").find("#type1 option:selected").val(); if(type1 == "colorGradation"){ let type2 = $(this).find("option:selected").val(); if(type2 == "threeColor"){ $(this).parents(".luckysheet-newEditorRule-dialog").find(".midVal").show(); } else{ $(this).parents(".luckysheet-newEditorRule-dialog").find(".midVal").hide(); } } else if(type1 == "number"){ let type2 = $(this).find("option:selected").val(); if(type2 == "betweenness"){ $(this).parents(".luckysheet-newEditorRule-dialog").find(".txt").show(); $(this).parents(".luckysheet-newEditorRule-dialog").find("#conditionVal2").show(); } else{ $(this).parents(".luckysheet-newEditorRule-dialog").find(".txt").hide(); $(this).parents(".luckysheet-newEditorRule-dialog").find("#conditionVal2").hide(); } } }); $(document).off("click.CFiconsShowbox").on("click.CFiconsShowbox", ".luckysheet-newEditorRule-dialog .iconsBox .showbox", function(){ $(this).parents(".iconsBox").find("ul").toggle(); }); $(document).off("click.CFiconsLi").on("click.CFiconsLi", ".luckysheet-newEditorRule-dialog .iconsBox li", function(){ let len = $(this).find("div").attr("data-len"); let leftmin = $(this).find("div").attr("data-leftmin"); let top = $(this).find("div").attr("data-top"); let title = $(this).find("div").attr("title"); let position = $(this).find("div").css("background-position"); $(this).parents(".iconsBox").find(".showbox .model").css("background-position", position); $(this).parents(".iconsBox").find(".showbox .model").attr("data-len", len); $(this).parents(".iconsBox").find(".showbox .model").attr("data-leftmin", leftmin); $(this).parents(".iconsBox").find(".showbox .model").attr("data-top", top); $(this).parents(".iconsBox").find(".showbox .model").attr("title", title); $(this).parents("ul").hide(); }); // 删除规则 $(document).off("click.CFdeleteConditionRule").on("click.CFdeleteConditionRule", "#deleteConditionRule", function(){ let sheetIndex = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); if(!checkProtectionFormatCells(sheetIndex)){ return; } let itemIndex = $("#luckysheet-administerRule-dialog .ruleList .listBox .item.on").attr("data-item"); _this.fileClone[getSheetIndex(sheetIndex)]["luckysheet_conditionformat_save"].splice(itemIndex, 1); _this.administerRuleDialog(); }); // 规则子菜单弹出层 点击确定修改样式 $(document).off("click.CFdefault").on("click.CFdefault", "#luckysheet-conditionformat-dialog-confirm", function(){ if(!checkProtectionFormatCells(Store.currentSheetIndex)){ return; } //条件名称 let conditionName = $("#luckysheet-conditionformat-dialog .box").attr("data-itemvalue"); //条件单元格 let conditionRange = []; //条件值 let conditionValue = []; if(conditionName == "greaterThan" || conditionName == "lessThan" || conditionName == "equal" || conditionName == "textContains"){ let v = $("#luckysheet-conditionformat-dialog #conditionVal").val().trim(); //条件值是否是选区 let rangeArr = _this.getRangeByTxt(v); if(rangeArr.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr.length == 1){ let r1 = rangeArr[0].row[0], r2 = rangeArr[0].row[1]; let c1 = rangeArr[0].column[0], c2 = rangeArr[0].column[1]; if(r1 == r2 && c1 == c2){ v = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr[0].row, "column": rangeArr[0].column }); conditionValue.push(v); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr.length == 0){ if(isNaN(v) || v == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v); } } } else if(conditionName == "betweenness"){//介于 let v1 = $("#luckysheet-conditionformat-dialog #conditionVal").val().trim(); let v2 = $("#luckysheet-conditionformat-dialog #conditionVal2").val().trim(); //条件值是否是选区 let rangeArr1 = _this.getRangeByTxt(v1); if(rangeArr1.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr1.length == 1){ let r1 = rangeArr1[0].row[0], r2 = rangeArr1[0].row[1]; let c1 = rangeArr1[0].column[0], c2 = rangeArr1[0].column[1]; if(r1 == r2 && c1 == c2){ v1 = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr1[0].row, "column": rangeArr1[0].column }); conditionValue.push(v1); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr1.length == 0){ if(isNaN(v1) || v1 == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v1); } } let rangeArr2 = _this.getRangeByTxt(v2); if(rangeArr2.length > 1){ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } else if(rangeArr2.length == 1){ let r1 = rangeArr2[0].row[0], r2 = rangeArr2[0].row[1]; let c1 = rangeArr2[0].column[0], c2 = rangeArr2[0].column[1]; if(r1 == r2 && c1 == c2){ v2 = getcellvalue(r1, c1, Store.flowdata); conditionRange.push({ "row": rangeArr2[0].row, "column": rangeArr2[0].column }); conditionValue.push(v2); } else{ _this.infoDialog(conditionformat_Text.onlySingleCell, ""); return; } } else if(rangeArr2.length == 0){ if(isNaN(v2) || v2 == ""){ _this.infoDialog(conditionformat_Text.conditionValueCanOnly, ""); return; } else{ conditionValue.push(v2); } } } else if(conditionName == "occurrenceDate"){//日期 let v = $("#luckysheet-conditionformat-dialog #daterange-btn").val(); if(v == "" || v == null){ _this.infoDialog(conditionformat_Text.pleaseSelectADate, ""); return; } conditionValue.push(v); } else if(conditionName == "duplicateValue"){//重复值 conditionValue.push($("#luckysheet-conditionformat-dialog #conditionVal option:selected").val()); } else if(conditionName == "top10" || conditionName == "top10%" || conditionName == "last10" || conditionName == "last10%"){ let v = $("#luckysheet-conditionformat-dialog #conditionVal").val().trim(); if(parseInt(v) != v || parseInt(v) < 1 || parseInt(v) > 1000){ _this.infoDialog(conditionformat_Text.pleaseEnterInteger, ""); return; } conditionValue.push(v); } else if(conditionName == "AboveAverage"){ //高于平均值 conditionValue.push("AboveAverage"); } else if(conditionName == "SubAverage"){ //低于平均值 conditionValue.push("SubAverage"); } //格式颜色 let textcolor; if($("#checkTextColor").is(":checked")){ textcolor = $("#textcolorshow").spectrum("get").toHexString(); } else{ textcolor = null; } let cellcolor; if($("#checkCellColor").is(":checked")){ cellcolor = $("#cellcolorshow").spectrum("get").toHexString(); } else{ cellcolor = null; } //保存之前的规则 let fileH = $.extend(true, [], Store.luckysheetfile); let historyRules = _this.getHistoryRules(fileH); //保存当前的规则 let rule = { "type": "default", "cellrange": $.extend(true, [], Store.luckysheet_select_save), "format": { "textColor": textcolor, "cellColor": cellcolor }, "conditionName": conditionName, "conditionRange": conditionRange, "conditionValue": conditionValue }; let ruleArr = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] == undefined ? [] : Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"]; ruleArr.push(rule); Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] = ruleArr; let fileC = $.extend(true, [], Store.luckysheetfile); let currentRules = _this.getCurrentRules(fileC); //刷新一次表格 _this.ref(historyRules, currentRules); //隐藏一些dom $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-conditionformat-dialog").hide(); //发送给后台 if(server.allowUpdate){ server.saveParam("all", Store.currentSheetIndex, ruleArr, { "k": "luckysheet_conditionformat_save" }); } }); // 图标集弹出层 选择 $(document).off("click.CFicons").on("click.CFicons", "#luckysheet-CFicons-dialog .item", function(){ $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-CFicons-dialog").hide(); if(Store.luckysheet_select_save.length > 0){ let cellrange = $.extend(true, [], Store.luckysheet_select_save); let format = { "len": $(this).attr("data-len"), "leftMin": $(this).attr("data-leftMin"), "top": $(this).attr("data-top") } _this.updateItem("icons", cellrange, format); } }); // 选择单元格 $(document).on("click", ".range .fa-table", function(){ let id = $(this).parents(".luckysheet-modal-dialog").attr("id"); $("#" + id).hide(); //入口 let source; if(id == "luckysheet-conditionformat-dialog"){ let $id = $(this).siblings("input").attr("id"); if($id == "conditionVal"){ source = "0_1"; } else{ source = "0_2"; } } else if(id == "luckysheet-newConditionRule-dialog"){ let $id = $(this).parents(".range").attr("id"); if($id == "formulaConditionVal"){ source = "1_0"; } else if($id == "conditionVal"){ source = "1_1"; } else{ source = "1_2"; } } else if(id == "luckysheet-editorConditionRule-dialog"){ let $id = $(this).parents(".range").attr("id"); if($id == "formulaConditionVal"){ source = "2_0"; } else if($id == "conditionVal"){ source = "2_1"; } else{ source = "2_2"; } } //input值 let v = $(this).siblings("input").val(); _this.singleRangeDialog(source, v); selectionCopyShow(_this.getRangeByTxt(v)); }); $(document).on("click", "#luckysheet-singleRange-dialog-confirm", function(){ $("#luckysheet-modal-dialog-mask").show(); $(this).parents("#luckysheet-singleRange-dialog").hide(); let source = $(this).attr("data-source"); let v = $(this).parents("#luckysheet-singleRange-dialog").find("input").val(); if(source == "0_1"){ $("#luckysheet-conditionformat-dialog").show(); $("#luckysheet-conditionformat-dialog #conditionVal").val(v); } else if(source == "0_2"){ $("#luckysheet-conditionformat-dialog").show(); $("#luckysheet-conditionformat-dialog #conditionVal2").val(v); } else if(source == "1_0"){ $("#luckysheet-newConditionRule-dialog").show(); $("#luckysheet-newConditionRule-dialog #formulaConditionVal input").val(v); } else if(source == "1_1"){ $("#luckysheet-newConditionRule-dialog").show(); $("#luckysheet-newConditionRule-dialog #conditionVal input").val(v); } else if(source == "1_2"){ $("#luckysheet-newConditionRule-dialog").show(); $("#luckysheet-newConditionRule-dialog #conditionVal2 input").val(v); } else if(source == "2_0"){ $("#luckysheet-editorConditionRule-dialog").show(); $("#luckysheet-editorConditionRule-dialog #formulaConditionVal input").val(v); } else if(source == "2_1"){ $("#luckysheet-editorConditionRule-dialog").show(); $("#luckysheet-editorConditionRule-dialog #conditionVal input").val(v); } else if(source == "2_2"){ $("#luckysheet-editorConditionRule-dialog").show(); $("#luckysheet-editorConditionRule-dialog #conditionVal2 input").val(v); } let range = []; selectionCopyShow(range); }); $(document).on("click", "#luckysheet-singleRange-dialog-close", function(){ $("#luckysheet-modal-dialog-mask").show(); $(this).parents("#luckysheet-singleRange-dialog").hide(); let source = $(this).attr("data-source"); if(source == "0_1" || source == "0_2"){ $("#luckysheet-conditionformat-dialog").show(); } else if(source == "1_0" || source == "1_1" || source == "1_2"){ $("#luckysheet-newConditionRule-dialog").show(); } else if(source == "2_0" || source == "2_1" || source == "2_2"){ $("#luckysheet-editorConditionRule-dialog").show(); } let range = []; selectionCopyShow(range); }); // 弹出层右上角关闭按钮 $(document).on("click", ".luckysheet-modal-dialog-title-close", function(){ let id = $(this).parents(".luckysheet-modal-dialog").attr("id"); //新建规则弹出层 if(id == "luckysheet-newConditionRule-dialog"){ let source = $("#" + id).find("#luckysheet-newConditionRule-dialog-close").attr("data-source"); //新建规则入口 if(source == 1){ $("#luckysheet-administerRule-dialog").show(); } } //编辑规则弹出层 if(id == "luckysheet-editorConditionRule-dialog"){ $("#luckysheet-administerRule-dialog").show(); } //选择单元格弹出层 if(id == "luckysheet-singleRange-dialog"){ $("#luckysheet-modal-dialog-mask").show(); let source = $(this).parents("#luckysheet-singleRange-dialog").find("#luckysheet-singleRange-dialog-confirm").attr("data-source"); if(source == "0_1" || source == "0_2"){ $("#luckysheet-conditionformat-dialog").show(); } else if(source == "1_1" || source == "1_2"){ $("#luckysheet-newConditionRule-dialog").show(); } else if(source == "2_1" || source == "2_2"){ $("#luckysheet-editorConditionRule-dialog").show(); } let range = []; selectionCopyShow(range); } //选择应用范围弹出层 if(id == "luckysheet-multiRange-dialog"){ $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-administerRule-dialog").show(); let range = []; selectionCopyShow(range); } //提示框 if(id == "luckysheet-conditionformat-info-dialog"){ $("#luckysheet-modal-dialog-mask").show(); } }); //提示框 $(document).on("click", "#luckysheet-conditionformat-info-dialog-close", function(){ $(this).parents("#luckysheet-conditionformat-info-dialog").hide(); }); }, singleRangeDialog: function(source, value){ $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-singleRange-dialog").remove(); const conditionformat_Text = locale().conditionformat; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-singleRange-dialog", "addclass": "luckysheet-singleRange-dialog", "title": conditionformat_Text.selectCell, "content": `<input readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectCell}" value="${value}"/>`, "botton": `<button id="luckysheet-singleRange-dialog-confirm" class="btn btn-primary" data-source="${source}">${conditionformat_Text.confirm}</button> <button id="luckysheet-singleRange-dialog-close" class="btn btn-default" data-source="${source}">${conditionformat_Text.cancel}</button>`, "style": "z-index:100003" })); let $t = $("#luckysheet-singleRange-dialog") .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(); $("#luckysheet-singleRange-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); }, multiRangeDialog: function(dataItem, value){ let _this = this; $("#luckysheet-modal-dialog-mask").hide(); $("#luckysheet-multiRange-dialog").remove(); const conditionformat_Text = locale().conditionformat; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-multiRange-dialog", "addclass": "luckysheet-multiRange-dialog", "title": conditionformat_Text.selectRange, "content": `<input readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectRange}" value="${value}"/>`, "botton": `<button id="luckysheet-multiRange-dialog-confirm" class="btn btn-primary" data-item="${dataItem}">${conditionformat_Text.confirm}</button> <button id="luckysheet-multiRange-dialog-close" class="btn btn-default">${conditionformat_Text.cancel}</button>`, "style": "z-index:100003" })); let $t = $("#luckysheet-multiRange-dialog") .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(); $("#luckysheet-multiRange-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); selectionCopyShow(_this.getRangeByTxt(value)); }, getTxtByRange: function(range){ if(range.length > 0){ let txt = []; for(let s = 0; s < range.length; s++){ let r1 = range[s].row[0], r2 = range[s].row[1]; let c1 = range[s].column[0], c2 = range[s].column[1]; txt.push(getRangetxt(Store.currentSheetIndex, { "row": [r1, r2], "column": [c1, c2] }, Store.currentSheetIndex)); } return txt.join(","); } }, getRangeByTxt: function(txt){ let range = []; txt = txt.toString(); if(txt.indexOf(",") != -1){ let arr = txt.split(","); for(let i = 0; i < arr.length; i++){ if(formula.iscelldata(arr[i])){ range.push(formula.getcellrange(arr[i])); } else{ range = []; break; } } } else{ if(formula.iscelldata(txt)){ range.push(formula.getcellrange(txt)); } } return range; }, colorSelectInit: function(){ const conditionformat_Text = locale().conditionformat; $(".luckysheet-conditionformat-config-color").spectrum({ showPalette: true, showPaletteOnly:true, preferredFormat: "hex", clickoutFiresChange: false, showInitial: true, showInput: true, // flat: true, hideAfterPaletteSelect: true, showSelectionPalette: true, // showButtons: false,//隐藏选择取消按钮 maxPaletteSize: 8, maxSelectionSize: 8, // color: currenColor, cancelText: conditionformat_Text.cancel, chooseText: conditionformat_Text.confirmColor, togglePaletteMoreText: "自定义", togglePaletteLessText: "收起", togglePaletteOnly: true, clearText: conditionformat_Text.clearColorSelect, noColorSelectedText: "没有颜色被选择", localStorageKey: "spectrum.textcolor" + server.gridKey, palette: [["#000","#444","#666","#999","#ccc","#eee","#f3f3f3","#fff"], ["#f00","#f90","#ff0","#0f0","#0ff","#00f","#90f","#f0f"], ["#f4cccc","#fce5cd","#fff2cc","#d9ead3","#d0e0e3","#cfe2f3","#d9d2e9","#ead1dc"], ["#ea9999","#f9cb9c","#ffe599","#b6d7a8","#a2c4c9","#9fc5e8","#b4a7d6","#d5a6bd"], ["#e06666","#f6b26b","#ffd966","#93c47d","#76a5af","#6fa8dc","#8e7cc3","#c27ba0"], ["#c00","#e69138","#f1c232","#6aa84f","#45818e","#3d85c6","#674ea7","#a64d79"], ["#900","#b45f06","#bf9000","#38761d","#134f5c","#0b5394","#351c75","#741b47"], ["#600","#783f04","#7f6000","#274e13","#0c343d","#073763","#20124d","#4c1130"]], change: function(color){ if (color != null) { color = color.toHexString(); } } }); }, conditionformatDialog: function(title, content){ let _this = this; $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-conditionformat-dialog").remove(); const conditionformat_Text = locale().conditionformat; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-conditionformat-dialog", "addclass": "luckysheet-conditionformat-dialog", "title": title, "content": content, "botton": `<button id="luckysheet-conditionformat-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button> <button class="btn btn-default luckysheet-model-close-btn">${conditionformat_Text.cancel}</button>`, "style": "z-index:9999" })); let $t = $("#luckysheet-conditionformat-dialog") .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(); $("#luckysheet-conditionformat-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); _this.init(); _this.colorSelectInit(); if(title == locale().conditionformat.conditionformat_occurrenceDate){ _this.daterangeInit("luckysheet-conditionformat-dialog"); } }, CFiconsDialog: function(){ $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-CFicons-dialog").remove(); const conditionformat_Text = locale().conditionformat; let content = `<div class="box"> <div style="margin-bottom: 10px;">${conditionformat_Text.pleaseSelectIcon}</div> <div class="title">${conditionformat_Text.direction}</div> <div class="list"> <div class="left"> <div class="item" data-len="3" data-leftMin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 0;"></div></div> <div class="item" data-len="3" data-leftMin="0" data-top="1" title="${conditionformat_Text.threeTriangles}"><div style="background-position:0 -20px;"></div></div> <div class="item" data-len="4" data-leftMin="0" data-top="2" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 -40px;"></div></div> <div class="item" data-len="5" data-leftMin="0" data-top="3" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})"><div style="background-position:0 -60px;"></div></div> </div> <div class="right"> <div class="item" data-len="3" data-leftMin="5" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px 0;"></div></div> <div class="item" data-len="4" data-leftMin="5" data-top="1" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px -20px;"></div></div> <div class="item" data-len="5" data-leftMin="5" data-top="2" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})"><div style="background-position:-131px -40px;"></div></div> </div> <div style="clear:both;"></div> </div> <div class="title">${conditionformat_Text.shape}</div> <div class="list"> <div class="left"> <div class="item" data-len="3" data-leftMin="0" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})"><div style="background-position:0 -80px;"></div></div> <div class="item" data-len="3" data-leftMin="0" data-top="5" title="${conditionformat_Text.threeSigns}"><div style="background-position:0 -100px;"></div></div> <div class="item" data-len="4" data-leftMin="0" data-top="6" title="${conditionformat_Text.greenRedBlackGradient}"><div style="background-position:0 -120px;"></div></div> </div> <div class="right"> <div class="item" data-len="3" data-leftMin="5" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})"><div style="background-position:-131px -80px;"></div></div> <div class="item" data-len="4" data-leftMin="5" data-top="5" title="${conditionformat_Text.fourColorTrafficLight}"><div style="background-position:-131px -100px;"></div></div> </div> <div style="clear:both;"></div> </div> <div class="title">${conditionformat_Text.mark}</div> <div class="list"> <div class="left"> <div class="item" data-len="3" data-leftMin="0" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})"><div style="background-position:0 -140px;"></div></div> <div class="item" data-len="3" data-leftMin="0" data-top="8" title="${conditionformat_Text.tricolorFlag}"><div style="background-position:0 -160px;"></div></div> </div> <div class="right"> <div class="item" data-len="3" data-leftMin="5" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})"><div style="background-position:-131px -140px;"></div></div> </div> <div style="clear:both;"></div> </div> <div class="title">${conditionformat_Text.grade}</div> <div class="list"> <div class="left"> <div class="item" data-len="3" data-leftMin="0" data-top="9" title="${conditionformat_Text.threeStars}"><div style="background-position:0 -180px;"></div></div> <div class="item" data-len="5" data-leftMin="0" data-top="10" title="${conditionformat_Text.fiveQuadrantDiagram}"><div style="background-position:0 -200px;"></div></div> <div class="item" data-len="5" data-leftMin="0" data-top="11" title="${conditionformat_Text.fiveBoxes}"><div style="background-position:0 -220px;"></div></div> </div> <div class="right"> <div class="item" data-len="4" data-leftMin="5" data-top="9" title="${conditionformat_Text.grade4}"><div style="background-position:-131px -180px;"></div></div> <div class="item" data-len="5" data-leftMin="5" data-top="10" title="${conditionformat_Text.grade5}"><div style="background-position:-131px -200px;"></div></div> </div> <div style="clear:both;"></div> </div> </div>`; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-CFicons-dialog", "addclass": "luckysheet-CFicons-dialog", "title": conditionformat_Text.icons, "content": content, "botton": `<button class="btn btn-default luckysheet-model-close-btn">${conditionformat_Text.close}</button>`, "style": "z-index:100003" })); let $t = $("#luckysheet-CFicons-dialog") .find(".luckysheet-modal-dialog-content") .css("min-width", 400) .end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-CFicons-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); }, administerRuleDialog: function(){ $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-administerRule-dialog").remove(); const conditionformat_Text = locale().conditionformat; //工作表 let opHtml = ''; for(let j = 0; j < Store.luckysheetfile.length; j++){ if(Store.luckysheetfile[j].status == "1"){ opHtml += `<option value="${Store.luckysheetfile[j]["index"]}" selected="selected"> ${conditionformat_Text.currentSheet}:${Store.luckysheetfile[j]["name"]} </option>`; } else{ opHtml += `<option value="${Store.luckysheetfile[j]["index"]}"> ${conditionformat_Text.sheet}:${Store.luckysheetfile[j]["name"]} </option>`; } } let content = `<div class="chooseSheet"> <label>${conditionformat_Text.showRules}:</label> <select>${opHtml}</select> </div> <div class="ruleBox"> <div class="ruleBtn"> <button id="newConditionRule" class="btn btn-default">${conditionformat_Text.newRule}</button> <button id="editorConditionRule" class="btn btn-default">${conditionformat_Text.editRule}</button> <button id="deleteConditionRule" class="btn btn-default">${conditionformat_Text.deleteRule}</button> </div> <div class="ruleList"> <div class="listTitle"> <span>${conditionformat_Text.rule}</span> <span>${conditionformat_Text.format}</span> <span>${conditionformat_Text.applyRange}</span> </div> <div class="listBox"></div> </div> </div>`; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-administerRule-dialog", "addclass": "luckysheet-administerRule-dialog", "title": conditionformat_Text.conditionformatManageRules, "content": content, "botton": `<button id="luckysheet-administerRule-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button> <button id="luckysheet-administerRule-dialog-close" class="btn btn-default">${conditionformat_Text.close}</button>`, "style": "z-index:100003" })); let $t = $("#luckysheet-administerRule-dialog") .find(".luckysheet-modal-dialog-content") .css("min-width", 400) .end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-administerRule-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); //当前工作表的规则列表 let index = $("#luckysheet-administerRule-dialog .chooseSheet option:selected").val(); this.getConditionRuleList(index); }, getConditionRuleList: function(index){ let _this = this; $("#luckysheet-administerRule-dialog .ruleList .listBox").empty(); let ruleArr = _this.fileClone[getSheetIndex(index)].luckysheet_conditionformat_save; //条件格式规则集合 if(ruleArr != null && ruleArr.length > 0){ const conditionformat_Text = locale().conditionformat; for(let i = 0; i < ruleArr.length; i++){ let type = ruleArr[i]["type"]; //规则类型 let format = ruleArr[i]["format"]; //规则样式 let cellrange = ruleArr[i]["cellrange"]; //规则应用范围 let ruleName; //规则名称 let formatHtml = ''; //样式dom if(type == "dataBar"){ ruleName = conditionformat_Text.dataBar; formatHtml = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'; } else if(type == "colorGradation"){ ruleName = conditionformat_Text.colorGradation; formatHtml = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'; } else if(type == "icons"){ ruleName = conditionformat_Text.icons; formatHtml = '<canvas width="46" height="18" style="width: 46px;height: 18px;margin: 3px 0 0 5px;"></canvas>'; } else{ ruleName = _this.getConditionRuleName(ruleArr[i].conditionName, ruleArr[i].conditionRange, ruleArr[i].conditionValue); if(format["textColor"] != null){ formatHtml += '<span class="colorbox" title="'+ conditionformat_Text.textColor +'" style="background-color:' + format["textColor"] + '"></span>'; } if(format["cellColor"] != null){ formatHtml += '<span class="colorbox" title="'+ conditionformat_Text.cellColor +'" style="background-color:' + format["cellColor"] + '"></span>'; } } //应用范围dom let rangeTxtArr = []; for(let s = 0; s < cellrange.length; s++){ let r1 = cellrange[s].row[0], r2 = cellrange[s].row[1]; let c1 = cellrange[s].column[0], c2 = cellrange[s].column[1]; rangeTxtArr.push(chatatABC(c1) + (r1 + 1) + ":" + chatatABC(c2) + (r2 + 1)); } //条件格式规则列表dom let itemHtml = '<div class="item" data-item="' + i + '">' + '<div class="ruleName" title="' + ruleName + '">' + ruleName + '</div>' + '<div class="format">' + formatHtml + '</div>' + '<div class="ruleRange">' + '<input class="formulaInputFocus" readonly="true" value="' + rangeTxtArr.join(",") + '"/>' + '<i class="fa fa-table" aria-hidden="true" title="'+ conditionformat_Text.selectRange +'"></i>' + '</div>' + '</div>'; $("#luckysheet-administerRule-dialog .ruleList .listBox").prepend(itemHtml); } $("#luckysheet-administerRule-dialog .ruleList .listBox .item canvas").each(function(i){ let x = $(this).closest(".item").attr("data-item"); let type = ruleArr[x]["type"]; let format = ruleArr[x]["format"]; let can = $(this).get(0).getContext("2d"); if(type == "dataBar"){ if(format.length == 2){ let my_gradient = can.createLinearGradient(0, 0, 46, 0); my_gradient.addColorStop(0, format[0]); my_gradient.addColorStop(1, format[1]); can.fillStyle = my_gradient; can.fillRect(0, 0, 46, 18); can.beginPath(); can.moveTo(0, 0); can.lineTo(0, 18); can.lineTo(46, 18); can.lineTo(46, 0); can.lineTo(0, 0); can.lineWidth = Store.devicePixelRatio; can.strokeStyle = format[0]; can.stroke(); can.closePath(); } else if(format.length == 1){ can.fillStyle = format[0]; can.fillRect(0, 0, 46, 18); can.beginPath(); can.moveTo(0, 0); can.lineTo(0, 18); can.lineTo(46, 18); can.lineTo(46, 0); can.lineTo(0, 0); can.lineWidth = Store.devicePixelRatio; can.strokeStyle = format[0]; can.stroke(); can.closePath(); } } else if(type == "colorGradation"){ let my_gradient = can.createLinearGradient(0, 0, 46, 0); if(format.length == 3){ my_gradient.addColorStop(0, format[0]); my_gradient.addColorStop(0.5, format[1]); my_gradient.addColorStop(1, format[2]); } else if(format.length == 2){ my_gradient.addColorStop(0, format[0]); my_gradient.addColorStop(1, format[1]); } can.fillStyle = my_gradient; can.fillRect(0, 0, 46, 18); } else if(type == "icons"){ let len = format["len"]; let l = format["leftMin"]; let t = format["top"]; let w1 = 32 * len + 10 * (len - 1); let h1 = 32; let w2 = 46; let h2 = 46 * 32 / w1; if(l == "0"){ can.drawImage(luckysheet_CFiconsImg, 0, t * 32, w1, h1, 0, (18 - h2) / 2, w2, h2); } else if(l == "5"){ can.drawImage(luckysheet_CFiconsImg, 210, t * 32, w1, h1, 0, (18 - h2) / 2, w2, h2); } } }) $("#luckysheet-administerRule-dialog .ruleList .listBox .item").eq(0).addClass("on"); } }, getConditionRuleName: function(conditionName, conditionRange, conditionValue){ //v 有条件单元格取条件单元格,若无取条件值 let v if(conditionRange[0]!=null){ v = chatatABC(conditionRange[0]["column"][0]) + (conditionRange[0]["row"][0] + 1); } else{ v = conditionValue[0]; } const conditionformat_Text = locale().conditionformat; //返回条件格式规则名称 if(conditionName == "greaterThan"){ return conditionformat_Text.cellValue + " > " + v; } else if(conditionName == "lessThan"){ return conditionformat_Text.cellValue + " < " + v; } else if(conditionName == "betweenness"){ let v2; if(conditionRange[1] != null){ v2 = chatatABC(conditionRange[1]["column"][0]) + (conditionRange[1]["row"][0] + 1); } else{ v2 = conditionValue[1]; } return conditionformat_Text.cellValue + " " + conditionformat_Text.between + " " + v + " " + conditionformat_Text.in + " " + v2 + " " + conditionformat_Text.between2; } else if(conditionName == "equal"){ return conditionformat_Text.cellValue + " = " + v; } else if(conditionName == "textContains"){ return conditionformat_Text.cellValue + conditionformat_Text.contain + " =" + v; } else if(conditionName == "occurrenceDate"){ return conditionValue; } else if(conditionName == "duplicateValue"){ if(conditionValue == "0"){ return conditionformat_Text.duplicateValue; } if(conditionValue == "1"){ return conditionformat_Text.uniqueValue; } } else if(conditionName == "top10"){ return conditionformat_Text.top + " " + v + " " + conditionformat_Text.oneself; } else if(conditionName == "top10%"){ return conditionformat_Text.top + " " + v + "% " + conditionformat_Text.oneself; } else if(conditionName == "last10"){ return conditionformat_Text.last + " " + v + " " + conditionformat_Text.oneself; } else if(conditionName == "last10%"){ return conditionformat_Text.last + " " + v + "% " + conditionformat_Text.oneself; } else if(conditionName == "AboveAverage"){ return conditionformat_Text.aboveAverage; } else if(conditionName == "SubAverage"){ return conditionformat_Text.belowAverage; } else if(conditionName == "formula"){ if(v.slice(0, 1) != '='){ v = '=' + v; } return conditionformat_Text.formula + ': ' + v; } }, newConditionRuleDialog: function(source){ let _this = this; const conditionformat_Text = locale().conditionformat; //规则说明 let ruleExplainHtml = _this.getRuleExplain(0); //弹出层 $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-administerRule-dialog").hide(); $("#luckysheet-newConditionRule-dialog").remove(); let content = '<div>' + '<div class="boxTitle">' + conditionformat_Text.chooseRuleType + ':</div>' + _this.ruleTypeHtml() + '<div class="boxTitle">' + conditionformat_Text.editRuleDescription + ':</div>' + '<div class="ruleExplainBox">' + ruleExplainHtml + '</div>' + '</div>'; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-newConditionRule-dialog", "addclass": "luckysheet-newEditorRule-dialog", "title": conditionformat_Text.newFormatRule, "content": content, "botton": `<button id="luckysheet-newConditionRule-dialog-confirm" class="btn btn-primary" data-source="${source}">${conditionformat_Text.confirm}</button> <button id="luckysheet-newConditionRule-dialog-close" class="btn btn-default" data-source="${source}">${conditionformat_Text.cancel}</button>`, "style": "z-index:100003" })); let $t = $("#luckysheet-newConditionRule-dialog") .find(".luckysheet-modal-dialog-content") .css("min-width", 400) .end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-newConditionRule-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); //index的规则类型focus $("#luckysheet-newConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(0)").addClass("on").siblings().removeClass("on"); _this.colorSelectInit(); }, editorConditionRuleDialog: function(){ let _this = this; const conditionformat_Text = locale().conditionformat; let rule = _this.editorRule.data; if(rule == null){ return; } let ruleType = rule["type"], ruleFormat = rule["format"], conditionName = rule["conditionName"]; let index, type1; if(ruleType == "dataBar" || ruleType == "colorGradation" || ruleType == "icons"){ index = 0; type1 = ruleType; } else{ if(conditionName == "greaterThan" || conditionName == "lessThan" || conditionName == "betweenness" || conditionName == "equal" || conditionName == "textContains" || conditionName == "occurrenceDate"){ index = 1; if(conditionName == "greaterThan" || conditionName == "lessThan" || conditionName == "betweenness" || conditionName == "equal"){ type1 = "number"; } else if(conditionName == "textContains"){ type1 = "text"; } else if(conditionName == "occurrenceDate"){ type1 = "date"; } } else if(conditionName == "top10" || conditionName == "top10%" || conditionName == "last10" || conditionName == "last10%"){ index = 2; if(conditionName == "top10" || conditionName == "top10%"){ type1 = "top"; } else if(conditionName == "last10" || conditionName == "last10%"){ type1 = "last"; } } else if(conditionName == "AboveAverage" || conditionName == "SubAverage"){ index = 3; type1 = conditionName; } else if(conditionName == "duplicateValue"){ index = 4; type1 = rule["conditionValue"]; } else if(conditionName == "formula"){ index = 5; } } //规则说明 let ruleExplainHtml = _this.getRuleExplain(index); //弹出层 $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-administerRule-dialog").hide(); $("#luckysheet-editorConditionRule-dialog").remove(); let content = '<div>' + '<div class="boxTitle">'+ conditionformat_Text.chooseRuleType +':</div>' + _this.ruleTypeHtml() + '<div class="boxTitle">'+ conditionformat_Text.editRuleDescription +':</div>' + '<div class="ruleExplainBox">' + ruleExplainHtml + '</div>' + '</div>'; $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-editorConditionRule-dialog", "addclass": "luckysheet-newEditorRule-dialog", "title": conditionformat_Text.editFormatRule, "content": content, "botton": `<button id="luckysheet-editorConditionRule-dialog-confirm" class="btn btn-primary">${conditionformat_Text.confirm}</button> <button id="luckysheet-editorConditionRule-dialog-close" class="btn btn-default">${conditionformat_Text.cancel}</button>`, "style": "z-index:100003" })); let $t = $("#luckysheet-editorConditionRule-dialog") .find(".luckysheet-modal-dialog-content") .css("min-width", 400) .end(), myh = $t.outerHeight(), myw = $t.outerWidth(); let winw = $(window).width(), winh = $(window).height(); let scrollLeft = $(document).scrollLeft(), scrollTop = $(document).scrollTop(); $("#luckysheet-editorConditionRule-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); _this.colorSelectInit(); //规则类型focus $("#luckysheet-editorConditionRule-dialog .ruleTypeBox .ruleTypeItem:eq(" + index + ")").addClass("on").siblings().removeClass("on"); //type1 $("#luckysheet-editorConditionRule-dialog #type1").val(type1); if(type1 == "dataBar" || type1 == "colorGradation" || type1 == "icons" || type1 == "number" || type1 == "text" || type1 == "date"){ $("#luckysheet-editorConditionRule-dialog ." + type1 + "Box").show(); $("#luckysheet-editorConditionRule-dialog ." + type1 + "Box").siblings().hide(); } if(type1 == "date"){ _this.daterangeInit("luckysheet-editorConditionRule-dialog"); } //type2 format value if(ruleType == "dataBar" || ruleType == "colorGradation" || ruleType == "icons"){ if(type1 == "dataBar"){ if(ruleFormat.length == 2){ $("#luckysheet-editorConditionRule-dialog .dataBarBox #type2").val("gradient"); } else if(ruleFormat.length == 1){ $("#luckysheet-editorConditionRule-dialog .dataBarBox #type2").val("solid"); } $("#luckysheet-editorConditionRule-dialog .dataBarBox .luckysheet-conditionformat-config-color").spectrum("set", ruleFormat[0]); } else if(type1 == "colorGradation"){ if(ruleFormat.length == 3){ $("#luckysheet-editorConditionRule-dialog .colorGradationBox #type2").val("threeColor"); $("#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal").show(); $("#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color").spectrum("set", ruleFormat[0]); $("#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal .luckysheet-conditionformat-config-color").spectrum("set", ruleFormat[1]); $("#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color").spectrum("set", ruleFormat[2]); } else if(ruleFormat.length == 2){ $("#luckysheet-editorConditionRule-dialog .colorGradationBox #type2").val("twoColor"); $("#luckysheet-editorConditionRule-dialog .colorGradationBox .midVal").hide(); $("#luckysheet-editorConditionRule-dialog .colorGradationBox .maxVal .luckysheet-conditionformat-config-color").spectrum("set", ruleFormat[0]); $("#luckysheet-editorConditionRule-dialog .colorGradationBox .minVal .luckysheet-conditionformat-config-color").spectrum("set", ruleFormat[1]); } } else if(type1 == "icons"){ let len = ruleFormat["len"]; let l = ruleFormat["leftMin"]; let t = ruleFormat["top"]; $("#luckysheet-editorConditionRule-dialog .iconsBox li").each(function(i, e){ if($(e).find("div").attr("data-len") == len && $(e).find("div").attr("data-leftmin") == l && $(e).find("div").attr("data-top") == t){ $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").css("background-position", $(e).find("div").css("background-position")); $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").attr("data-len", $(e).find("div").attr("data-len")); $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").attr("data-leftmin", $(e).find("div").attr("data-leftmin")); $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").attr("data-top", $(e).find("div").attr("data-leftmin")); $("#luckysheet-editorConditionRule-dialog .iconsBox .showbox .model").attr("title", $(e).find("div").attr("title")); return true; } }); } } else{ if(type1 == "number"){ $("#luckysheet-editorConditionRule-dialog .numberBox #type2").val(conditionName); let val1; if(rule.conditionRange[0] != null){ val1 = getRangetxt(Store.currentSheetIndex, { "row": rule.conditionRange[0]["row"], "column": rule.conditionRange[0]["column"] }, Store.currentSheetIndex); } else{ val1 = rule.conditionValue[0]; } $("#luckysheet-editorConditionRule-dialog .numberBox #conditionVal input").val(val1); if(conditionName == "betweenness"){ $("#luckysheet-editorConditionRule-dialog .numberBox .txt").show(); $("#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2").show(); let val2; if(rule.conditionRange[1] != null){ val2 = getRangetxt(Store.currentSheetIndex, { "row": rule.conditionRange[1]["row"], "column": rule.conditionRange[1]["column"] }, Store.currentSheetIndex); } else{ val2 = rule.conditionValue[1]; } $("#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2 input").val(val2); } else{ $("#luckysheet-editorConditionRule-dialog .numberBox .txt").hide(); $("#luckysheet-editorConditionRule-dialog .numberBox #conditionVal2").hide(); } } else if(type1 == "text"){ let val1; if(rule.conditionRange[0] != null){ val1 = getRangetxt(Store.currentSheetIndex, { "row": rule.conditionRange[0]["row"], "column": rule.conditionRange[0]["column"] }, Store.currentSheetIndex); } else{ val1 = rule.conditionValue[0]; } $("#luckysheet-editorConditionRule-dialog .textBox #conditionVal input").val(val1); } else if(type1 == "date"){ _this.daterangeInit("luckysheet-editorConditionRule-dialog"); let val1 = rule.conditionValue[0]; $("#luckysheet-editorConditionRule-dialog .dateBox #daterange-btn").val(val1); } else if(type1 == "top" || type1 == "last"){ let val1 = rule.conditionValue[0]; if(conditionName == "top10%" || conditionName == "last10%"){ $("#luckysheet-editorConditionRule-dialog #isPercent").attr("checked", "checked"); } } else{ if(conditionName == "formula"){ let val1 = rule.conditionValue[0]; $("#luckysheet-editorConditionRule-dialog #formulaConditionVal input").val(val1); } } $("#luckysheet-editorConditionRule-dialog #textcolorshow").spectrum("set", ruleFormat.textColor); $("#luckysheet-editorConditionRule-dialog #cellcolorshow").spectrum("set", ruleFormat.cellColor); } }, infoDialog: function(title, content){ $("#luckysheet-modal-dialog-mask").show(); $("#luckysheet-conditionformat-info-dialog").remove(); $("body").first().append(replaceHtml(modelHTML, { "id": "luckysheet-conditionformat-info-dialog", "addclass": "", "title": title, "content": content, "botton": `<button id="luckysheet-conditionformat-info-dialog-close" class="btn btn-default">${locale().conditionformat.close}</button>`, "style": "z-index:100003" })); let $t = $("#luckysheet-conditionformat-info-dialog") .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(); $("#luckysheet-conditionformat-info-dialog").css({ "left": (winw + scrollLeft - myw) / 2, "top": (winh + scrollTop - myh) / 3 }).show(); }, getRuleExplain: function(index){ const conditionformat_Text = locale().conditionformat; let textCellColorHtml = this.textCellColorHtml(); let ruleExplainHtml; switch(index){ case 0: //基于各自值设置所有单元格的格式 ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem1}:</div> <div style="height: 30px;margin-bottom: 5px;"> <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.formatStyle}:</label> <select id="type1"> <option value="dataBar">${conditionformat_Text.dataBar}</option> <option value="colorGradation">${conditionformat_Text.colorGradation}</option> <option value="icons">${conditionformat_Text.icons}</option> </select> </div> <div> <div class="type1Box dataBarBox"> <div style="height: 30px;margin-bottom: 5px;"> <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.fillType}:</label> <select id="type2"> <option value="gradient">${conditionformat_Text.gradient}</option> <option value="solid">${conditionformat_Text.solid}</option> </select> </div> <div style="height: 30px;margin-bottom: 5px;"> <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.color}:</label> <input data-tips="${conditionformat_Text.dataBarColor}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="#638ec6" style="display: none;"> </div> </div> <div class="type1Box colorGradationBox" style="display: none;"> <div style="height: 30px;margin-bottom: 5px;"> <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.fillType}:</label> <select id="type2"> <option value="threeColor">${conditionformat_Text.tricolor}</option> <option value="twoColor">${conditionformat_Text.twocolor}</option> </select> </div> <div class="maxVal" style="height: 30px;margin-bottom: 5px;"> <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.maxValue}:</label> <input data-tips="${conditionformat_Text.maxValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(99, 190, 123)" style="display: none;"> </div> <div class="midVal" style="height: 30px;margin-bottom: 5px;"> <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.medianValue}:</label> <input data-tips="${conditionformat_Text.medianValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(255, 235, 132)" style="display: none;"> </div> <div class="minVal" style="height: 30px;margin-bottom: 5px;"> <label style="display: block;width: 80px;height: 30px;line-height: 30px;float: left;">${conditionformat_Text.minValue}:</label> <input data-tips="${conditionformat_Text.minValue} ${conditionformat_Text.color}" data-func="background" class="luckysheet-conditionformat-config-color" type="text" value="rgb(248, 105, 107)" style="display: none;"> </div> </div> <div class="type1Box iconsBox" style="display: none;"> <label>${conditionformat_Text.fillType}:</label> <div class="showbox"> <div class="model" data-len="3" data-leftmin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 0;"></div> <span class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s" style="margin-top: 2px;"></span> </div> <ul> <li><div data-len="3" data-leftmin="0" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 0;"></div></li> <li><div data-len="3" data-leftmin="5" data-top="0" title="${conditionformat_Text.threeWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px 0;"></div></li> <li><div data-len="3" data-leftmin="0" data-top="1" title="${conditionformat_Text.threeTriangles}" style="background-position: 0 -20px;"></div></li> <li><div data-len="4" data-leftmin="0" data-top="2" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 -40px;"></div></li> <li><div data-len="4" data-leftmin="5" data-top="1" title="${conditionformat_Text.fourWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px -20px;"></div></li> <li><div data-len="5" data-leftmin="0" data-top="3" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.multicolor})" style="background-position: 0 -60px;"></div></li> <li><div data-len="5" data-leftmin="5" data-top="2" title="${conditionformat_Text.fiveWayArrow}(${conditionformat_Text.grayColor})" style="background-position: -131px -40px;"></div></li> <li><div data-len="3" data-leftmin="0" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.rimless})" style="background-position: 0 -80px;"></div></li> <li><div data-len="3" data-leftmin="5" data-top="4" title="${conditionformat_Text.threeColorTrafficLight}(${conditionformat_Text.bordered})" style="background-position: -131px -80px;"></div></li> <li><div data-len="3" data-leftmin="0" data-top="5" title="${conditionformat_Text.threeSigns}" style="background-position: 0 -100px;"></div></li> <li><div data-len="4" data-leftmin="5" data-top="5" title="${conditionformat_Text.fourColorTrafficLight}" style="background-position: -131px -100px;"></div></li> <li><div data-len="4" data-leftmin="0" data-top="6" title="${conditionformat_Text.greenRedBlackGradient}" style="background-position: 0 -120px;"></div></li> <li><div data-len="3" data-leftmin="0" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.circled})" style="background-position: 0 -140px;"></div></li> <li><div data-len="3" data-leftmin="5" data-top="7" title="${conditionformat_Text.threeSymbols}(${conditionformat_Text.noCircle})" style="background-position: -131px -140px;"></div></li> <li><div data-len="3" data-leftmin="0" data-top="8" title="${conditionformat_Text.tricolorFlag}" style="background-position: 0 -160px;"></div></li> <li><div data-len="3" data-leftmin="0" data-top="9" title="${conditionformat_Text.threeStars}" style="background-position: 0 -180px;"></div></li> <li><div data-len="5" data-leftmin="0" data-top="10" title="${conditionformat_Text.fiveQuadrantDiagram}" style="background-position: 0 -200px;"></div></li> <li><div data-len="5" data-leftmin="0" data-top="11" title="${conditionformat_Text.fiveBoxes}" style="background-position: 0 -220px;"></div></li> <li><div data-len="4" data-leftmin="5" data-top="9" title="${conditionformat_Text.grade4}" style="background-position: -131px -180px;"></div></li> <li><div data-len="5" data-leftmin="5" data-top="10" title="${conditionformat_Text.grade5}" style="background-position: -131px -200px;"></div></li> </ul> </div> </div>`; break; case 1: //只为包含以下内容的单元格设置格式 ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem2_title}:</div> <div style="height: 30px;margin-bottom: 10px;"> <select id="type1"> <option value="number">${conditionformat_Text.cellValue}</option> <option value="text">${conditionformat_Text.specificText}</option> <option value="date">${conditionformat_Text.occurrence}</option> </select> <div> <div class="type1Box numberBox"> <select id="type2"> <option value="greaterThan">${conditionformat_Text.greaterThan}</option> <option value="lessThan">${conditionformat_Text.lessThan}</option> <option value="betweenness">${conditionformat_Text.between}</option> <option value="equal">${conditionformat_Text.equal}</option> </select> <div class="inpbox range" id="conditionVal"> <input class="formulaInputFocus"/> <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i> </div> <span class="txt" style="display: none;">${conditionformat_Text.in}</span> <div class="inpbox range" id="conditionVal2" style="display: none;"> <input class="formulaInputFocus"/> <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectDataRange}"></i> </div> </div> <div class="type1Box textBox" style="display: none;"> <select id="type2"> <option value="">${conditionformat_Text.contain}</option> </select> <div class="inpbox range" id="conditionVal"> <input class="formulaInputFocus"/> <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i> </div> </div> <div class="type1Box dateBox" style="display: none;"> <div style="width: 162px;" class="inpbox"> <input style="width: 150px;" id="daterange-btn" readonly="readonly" placeholder="${conditionformat_Text.pleaseSelectADate}"/> </div> </div> </div> </div> <div class="title">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`; break; case 2: //仅对排名靠前或靠后的数值设置格式 ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem3_title}:</div> <div style="height: 30px;margin-bottom: 10px;"> <select id="type1"> <option value="top">${conditionformat_Text.top}</option> <option value="last">${conditionformat_Text.last}</option> </select> <div class="inpbox" id="conditionVal"> <input class="formulaInputFocus" type="number" value="10"/> </div> <input id="isPercent" type="checkbox"/> <label for="isPercent" class="txt">${conditionformat_Text.selectRange_percent}</label> </div> <div class="title">${conditionformat_Text.setFormat}:</div>${textCellColorHtml}`; break; case 3: //仅对高于或低于平均值的数值设置格式 ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem4_title}:</div> <div style="height: 30px;margin-bottom: 10px;"> <select id="type1"> <option value="AboveAverage">${conditionformat_Text.above}</option> <option value="SubAverage">${conditionformat_Text.below}</option> </select> <span class="txt">${conditionformat_Text.selectRange_average}</span> </div> <div class="title">${conditionformat_Text.setFormat}:</div>${textCellColorHtml}`; break; case 4: //仅对唯一值或重复值设置格式 ruleExplainHtml = `<div class="title">${conditionformat_Text.all}:</div> <div style="height: 30px;margin-bottom: 10px;"> <select id="type1"> <option value="0">${conditionformat_Text.duplicateValue}</option> <option value="1">${conditionformat_Text.uniqueValue}</option> </select> <span class="txt">${conditionformat_Text.selectRange_value}</span> </div> <div class="title">${conditionformat_Text.setFormat}:</div>${textCellColorHtml}`; break; case 5: //使用公式确定要设置格式的单元格 ruleExplainHtml = `<div class="title">${conditionformat_Text.ruleTypeItem2_title}:</div> <div style="height: 30px;margin-bottom: 10px;"> <div class="inpbox range" id="formulaConditionVal" style="width: 250px;"> <input class="formulaInputFocus" style="width: 200px;"/> <i class="fa fa-table" aria-hidden="true" title="${conditionformat_Text.selectCell}"></i> </div> </div> <div class="title">${conditionformat_Text.setFormat}: </div>${textCellColorHtml}`; break; } return ruleExplainHtml; }, daterangeInit: function(id){ const conditionformat_Text = locale().conditionformat; //日期选择插件 $('.ranges_1 ul').remove(); $('#' + id).find("#daterange-btn").flatpickr({ mode: "range", onChange: function (data, label) { const [start, end] = data //label:通过它来知道用户选择的是什么,传给后台进行相应的展示 let format1 = [ conditionformat_Text.yesterday, conditionformat_Text.today ]; let format2 = [ conditionformat_Text.lastWeek, conditionformat_Text.thisWeek, conditionformat_Text.lastMonth, conditionformat_Text.thisMonth, conditionformat_Text.lastYear, conditionformat_Text.thisYear, conditionformat_Text.last7days, conditionformat_Text.last30days ] if (label == conditionformat_Text.all) { $('#daterange-btn').val(''); } else if (format1.indexOf(label) > -1) { $('#daterange-btn').val(dayjs(start).format('YYYY/MM/DD')); } else if (format2.indexOf(label) > -1) { $('#daterange-btn').val(dayjs(start).format('YYYY/MM/DD') + '-' + dayjs(end).format('YYYY/MM/DD')); } } }); }, CFSplitRange: function(range1, range2, range3, type){ let range = []; let offset_r = range3["row"][0] - range2["row"][0]; let offset_c = range3["column"][0] - range2["column"][0]; let r1 = range1["row"][0], r2 = range1["row"][1]; let c1 = range1["column"][0], c2 = range1["column"][1]; if(r1 >= range2["row"][0] && r2 <= range2["row"][1] && c1 >= range2["column"][0] && c2 <= range2["column"][1]){ //选区 包含 条件格式应用范围 全部 if(type == "allPart"){ //所有部分 range = [ { "row": [r1 + offset_r, r2 + offset_r], "column": [c1 + offset_c, c2 + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = []; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [r1 + offset_r, r2 + offset_r], "column": [c1 + offset_c, c2 + offset_c] } ]; } } else if(r1 >= range2["row"][0] && r1 <= range2["row"][1] && c1 >= range2["column"][0] && c2 <= range2["column"][1]){ //选区 行贯穿 条件格式应用范围 上部分 if(type == "allPart"){ //所有部分 range = [ { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] }, { "row": [r1 + offset_r, range2["row"][1] + offset_r], "column": [c1 + offset_c, c2 + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [r1 + offset_r, range2["row"][1] + offset_r], "column": [c1 + offset_c, c2 + offset_c] } ]; } } else if(r2 >= range2["row"][0] && r2 <= range2["row"][1] && c1 >= range2["column"][0] && c2 <= range2["column"][1]){ //选区 行贯穿 条件格式应用范围 下部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0] + offset_r, r2 + offset_r], "column": [c1 + offset_c, c2 + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [range2["row"][0] + offset_r, r2 + offset_r], "column": [c1 + offset_c, c2 + offset_c] } ]; } } else if(r1 < range2["row"][0] && r2 > range2["row"][1] && c1 >= range2["column"][0] && c2 <= range2["column"][1]){ //选区 行贯穿 条件格式应用范围 中间部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] }, { "row": [range2["row"][0] + offset_r, range2["row"][1] + offset_r], "column": [c1 + offset_c, c2 + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [range2["row"][0] + offset_r, range2["row"][1] + offset_r], "column": [c1 + offset_c, c2 + offset_c] } ]; } } else if(c1 >= range2["column"][0] && c1 <= range2["column"][1] && r1 >= range2["row"][0] && r2 <= range2["row"][1]){ //选区 列贯穿 条件格式应用范围 左部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, r2], "column": [range2["column"][1] + 1, c2] }, { "row": [r1 + offset_r, r2 + offset_r], "column": [c1 + offset_c, range2["column"][1] + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, r2], "column": [range2["column"][1] + 1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [r1 + offset_r, r2 + offset_r], "column": [c1 + offset_c, range2["column"][1] + offset_c] } ]; } } else if(c2 >= range2["column"][0] && c2 <= range2["column"][1] && r1 >= range2["row"][0] && r2 <= range2["row"][1]){ //选区 列贯穿 条件格式应用范围 右部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, r2], "column": [c1, range2["column"][0] - 1] }, { "row": [r1 + offset_r, r2 + offset_r], "column": [range2["column"][0] + offset_c, c2 + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, r2], "column": [c1, range2["column"][0] - 1] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [r1 + offset_r, r2 + offset_r], "column": [range2["column"][0] + offset_c, c2 + offset_c] } ]; } } else if(c1 < range2["column"][0] && c2 > range2["column"][1] && r1 >= range2["row"][0] && r2 <= range2["row"][1]){ //选区 列贯穿 条件格式应用范围 中间部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, r2], "column": [c1, range2["column"][0] - 1] }, { "row": [r1, r2], "column": [range2["column"][1] + 1, c2] }, { "row": [r1 + offset_r, r2 + offset_r], "column": [range2["column"][0] + offset_c, range2["column"][1] + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, r2], "column": [c1, range2["column"][0] - 1] }, { "row": [r1, r2], "column": [range2["column"][1] + 1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [r1 + offset_r, r2 + offset_r], "column": [range2["column"][0] + offset_c, range2["column"][1] + offset_c] } ]; } } else if(r1 >= range2["row"][0] && r1 <= range2["row"][1] && c1 >= range2["column"][0] && c1 <= range2["column"][1]){ //选区 包含 条件格式应用范围 左上角部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][1]], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] }, { "row": [r1 + offset_r, range2["row"][1] + offset_r], "column": [c1 + offset_c, range2["column"][1] + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][1]], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [r1 + offset_r, range2["row"][1] + offset_r], "column": [c1 + offset_c, range2["column"][1] + offset_c] } ]; } } else if(r1 >= range2["row"][0] && r1 <= range2["row"][1] && c2 >= range2["column"][0] && c2 <= range2["column"][1]){ //选区 包含 条件格式应用范围 右上角部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][1]], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] }, { "row": [r1 + offset_r, range2["row"][1] + offset_r], "column": [range2["column"][0] + offset_c, c2 + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][1]], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [r1 + offset_r, range2["row"][1] + offset_r], "column": [range2["column"][0] + offset_c, c2 + offset_c] } ]; } } else if(r2 >= range2["row"][0] && r2 <= range2["row"][1] && c1 >= range2["column"][0] && c1 <= range2["column"][1]){ //选区 包含 条件格式应用范围 左下角部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], r2], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][0] + offset_r, r2 + offset_r], "column": [c1 + offset_c, range2["column"][1] + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], r2], "column": [range2["column"][1] + 1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [range2["row"][0] + offset_r, r2 + offset_r], "column": [c1 + offset_c, range2["column"][1] + offset_c] } ]; } } else if(r2 >= range2["row"][0] && r2 <= range2["row"][1] && c2 >= range2["column"][0] && c2 <= range2["column"][1]){ //选区 包含 条件格式应用范围 右下角部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], r2], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][0] + offset_r, r2 + offset_r], "column": [range2["column"][0] + offset_c, c2 + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], r2], "column": [c1, range2["column"][0] - 1] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [range2["row"][0] + offset_r, r2 + offset_r], "column": [range2["column"][0] + offset_c, c2 + offset_c] } ]; } } else if(r1 < range2["row"][0] && r2 > range2["row"][1] && c1 >= range2["column"][0] && c1 <= range2["column"][1]){ //选区 包含 条件格式应用范围 左中间部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], range2["row"][1]], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] }, { "row": [range2["row"][0] + offset_r, range2["row"][1] + offset_r], "column": [c1 + offset_c, range2["column"][1] + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], range2["row"][1]], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [range2["row"][0] + offset_r, range2["row"][1] + offset_r], "column": [c1 + offset_c, range2["column"][1] + offset_c] } ]; } } else if(r1 < range2["row"][0] && r2 > range2["row"][1] && c2 >= range2["column"][0] && c2 <= range2["column"][1]){ //选区 包含 条件格式应用范围 右中间部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], range2["row"][1]], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] }, { "row": [range2["row"][0] + offset_r, range2["row"][1] + offset_r], "column": [range2["column"][0] + offset_c, c2 + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], range2["row"][1]], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [range2["row"][0] + offset_r, range2["row"][1] + offset_r], "column": [range2["column"][0] + offset_c, c2 + offset_c] } ]; } } else if(c1 < range2["column"][0] && c2 > range2["column"][1] && r1 >= range2["row"][0] && r1 <= range2["row"][1]){ //选区 包含 条件格式应用范围 上中间部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][1]], "column": [c1, range2["column"][0] - 1] }, { "row": [r1, range2["row"][1]], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] }, { "row": [r1 + offset_r, range2["row"][1] + offset_r], "column": [range2["column"][0] + offset_c, range2["column"][1] + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][1]], "column": [c1, range2["column"][0] - 1] }, { "row": [r1, range2["row"][1]], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [r1 + offset_r, range2["row"][1] + offset_r], "column": [range2["column"][0] + offset_c, range2["column"][1] + offset_c] } ]; } } else if(c1 < range2["column"][0] && c2 > range2["column"][1] && r2 >= range2["row"][0] && r2 <= range2["row"][1]){ //选区 包含 条件格式应用范围 下中间部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], r2], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][0], r2], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][0] + offset_r, r2 + offset_r], "column": [range2["column"][0] + offset_c, range2["column"][1] + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], r2], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][0], r2], "column": [range2["column"][1] + 1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [range2["row"][0] + offset_r, r2 + offset_r], "column": [range2["column"][0] + offset_c, range2["column"][1] + offset_c] } ]; } } else if(r1 < range2["row"][0] && r2 > range2["row"][1] && c1 < range2["column"][0] && c2 > range2["column"][1]){ //选区 包含 条件格式应用范围 正中间部分 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], range2["row"][1]], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][0], range2["row"][1]], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] }, { "row": [range2["row"][0] + offset_r, range2["row"][1] + offset_r], "column": [range2["column"][0] + offset_c, range2["column"][1] + offset_c] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, range2["row"][0] - 1], "column": [c1, c2] }, { "row": [range2["row"][0], range2["row"][1]], "column": [c1, range2["column"][0] - 1] }, { "row": [range2["row"][0], range2["row"][1]], "column": [range2["column"][1] + 1, c2] }, { "row": [range2["row"][1] + 1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = [ { "row": [range2["row"][0] + offset_r, range2["row"][1] + offset_r], "column": [range2["column"][0] + offset_c, range2["column"][1] + offset_c] } ]; } } else{ //选区 在 条件格式应用范围 之外 if(type == "allPart"){ //所有部分 range = [ { "row": [r1, r2], "column": [c1, c2] } ]; } else if(type == "restPart"){ //剩余部分 range = [ { "row": [r1, r2], "column": [c1, c2] } ]; } else if(type == "operatePart"){ //操作部分 range = []; } } return range; }, getcolorGradation: function(color1, color2, value1, value2, value){ let rgb1 = color1.split(','); let r1 = parseInt(rgb1[0].split('(')[1]); let g1 = parseInt(rgb1[1]); let b1 = parseInt(rgb1[2].split(')')[0]); let rgb2 = color2.split(','); let r2 = parseInt(rgb2[0].split('(')[1]); let g2 = parseInt(rgb2[1]); let b2 = parseInt(rgb2[2].split(')')[0]); let r = Math.round(r1 - (r1 - r2) / (value1 - value2) * (value1 - value)); let g = Math.round(g1 - (g1 - g2) / (value1 - value2) * (value1 - value)); let b = Math.round(b1 - (b1 - b2) / (value1 - value2) * (value1 - value)); return "rgb("+ r +", "+ g +", "+ b +")"; }, getCFPartRange: function(sheetIndex, range1, range2){ let ruleArr = []; let cf = Store.luckysheetfile[getSheetIndex(sheetIndex)].luckysheet_conditionformat_save; if(cf != null && cf.length > 0){ label: for(let i = 0; i < cf.length; i++){ let cellrange = cf[i].cellrange; for(let j = 0; j < cellrange.length; j++){ let r1 = cellrange[j].row[0], r2 = cellrange[j].row[1]; let c1 = cellrange[j].column[0], c2 = cellrange[j].column[1]; for(let s = 0; s < range.length; s++){ if((range[s].row[0] >= r1 && range[s].row[0] <= r2) || (range[s].row[1] >= r1 && range[s].row[1] <= r2) || (range[s].column[0] >= c1 && range[s].column[0] <= c2) || (range[s].column[1] >= c1 && range[s].column[1] <= c2)){ ruleArr.push(cf[i]); continue label; } } } } } return ruleArr; }, checksCF: function(r, c, computeMap){ if(computeMap != null && (r + "_" + c) in computeMap){ return computeMap[r + "_" + c]; } else{ return null; } }, getComputeMap: function(sheetIndex){ let index = getSheetIndex(Store.currentSheetIndex); if(sheetIndex != null){ index = getSheetIndex(sheetIndex); } let ruleArr = Store.luckysheetfile[index]["luckysheet_conditionformat_save"]; let data = Store.luckysheetfile[index]["data"]; if(data == null){ return null; } let computeMap = this.compute(ruleArr, data); return computeMap; }, compute: function(ruleArr, d){ let _this = this; if(ruleArr == null){ ruleArr = []; } //条件计算存储 let computeMap = {}; if(ruleArr.length > 0){ for(let i = 0; i < ruleArr.length; i++){ let type = ruleArr[i]["type"]; let cellrange = ruleArr[i]["cellrange"]; let format = ruleArr[i]["format"]; if(type == "dataBar"){ //数据条 let max = null, min = null; for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ if(max == null || parseInt(cell.v) > max){ max = parseInt(cell.v); } if(min == null || parseInt(cell.v) < min){ min = parseInt(cell.v); } } } } } if(max != null && min != null){ if(min < 0){ //选区范围内有负数 let plusLen = Math.round(max / (max - min) * 10) / 10; //正数所占比 let minusLen = Math.round(Math.abs(min) / (max - min) * 10) / 10; //负数所占比 for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ if(parseInt(cell.v) < 0){ //负数 let valueLen = Math.round(Math.abs(parseInt(cell.v)) / Math.abs(min) * 100) / 100; if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["dataBar"] = { "valueType": "minus", "minusLen": minusLen, "valueLen": valueLen, "format": format }; } else{ computeMap[r + "_" + c] = { "dataBar": { "valueType": "minus", "minusLen": minusLen, "valueLen": valueLen, "format": format } }; } } if(parseInt(cell.v) > 0){ //正数 let valueLen = Math.round(parseInt(cell.v) / max * 100) / 100; if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["dataBar"] = { "valueType": "plus", "plusLen": plusLen, "minusLen": minusLen, "valueLen": valueLen, "format": format }; } else{ computeMap[r + "_" + c] = { "dataBar": { "valueType": "plus", "plusLen": plusLen, "minusLen": minusLen, "valueLen": valueLen, "format": format } }; } } } } } } } else{ let plusLen = 1; for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ let valueLen; if(max == 0){ valueLen = 1; } else{ valueLen = Math.round(parseInt(cell.v) / max * 100) / 100; } if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["dataBar"] = { "valueType": "plus", "plusLen": plusLen, "valueLen": valueLen, "format": format }; } else{ computeMap[r + "_" + c] = { "dataBar": { "valueType": "plus", "plusLen": plusLen, "valueLen": valueLen, "format": format } }; } } } } } } } } else if(type == "colorGradation"){ //色阶 let max = null, min = null, sum = 0, count = 0; for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ count++; sum += parseInt(cell.v); if(max == null || parseInt(cell.v) > max){ max = parseInt(cell.v); } if(min == null || parseInt(cell.v) < min){ min = parseInt(cell.v); } } } } } if(max != null && min != null){ if(format.length == 3){ //三色色阶 let avg = Math.floor(sum / count); for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ if(parseInt(cell.v) == min){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["cellColor"] = format[2]; } else{ computeMap[r + "_" + c] = { "cellColor": format[2] }; } } else if(parseInt(cell.v) > min && parseInt(cell.v) < avg){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["cellColor"] = _this.getcolorGradation(format[2], format[1], min, avg, parseInt(cell.v)); } else{ computeMap[r + "_" + c] = { "cellColor": _this.getcolorGradation(format[2], format[1], min, avg, parseInt(cell.v)) }; } } else if(parseInt(cell.v) == avg){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["cellColor"] = format[1]; } else{ computeMap[r + "_" + c] = { "cellColor": format[1] }; } } else if(parseInt(cell.v) > avg && parseInt(cell.v) < max){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["cellColor"] = _this.getcolorGradation(format[1], format[0], avg, max, parseInt(cell.v)); } else{ computeMap[r + "_" + c] = { "cellColor": _this.getcolorGradation(format[1], format[0], avg, max, parseInt(cell.v)) }; } } else if(parseInt(cell.v) == max){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["cellColor"] = format[0]; } else{ computeMap[r + "_" + c] = { "cellColor": format[0] }; } } } } } } } else if(format.length == 2){ //两色色阶 for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ if(parseInt(cell.v) == min){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["cellColor"] = format[1]; } else{ computeMap[r + "_" + c] = { "cellColor": format[1] }; } } else if(parseInt(cell.v) > min && parseInt(cell.v) < max){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["cellColor"] = _this.getcolorGradation(format[1], format[0], min, max, parseInt(cell.v)); } else{ computeMap[r + "_" + c] = { "cellColor": _this.getcolorGradation(format[1], format[0], min, max, parseInt(cell.v)) }; } } else if(parseInt(cell.v) == max){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["cellColor"] = format[0]; } else{ computeMap[r + "_" + c] = { "cellColor": format[0] }; } } } } } } } } } else if(type == "icons"){ //图标集 let len = parseInt(format["len"]); let leftMin = parseInt(format["leftMin"]); let top = parseInt(format["top"]); let max = null, min = null; for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ if(max == null || parseInt(cell.v) > max){ max = parseInt(cell.v); } if(min == null || parseInt(cell.v) < min){ min = parseInt(cell.v); } } } } } if(max != null && min != null){ let a = Math.floor((max - min + 1) / len); let b = (max - min + 1) % len; if(len == 3){ //一组图标有三个 let v1, v2, v3; if(b == 2){ v1 = [min, min + a]; v2 = [min + a + 1, min + a * 2]; v3 = [min + a * 2 + 1, max]; } else{ v1 = [min, min + a - 1]; v2 = [min + a, min + a * 2 - 1]; v3 = [min + a * 2, max]; } for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 2, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 2, "top": top} }; } } else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 1, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 1, "top": top} }; } } else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin, "top": top} }; } } } } } } } else if(len == 4){ //一组图标有四个 let v1, v2, v3, v4; if(b == 2){ v1 = [min, min + a]; v2 = [min + a + 1, min + a * 2]; v3 = [min + a * 2 + 1, min + a * 3]; v4 = [min + a * 3 + 1, max]; } else if(b == 3){ v1 = [min, min + a]; v2 = [min + a + 1, min + a * 2]; v3 = [min + a * 2 + 1, min + a * 3 + 1]; v4 = [min + a * 3 + 2, max]; } else{ v1 = [min, min + a - 1]; v2 = [min + a, min + a * 2 - 1]; v3 = [min + a * 2, min + a * 3 - 1]; v4 = [min + a * 3, max]; } for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 3, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 3, "top": top} }; } } else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 2, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 2, "top": top} }; } } else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 1, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 1, "top": top} }; } } else if(parseInt(cell.v) >= v4[0] && parseInt(cell.v) <= v4[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin, "top": top} }; } } } } } } } else if(len == 5){ //一组图标有五个 let v1, v2, v3, v4, v5; if(b == 2){ v1 = [min, min + a]; v2 = [min + a + 1, min + a * 2]; v3 = [min + a * 2 + 1, min + a * 3]; v4 = [min + a * 3 + 1, min + a * 4]; v5 = [min + a * 4 + 1, max]; } else if(b == 3){ v1 = [min, min + a]; v2 = [min + a + 1, min + a * 2]; v3 = [min + a * 2 + 1, min + a * 3 + 1]; v4 = [min + a * 3 + 2, min + a * 4 + 1]; v5 = [min + a * 4 + 2, max]; } else if(b == 4){ v1 = [min, min + a]; v2 = [min + a + 1, min + a * 2 + 1]; v3 = [min + a * 2 + 2, min + a * 3 + 1]; v4 = [min + a * 3 + 2, min + a * 4 + 2]; v5 = [min + a * 4 + 3, max]; } else{ v1 = [min, min + a - 1]; v2 = [min + a, min + a * 2 - 1]; v3 = [min + a * 2, min + a * 3 - 1]; v4 = [min + a * 3, min + a * 4 - 1]; v5 = [min + a * 4, max]; } for(let s = 0; s < cellrange.length; s++){ for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } let cell = d[r][c]; if(getObjType(cell) == "object" && cell["ct"] != null && cell["ct"].t == "n" && cell.v != null){ if(parseInt(cell.v) >= v1[0] && parseInt(cell.v) <= v1[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 4, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 4, "top": top} }; } } else if(parseInt(cell.v) >= v2[0] && parseInt(cell.v) <= v2[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 3, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 3, "top": top} }; } } else if(parseInt(cell.v) >= v3[0] && parseInt(cell.v) <= v3[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 2, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 2, "top": top} }; } } else if(parseInt(cell.v) >= v4[0] && parseInt(cell.v) <= v4[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin + 1, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin + 1, "top": top} }; } } else if(parseInt(cell.v) >= v5[0] && parseInt(cell.v) <= v5[1]){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["icons"] = {"left": leftMin, "top": top}; } else{ computeMap[r + "_" + c] = { "icons": {"left": leftMin, "top": top} }; } } } } } } } } } else{ //获取变量值 let conditionName = ruleArr[i].conditionName, //条件名称 conditionValue0 = ruleArr[i].conditionValue[0], //条件值1 conditionValue1 = ruleArr[i].conditionValue[1], //条件值2 textColor = format.textColor, //条件格式文本颜色 fc cellColor = format.cellColor; //条件格式单元格颜色 bg for(let s = 0; s < cellrange.length; s++){ //条件类型判断 if(conditionName == "greaterThan" || conditionName == "lessThan" || conditionName == "equal" || conditionName == "textContains"){ //循环应用范围计算 for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } //单元格值 let cell = d[r][c]; if(getObjType(cell) != "object" || isRealNull(cell.v)){ continue; } //符合条件 if(conditionName == "greaterThan" && cell.v > conditionValue0){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } else if(conditionName == "lessThan" && cell.v < conditionValue0){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } else if(conditionName == "equal" && cell.v == conditionValue0){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } else if(conditionName == "textContains" && cell.v.toString().indexOf(conditionValue0) != -1){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } else if(conditionName == "betweenness"){ //比较条件值1和条件值2的大小 let vBig, vSmall; if(conditionValue0 > conditionValue1){ vBig = conditionValue0; vSmall = conditionValue1; } else{ vBig = conditionValue1; vSmall = conditionValue0; } //循环应用范围计算 for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } //单元格值 let cell = d[r][c]; if(getObjType(cell) != "object" || isRealNull(cell.v)){ continue; } //符合条件 if(cell.v >= vSmall && cell.v <= vBig){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } else if(conditionName == "occurrenceDate"){ //获取日期所对应的数值 let dBig, dSmall; if(conditionValue0.toString().indexOf("-") == -1){ dBig = genarate(conditionValue0)[2]; dSmall = genarate(conditionValue0)[2]; } else{ let str = conditionValue0.toString().split("-"); dBig = genarate(str[1].trim())[2]; dSmall = genarate(str[0].trim())[2]; } //循环应用范围计算 for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } //单元格值类型为日期类型 if(d[r][c].ct != null && d[r][c].ct.t == "d"){ //单元格值 let cellVal = getcellvalue(r, c, d); //符合条件 if(cellVal >= dSmall && cellVal <= dBig){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } } else if(conditionName == "duplicateValue"){ //应用范围单元格值处理 let dmap = {}; for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ let item = getcellvalue(r, c, d); if(!(item in dmap)){ dmap[item] = []; } dmap[item].push({"r": r, "c": c}); } } //循环应用范围计算 if(conditionValue0 == "0"){//重复值 for(let x in dmap){ if(x != "null" && x != "undefined" && dmap[x].length > 1){ for(let j = 0; j < dmap[x].length; j++){ if((dmap[x][j].r + "_" + dmap[x][j].c) in computeMap){ computeMap[dmap[x][j].r + "_" + dmap[x][j].c]["textColor"] = textColor; computeMap[dmap[x][j].r + "_" + dmap[x][j].c]["cellColor"] = cellColor; } else{ computeMap[dmap[x][j].r + "_" + dmap[x][j].c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } if(conditionValue0 == "1"){//唯一值 for(let x in dmap){ if(x != "null" && x != "undefined" && dmap[x].length == 1){ if((dmap[x][0].r + "_" + dmap[x][0].c) in computeMap){ computeMap[dmap[x][0].r + "_" + dmap[x][0].c]["textColor"] = textColor; computeMap[dmap[x][0].r + "_" + dmap[x][0].c]["cellColor"] = cellColor; } else{ computeMap[dmap[x][0].r + "_" + dmap[x][0].c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } else if(conditionName == "top10" || conditionName == "top10%" || conditionName == "last10" || conditionName == "last10%" || conditionName == "AboveAverage" || conditionName == "SubAverage"){ //应用范围单元格值(数值型) let dArr=[]; for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } //单元格值类型为数字类型 if(d[r][c].ct != null && d[r][c].ct.t == "n"){ dArr.push(getcellvalue(r, c, d)); } } } //数组处理 if(conditionName == "top10" || conditionName == "top10%" || conditionName == "last10" || conditionName == "last10%"){ //从大到小排序 for(let j = 0; j < dArr.length; j++){ for(let k = 0; k < dArr.length - 1 - j; k++){ if(dArr[k]<dArr[k+1]){ let temp=dArr[k]; dArr[k]=dArr[k+1]; dArr[k+1]=temp; } } } //取条件值数组 let cArr if(conditionName == "top10"){ cArr = dArr.slice(0, conditionValue0); //前10项数组 } else if(conditionName == "top10%"){ cArr = dArr.slice(0, Math.floor(conditionValue0*dArr.length/100)); //前10%数组 } else if(conditionName == "last10"){ cArr = dArr.slice((dArr.length-conditionValue0), dArr.length); //最后10项数组 } else if(conditionName == "last10%"){ cArr = dArr.slice((dArr.length-Math.floor(conditionValue0*dArr.length/100)), dArr.length); //最后10%数组 } //循环应用范围计算 for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } //单元格值 let cellVal = getcellvalue(r, c, d); //符合条件 if(cArr.indexOf(cellVal) != -1){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } else if(conditionName == "AboveAverage" || conditionName == "SubAverage"){ //计算数组平均值 let sum = 0; for(let j = 0; j < dArr.length; j++){ sum += dArr[j]; } let averageNum = sum / dArr.length; //循环应用范围计算 if(conditionName == "AboveAverage"){ //高于平均值 for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } //单元格值 let cellVal = getcellvalue(r, c, d); //符合条件 if(cellVal > averageNum){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } else if(conditionName == "SubAverage"){ //低于平均值 for(let r = cellrange[s].row[0]; r <= cellrange[s].row[1]; r++){ for(let c = cellrange[s].column[0]; c <= cellrange[s].column[1]; c++){ if(d[r] == null || d[r][c] == null){ continue; } //单元格值 let cellVal = getcellvalue(r, c, d); //符合条件 if(cellVal < averageNum){ if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } } } else if(conditionName == "formula"){ let str = cellrange[s].row[0], edr = cellrange[s].row[1], stc = cellrange[s].column[0], edc = cellrange[s].column[1]; let formulaTxt = conditionValue0; if(conditionValue0.toString().slice(0, 1) != '='){ formulaTxt = '=' + conditionValue0; } for(let r = str; r <= edr; r++){ for(let c = stc; c <= edc; c++){ let func = formulaTxt; let offsetRow = r - str; let offsetCol = c - stc; if(offsetRow > 0){ func = "=" + formula.functionCopy(func, "down", offsetRow); } if(offsetCol > 0){ func = "=" + formula.functionCopy(func, "right", offsetCol); } let funcV = formula.execfunction(func); let v = funcV[1]; if(typeof v != 'boolean'){ v = !!Number(v); } if(!v){ continue; } if((r + "_" + c) in computeMap){ computeMap[r + "_" + c]["textColor"] = textColor; computeMap[r + "_" + c]["cellColor"] = cellColor; } else{ computeMap[r + "_" + c] = { "textColor": textColor, "cellColor": cellColor }; } } } } } } } } return computeMap; }, updateItem: function(type, cellrange, format){ if(!checkProtectionFormatCells(Store.currentSheetIndex)){ return; } let _this = this; let index = getSheetIndex(Store.currentSheetIndex); //保存之前的规则 let fileH = $.extend(true, [], Store.luckysheetfile); let historyRules = _this.getHistoryRules(fileH); //保存当前的规则 let ruleArr; if(type == "delSheet"){ ruleArr = []; } else{ let rule = { "type": type, "cellrange": cellrange, "format": format }; ruleArr = Store.luckysheetfile[index]["luckysheet_conditionformat_save"] == null ? [] : Store.luckysheetfile[index]["luckysheet_conditionformat_save"]; ruleArr.push(rule); } Store.luckysheetfile[index]["luckysheet_conditionformat_save"] = ruleArr; let fileC = $.extend(true, [], Store.luckysheetfile); let currentRules = _this.getCurrentRules(fileC); //刷新一次表格 _this.ref(historyRules, currentRules); //发送给后台 if(server.allowUpdate){ server.saveParam("all", Store.currentSheetIndex, ruleArr, { "k": "luckysheet_conditionformat_save" }); } }, getHistoryRules: function(fileH){ let historyRules = []; for(let h = 0; h < fileH.length; h++){ historyRules.push({"sheetIndex": fileH[h]["index"], "luckysheet_conditionformat_save": fileH[h]["luckysheet_conditionformat_save"]}); } return historyRules; }, getCurrentRules: function(fileC){ let currentRules = []; for(let c = 0; c < fileC.length; c++){ currentRules.push({"sheetIndex": fileC[c]["index"], "luckysheet_conditionformat_save": fileC[c]["luckysheet_conditionformat_save"]}); } return currentRules; }, ref: function(historyRules, currentRules){ if (Store.clearjfundo) { Store.jfundo.length = 0; let redo = {}; redo["type"] = "updateCF"; redo["data"] = {"historyRules": historyRules, "currentRules": currentRules}; Store.jfredo.push(redo); } setTimeout(function () { luckysheetrefreshgrid(); }, 1); } } export default conditionformat;