diff --git a/src/controllers/controlHistory.js b/src/controllers/controlHistory.js index ca3543819..1693e9258 100644 --- a/src/controllers/controlHistory.js +++ b/src/controllers/controlHistory.js @@ -43,6 +43,10 @@ const controlHistory = { for(let r = st_r;r < ed_r + 1; r++){ for(let c = st_c; c < ed_c +1; c++){ + if(r > ctr.data.length - 1){ + break; + } + if(ctr.data[r][c] == null){ formula.delFunctionGroup(r,c); } diff --git a/src/controllers/handler.js b/src/controllers/handler.js index 6fc401cd9..7a8e17faa 100644 --- a/src/controllers/handler.js +++ b/src/controllers/handler.js @@ -3383,7 +3383,7 @@ export default function luckysheetHandler() { //格式刷 if(menuButton.luckysheetPaintModelOn){ - selection.pasteHandlerOfPaintModel(luckysheet_copy_save); + selection.pasteHandlerOfPaintModel(Store.luckysheet_copy_save); if(menuButton.luckysheetPaintSingle){ //单次 格式刷 @@ -9251,6 +9251,7 @@ export default function luckysheetHandler() { let txtdata = clipboardData.getData("text/html"); //如果标示是qksheet复制的内容,判断剪贴板内容是否是当前页面复制的内容 + let isEqual = true; if(txtdata.indexOf("luckysheet_copy_action_table") >- 1 && Store.luckysheet_copy_save["copyRange"] != null && Store.luckysheet_copy_save["copyRange"].length > 0){ //剪贴板内容解析 let cpDataArr = []; @@ -9281,31 +9282,36 @@ export default function luckysheetHandler() { let copy_index = Store.luckysheet_copy_save["dataSheetIndex"]; + let d; if(copy_index == Store.currentSheetIndex){ - let d = editor.deepCopyFlowData(Store.flowdata); + d = editor.deepCopyFlowData(Store.flowdata); } else{ - let d = Store.luckysheetfile[getSheetIndex(copy_index)].data; + d = Store.luckysheetfile[getSheetIndex(copy_index)].data; } - let isEqual = true; - for(let r = copy_r1; r <= copy_r2; r++){ - if(r - copy_r1 > 5){ + if(r - copy_r1 > cpDataArr.length - 1){ break; } for(let c = copy_c1; c <= copy_c2; c++){ let cell = d[r][c]; - if(cell != null && cell.ct != null && cell.ct.fa.indexOf("w") > -1){ - let v = d[r][c].v; + let v; + if(cell != null){ + if(cell.ct != null && cell.ct.fa.indexOf("w") > -1){ + v = d[r][c].v; + } + else{ + v = d[r][c].m; + } } else{ - let v = d[r][c].m; + v = ""; } - if(v != cpDataArr[r - copy_r1][c - copy_c1]){ + if(cpDataArr[r - copy_r1][c - copy_c1] != v){ isEqual = false; break; } @@ -9317,11 +9323,11 @@ export default function luckysheetHandler() { //剪切板内容 和 luckysheet本身复制的内容 一致 if(Store.luckysheet_paste_iscut){ Store.luckysheet_paste_iscut = false; - selection.pasteHandlerOfCutPaste(luckysheet_copy_save); + selection.pasteHandlerOfCutPaste(Store.luckysheet_copy_save); selection.clearcopy(e); } else{ - selection.pasteHandlerOfCopyPaste(luckysheet_copy_save); + selection.pasteHandlerOfCopyPaste(Store.luckysheet_copy_save); } } else{ diff --git a/src/controllers/locationCell.js b/src/controllers/locationCell.js index 1d6289895..6bbb91f90 100644 --- a/src/controllers/locationCell.js +++ b/src/controllers/locationCell.js @@ -1,5 +1,6 @@ import { replaceHtml } from '../utils/util'; import { getSheetIndex } from '../methods/get'; +import { isRealNull } from '../global/validate'; import { isEditMode } from '../global/validate'; import tooltip from '../global/tooltip'; import { modelHTML } from './constant'; @@ -209,199 +210,111 @@ const luckysheetLocationCell = { apply: function(range, type, value){ let rangeArr = []; - if(type == "locationFormula" || type == "locationConstant" || type == "locationNull" || type == "locationCF"){ - let str, computeMap = {}; + if(type == "locationFormula" || type == "locationConstant" || type == "locationNull"){ //公式 常量 空值 + let minR = null, maxR = null, minC = null, maxC = null, cellSave = {}; - if(type == "locationFormula"){ //公式 - if(value == "all"){ - str = "Store.flowdata[r] != null && Store.flowdata[r][c] != null && Store.flowdata[r][c].v != null && Store.flowdata[r][c].f != null"; + for(let s = 0; s < range.length; s++){ + let st_r = range[s].row[0], + ed_r = range[s].row[1], + st_c = range[s].column[0], + ed_c = range[s].column[1]; + + if(minR == null || minR < st_r){ + minR = st_r; } - else{ - str = "Store.flowdata[r] != null && Store.flowdata[r][c] != null && Store.flowdata[r][c].v != null && Store.flowdata[r][c].f != null && Store.flowdata[r][c].ct != null && value.indexOf(Store.flowdata[r][c].ct.t) != -1"; + if(maxR == null || maxR > ed_r){ + maxR = ed_r; + } + if(minC == null || minC < st_c){ + minC = st_c; + } + if(maxC == null || maxC > ed_c){ + maxC = ed_c; + } + + for(let r = st_r; r <= ed_r; r++){ + for(let c = st_c; c <= ed_c; c++){ + let cell = Store.flowdata[r][c]; + + if(cell != null && cell.mc != null){ + cell = Store.flowdata[cell.mc.r][cell.mc.c]; + } + + if(type == 'locationFormula' && cell != null && !isRealNull(cell.v) && cell.f != null && (value == 'all' || (cell.ct != null && value.indexOf(cell.ct.t) > -1))){ + cellSave[r + '_' + c] = 0; + } + else if(type == 'locationConstant' && cell != null && !isRealNull(cell.v) && (value == 'all' || (cell.ct != null && value.indexOf(cell.ct.t) > -1))){ + cellSave[r + '_' + c] = 0; + } + else if(type == 'locationNull' && (cell == null || isRealNull(cell.v))){ + cellSave[r + '_' + c] = 0; + } + } } } - else if(type == "locationConstant"){ //常量 - if(value == "all"){ - str = "Store.flowdata[r] != null && Store.flowdata[r][c] != null && Store.flowdata[r][c].v != null && Store.flowdata[r][c].f == null && Store.flowdata[r][c].ct != null"; + + rangeArr = this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); + } + else if(type == "locationCF"){ //条件格式 + let index = getSheetIndex(Store.currentSheetIndex); + let ruleArr = Store.luckysheetfile[index]["luckysheet_conditionformat_save"]; + let data = Store.luckysheetfile[index]["data"]; + + if(ruleArr == null || ruleArr.length == 0){ + if(isEditMode()){ + alert("未找到单元格"); } else{ - str = "Store.flowdata[r] != null && Store.flowdata[r][c] != null && Store.flowdata[r][c].v != null && Store.flowdata[r][c].f == null && Store.flowdata[r][c].ct != null && value.indexOf(Store.flowdata[r][c].ct.t) != -1"; + tooltip.info("提示", "未找到单元格"); } - } - else if(type == "locationNull"){ //空值 - str = "Store.flowdata[r] != null && (Store.flowdata[r][c] == null || Store.flowdata[r][c].v == null || Store.flowdata[r][c].v == '') "; - } - else if(type == "locationCF"){ //条件格式 - let index = getSheetIndex(Store.currentSheetIndex); - let ruleArr = Store.luckysheetfile[index]["luckysheet_conditionformat_save"]; - let data = Store.luckysheetfile[index]["data"]; - computeMap = conditionformat.compute(ruleArr, data); + return; + } - if(JSON.stringify(computeMap) == "{}"){ - if(isEditMode()){ - alert("未找到单元格"); - } - else{ - tooltip.info("提示", "未找到单元格"); - } + computeMap = conditionformat.compute(ruleArr, data); - return; + if(Object.keys(computeMap).length == 0){ + if(isEditMode()){ + alert("未找到单元格"); + } + else{ + tooltip.info("提示", "未找到单元格"); } - str = "(r + '_' + c) in computeMap"; + return; } + let minR = null, maxR = null, minC = null, maxC = null, cellSave = {}; + for(let s = 0; s < range.length; s++){ - let st_r = range[s].row[0], ed_r = range[s].row[1]; - let st_c = range[s].column[0], ed_c = range[s].column[1]; - - if(st_r == ed_r){ - let stack_stc = null, stack_edc = null; - - var r = st_r; //r, c var定义,否则eval报错 - for(var c = st_c; c <= ed_c; c++){ - if(c == st_c){ - if(eval(str)){ - stack_stc = c; - } - else{ - stack_stc = null; - } - } - else if(c == ed_c){ - if(eval(str)){ - if(stack_stc == null){ - rangeArr.push({"row": [st_r, ed_r], "column": [ed_c, ed_c]}); - } - else{ - rangeArr.push({"row": [st_r, ed_r], "column": [stack_stc, ed_c]}); - } - } - else{ - if(stack_edc == null && stack_stc != null){ - rangeArr.push({"row": [st_r, ed_r], "column": [stack_stc, stack_stc]}); - } - else if(stack_edc != null){ - rangeArr.push({"row": [st_r, ed_r], "column": [stack_stc, stack_edc]}); - } - } - } - else{ - if(eval(str)){ - if(stack_stc == null){ - stack_stc = c; - } - else{ - stack_edc = c; - } - } - else{ - if(stack_edc == null && stack_stc != null){ - rangeArr.push({"row": [st_r, ed_r], "column": [stack_stc, stack_stc]}); - stack_stc = null; - } - else if(stack_edc != null){ - rangeArr.push({"row": [st_r, ed_r], "column": [stack_stc, stack_edc]}); - stack_stc = null; - stack_edc = null; - } - } - } - } + let st_r = range[s].row[0], + ed_r = range[s].row[1], + st_c = range[s].column[0], + ed_c = range[s].column[1]; + + if(minR == null || minR < st_r){ + minR = st_r; + } + if(maxR == null || maxR > ed_r){ + maxR = ed_r; + } + if(minC == null || minC < st_c){ + minC = st_c; + } + if(maxC == null || maxC > ed_c){ + maxC = ed_c; } - else{ - let stack = {}; - - for(var r = st_r; r <= ed_r; r++){ - stack[r] = []; - let stack_stc = null, stack_edc = null; - - for(var c = st_c; c <= ed_c; c++){ - if(c == ed_c){ - if(eval(str)){ - if(stack_stc == null){ - stack[r].push({"status": false, "range": [ed_c, ed_c]}); - } - else{ - stack[r].push({"status": false, "range": [stack_stc, ed_c]}); - } - } - else{ - if(stack_edc == null && stack_stc != null){ - stack[r].push({"status": false, "range": [stack_stc, stack_stc]}); - } - else if(stack_edc != null){ - stack[r].push({"status": false, "range": [stack_stc, stack_edc]}); - } - } - } - else if(c == st_c){ - if(eval(str)){ - stack_stc = c; - } - else{ - stack_stc = null; - } - } - else{ - if(eval(str)){ - if(stack_stc == null){ - stack_stc = c; - } - else{ - stack_edc = c; - } - } - else{ - if(stack_edc == null && stack_stc != null){ - stack[r].push({"status": false, "range": [stack_stc, stack_stc]}); - stack_stc = null; - } - else if(stack_edc != null){ - stack[r].push({"status": false, "range": [stack_stc, stack_edc]}); - stack_stc = null; - stack_edc = null; - } - } - } - } - } - for(let i = st_r; i <= ed_r; i++){ - if(i == ed_r){ - if(stack[i].length > 0){ - for(let j = 0; j < stack[i].length; j++){ - if(!stack[i][j].status){ - rangeArr.push({"row": [ed_r, ed_r], "column": stack[i][j].range}); - } - } - } - } - else{ - if(stack[i].length > 0){ - for(let j = 0; j < stack[i].length; j++){ - if(!stack[i][j].status){ - let b = 0; - - for(let a = 1; a < (ed_r - i); a++){ - if(stack[i + a][j] != null && stack[i + a][j].range[0] == stack[i][j].range[0] && stack[i + a][j].range[1] == stack[i][j].range[1]){ - b = a; - stack[i + a][j].status = true; - } - else{ - break; - } - } - - rangeArr.push({"row": [i, i + b], "column": stack[i][j].range}); - } - } - } + for(let r = st_r; r <= ed_r; r++){ + for(let c = st_c; c <= ed_c; c++){ + if((r + '_' + c) in computeMap){ + cellSave[r + '_' + c] = 0; } } } } + + rangeArr = this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); } else if(type == "locationStepRow"){ //间隔行 for(let s = 0; s < range.length; s++){ @@ -477,6 +390,99 @@ const luckysheetLocationCell = { $("#luckysheet-scrollbar-y").scrollTop(row_pre - 20); } } + }, + getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr){ + if(Object.keys(cellSave).length == 0){ + return rangeArr; + } + + let _this = this; + + let stack_str = null, + stack_edr = null, + stack_stc = null, + stack_edc = null; + + for(let r = minR; r <= maxR; r++){ + for(let c = minC; c <= maxC; c++){ + let cell = Store.flowdata[r][c]; + + if((r + '_' + c) in cellSave){ + if(cell != null && cell.mc != null){ + if(stack_stc == null){ + let range = { + 'row': [cell.mc.r, cell.mc.r + cell.mc.rs - 1], + 'column': [cell.mc.c, cell.mc.c + cell.mc.cs - 1] + }; + rangeArr.push(range); + cellSave = _this.deleteCellInSave(cellSave, range); + return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); + } + else if(c < stack_edc){ + let range = { + 'row': [stack_str, stack_edr], + 'column': [stack_stc, stack_edc] + } + rangeArr.push(range); + cellSave = _this.deleteCellInSave(cellSave, range); + return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); + } + else{ + break; + } + } + else if(stack_stc == null){ + stack_stc = c; + stack_edc = c; + + stack_str = r; + stack_edr = r; + } + else if(c > stack_edc){ + stack_edc = c; + } + } + else if(stack_stc != null){ + if(cell != null && cell.mc != null){ + break; + } + else if(c < stack_stc){ + + } + else if(c <= stack_edc){ + let range = { + 'row': [stack_str, stack_edr], + 'column': [stack_stc, stack_edc] + } + rangeArr.push(range); + cellSave = _this.deleteCellInSave(cellSave, range); + return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); + } + else{ + stack_edr = r; + } + } + } + } + + if(stack_stc != null){ + let range = { + 'row': [stack_str, stack_edr], + 'column': [stack_stc, stack_edc] + } + rangeArr.push(range); + cellSave = _this.deleteCellInSave(cellSave, range); + return _this.getRangeArr(minR, maxR, minC, maxC, cellSave, rangeArr); + } + }, + deleteCellInSave(cellSave, range){ + for(let r = range.row[0]; r <= range.row[1]; r++){ + for(let c = range.column[0]; c <= range.column[1]; c++){ + delete cellSave[r + '_' + c]; + } + } + + return cellSave; } } diff --git a/src/controllers/pivotTable.js b/src/controllers/pivotTable.js index 9ebc023af..67c99ac91 100644 --- a/src/controllers/pivotTable.js +++ b/src/controllers/pivotTable.js @@ -2682,7 +2682,7 @@ const pivotTable = { curentLevelarr_row = curentLevelarr_row[curentLevelobj_row[r.toString()][item]].children; } else { - let orderby = r == 0 ? "self" : ((row[r - 1].orderby == "self" || row[r - 1].orderby == null) ? item : (showType == "column" ? item + values[parseInt(row[r - 1].orderby)].fullname : item + "合计")); + let orderby = r == 0 ? "self" : ((row[r - 1].orderby == "self" || row[r - 1].orderby == null) ? item : (showType == "column" ? item + values[parseInt(row[r - 1].orderby)].fullname : item + "总计")); if(name == null){ name = "(空白)"; @@ -2712,7 +2712,7 @@ const pivotTable = { curentLevelarr_col = curentLevelarr_col[curentLevelobj_col[r.toString()][item]].children; } else { - let orderby = r == 0 ? "self" : ((column[r - 1].orderby == "self" || column[r - 1].orderby == null) ? item : (showType == "column" ? "合计" + item : values[parseInt(column[r - 1].orderby)].fullname + item)); + let orderby = r == 0 ? "self" : ((column[r - 1].orderby == "self" || column[r - 1].orderby == null) ? item : (showType == "column" ? "总计" + item : values[parseInt(column[r - 1].orderby)].fullname + item)); if(name == null){ name = "(空白)"; diff --git a/src/controllers/postil.js b/src/controllers/postil.js index 27d74d0a5..d7ab02844 100644 --- a/src/controllers/postil.js +++ b/src/controllers/postil.js @@ -161,6 +161,12 @@ const luckysheetPostil = { let row_index = rowLocation(y)[2]; let col_index = colLocation(x)[2]; + let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index); + if(!!margeset){ + row_index = margeset.row[2]; + col_index = margeset.column[2]; + } + if(Store.flowdata[row_index] == null || Store.flowdata[row_index][col_index] == null || Store.flowdata[row_index][col_index].ps == null){ return; } @@ -173,8 +179,21 @@ const luckysheetPostil = { let value = postil["value"] == null ? "" : postil["value"]; - let toX = Store.visibledatacolumn[col_index]; - let toY = row_index == 0 ? 0 : Store.visibledatarow[row_index - 1]; + let row = Store.visibledatarow[row_index], + row_pre = row_index - 1 == -1 ? 0 : Store.visibledatarow[row_index - 1]; + let col = Store.visibledatacolumn[col_index], + col_pre = col_index - 1 == -1 ? 0 : Store.visibledatacolumn[col_index - 1]; + + if(!!margeset){ + row = margeset.row[1]; + row_pre = margeset.row[0]; + + col = margeset.column[1]; + col_pre = margeset.column[0]; + } + + let toX = col; + let toY = row_pre; let fromX = toX + 18; let fromY = toY - 18; @@ -186,7 +205,7 @@ const luckysheetPostil = { let size = _this.getArrowCanvasSize(fromX, fromY, toX, toY); let html = '