From 373dc4f464d8bd106408ce28bd48b9e44b310b5f Mon Sep 17 00:00:00 2001 From: liuyang Date: Tue, 29 Sep 2020 18:15:05 +0800 Subject: [PATCH] fix(undo redo bug fix): formula update bug --- src/controllers/controlHistory.js | 11 ++- src/function/functionImplementation.js | 126 ++++++++++++------------- src/global/formula.js | 12 ++- src/global/refresh.js | 56 +++++------ 4 files changed, 106 insertions(+), 99 deletions(-) diff --git a/src/controllers/controlHistory.js b/src/controllers/controlHistory.js index 881d25a..7ddbb41 100644 --- a/src/controllers/controlHistory.js +++ b/src/controllers/controlHistory.js @@ -37,6 +37,8 @@ const controlHistory = { sheetmanage.changeSheetExec(ctr.sheetIndex); } + // formula.execFunctionExist = []; + if (ctr.type == "datachange") { //如果有单元格为null,则对应公式应该删除 for(let s = 0; s < ctr.range.length; s++){ @@ -50,14 +52,14 @@ const controlHistory = { if(r > ctr.data.length - 1){ break; } - + // formula.execFunctionExist.push({ "r": r, "c": c, "i": ctr.sheetIndex }); if(ctr.data[r][c] == null){ formula.delFunctionGroup(r,c); } } } } - formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据 + let allParam = { "cfg": ctr.config, @@ -68,6 +70,7 @@ const controlHistory = { } jfrefreshgrid(ctr.data, ctr.range, allParam); + // formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据 } else if (ctr.type == "pasteCut") { let s = { @@ -106,15 +109,17 @@ const controlHistory = { for(let r = st_r;r < ed_r + 1; r++){ for(let c = st_c; c < ed_c +1; c++){ + // formula.execFunctionExist.push({ "r": r, "c": c, "i": ctr.sheetIndex }); if(ctr.data[r][c] == null){ formula.delFunctionGroup(r,c); } } } } - formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据 + jfrefreshrange(ctr.data, ctr.range, ctr.cdformat); + // formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据 } else if (ctr.type == "resize") { Store.config = ctr.config; diff --git a/src/function/functionImplementation.js b/src/function/functionImplementation.js index f95904a..a53b491 100644 --- a/src/function/functionImplementation.js +++ b/src/function/functionImplementation.js @@ -23329,10 +23329,28 @@ const functionImplementation = { var row_index = cellrange.row[0]; var col_index = cellrange.column[0]; - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; + // let sheetdata = null; + // sheetdata = Store.flowdata; + // if (formula.execFunctionGroupData != null) { + // sheetdata = formula.execFunctionGroupData; + // } + + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; + + let value; + if(formula.execFunctionGlobalData != null && formula.execFunctionGlobalData[row_index+"_"+col_index+"_"+Store.calculateSheetIndex]!=null){ + value = formula.execFunctionGlobalData[row_index+"_"+col_index+"_"+Store.calculateSheetIndex].v; + } + else if(sheetdata[row_index][col_index] != null && sheetdata[row_index][col_index].v != null && sheetdata[row_index][col_index].v !=""){ + value = sheetdata[row_index][col_index]; + if(value instanceof Object){ + value = value.v; + } + } + else { + value = 0; } switch(info_type){ @@ -23346,11 +23364,11 @@ const functionImplementation = { return 0; break; case "contents": - if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==""){ - return 0; - } + // if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==""){ + // value = 0; + // } - return sheetdata[row_index][col_index].v; + return value; break; case "filename": return file.name; @@ -23375,7 +23393,7 @@ const functionImplementation = { } break; case "prefix": - if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].ht == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==""){ + if (value==0){ return ""; } @@ -23399,7 +23417,7 @@ const functionImplementation = { return row_index + 1; break; case "type": - if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==""){ + if (value==0){ return "b"; } @@ -25413,11 +25431,9 @@ const functionImplementation = { var minSpot = arguments[6]; var spotRadius = arguments[7]; - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); @@ -25559,11 +25575,9 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); @@ -25696,11 +25710,9 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); @@ -25845,11 +25857,9 @@ const functionImplementation = { var offsetY = data[0].length; } - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; @@ -25937,11 +25947,9 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); @@ -26085,11 +26093,9 @@ const functionImplementation = { var offsetY = data[0].length; } - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; @@ -26177,11 +26183,9 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); @@ -26268,11 +26272,9 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); @@ -26369,11 +26371,9 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); @@ -26464,11 +26464,9 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); @@ -26556,11 +26554,9 @@ const functionImplementation = { //定义需要格式化data数据 //var dataformat = formula.readCellDataToOneArray(rangeValue); - let sheetdata = null; - sheetdata = Store.flowdata; - if (formula.execFunctionGroupData != null) { - sheetdata = formula.execFunctionGroupData; - } + let luckysheetfile = getluckysheetfile(); + let index = getSheetIndex(Store.calculateSheetIndex); + let sheetdata = luckysheetfile[index].data; //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); diff --git a/src/global/formula.js b/src/global/formula.js index 8e4d0f8..9f2bab3 100644 --- a/src/global/formula.js +++ b/src/global/formula.js @@ -676,7 +676,7 @@ const luckysheetformula = { num = num % d; return num; }, - getcellrange: function(txt) { + getcellrange: function(txt, formulaIndex) { if(txt==null || txt.length==0){ return; } @@ -707,7 +707,11 @@ const luckysheetformula = { } } else { - let index = getSheetIndex(Store.currentSheetIndex); + let i = formulaIndex; + if(i==null){ + i = Store.currentSheetIndex; + } + let index = getSheetIndex(i); sheettxt = luckysheetfile[index].name; sheetIndex = luckysheetfile[index].index; sheetdata = Store.flowdata; @@ -4553,7 +4557,7 @@ const luckysheetformula = { isFunctionRangeSaveChange: function (str, r, c, index, dynamicArray_compute) { let _this = this; if (r != null && c != null) { - let range = _this.getcellrange($.trim(str)); + let range = _this.getcellrange($.trim(str), index); let row = range.row, col = range.column, sheetIndex = range.sheetIndex; @@ -4822,7 +4826,7 @@ const luckysheetformula = { } // console.time("1"); - let iii =0; + while (stack.length > 0) { let u = stack.shift(); diff --git a/src/global/refresh.js b/src/global/refresh.js index 90ea6b5..39df9c4 100644 --- a/src/global/refresh.js +++ b/src/global/refresh.js @@ -28,20 +28,7 @@ function jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefres range = Store.luckysheet_select_save; } - //单元格数据更新联动 - if (isRunExecFunction) { - formula.execFunctionExist = []; - for(let s = 0; s < range.length; s++){ - for(let r = range[s].row[0]; r <= range[s].row[1]; r++){ - for(let c = range[s].column[0]; c <= range[s].column[1]; c++){ - formula.execFunctionExist.push({ "r": r, "c": c, "i": Store.currentSheetIndex }); - } - } - } - formula.execFunctionExist.reverse(); - formula.execFunctionGroup(null, null, null, null, data); - formula.execFunctionGlobalData = null; - } + //关联参数 if(allParam == null){ @@ -170,7 +157,20 @@ function jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefres Store.chartparam.jfrefreshchartall(Store.flowdata,range[s].row[0],range[s].row[1],range[s].column[0],range[s].column[1]); } } - + //单元格数据更新联动 + if (isRunExecFunction) { + formula.execFunctionExist = []; + for(let s = 0; s < range.length; s++){ + for(let r = range[s].row[0]; r <= range[s].row[1]; r++){ + for(let c = range[s].column[0]; c <= range[s].column[1]; c++){ + formula.execFunctionExist.push({ "r": r, "c": c, "i": Store.currentSheetIndex }); + } + } + } + formula.execFunctionExist.reverse(); + formula.execFunctionGroup(null, null, null, null, data); + formula.execFunctionGlobalData = null; + } //刷新表格 if(isRefreshCanvas){ setTimeout(function () { @@ -330,18 +330,7 @@ function jfrefreshgridall(colwidth, rowheight, data, cfg, range, ctrlType, ctrlV } function jfrefreshrange(data, range, cdformat) { - //单元格数据更新联动 - formula.execFunctionExist = []; - for(let s = 0; s < range.length; s++){ - for(let r = range[s].row[0]; r <= range[s].row[1]; r++){ - for(let c = range[s].column[0]; c <= range[s].column[1]; c++){ - formula.execFunctionExist.push({ "r": r, "c": c, "i": Store.currentSheetIndex }); - } - } - } - formula.execFunctionExist.reverse(); - formula.execFunctionGroup(null, null, null, null, data); - formula.execFunctionGlobalData = null; + if (Store.clearjfundo) { Store.jfundo = []; @@ -368,6 +357,19 @@ function jfrefreshrange(data, range, cdformat) { Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] = cdformat; } + //单元格数据更新联动 + formula.execFunctionExist = []; + for(let s = 0; s < range.length; s++){ + for(let r = range[s].row[0]; r <= range[s].row[1]; r++){ + for(let c = range[s].column[0]; c <= range[s].column[1]; c++){ + formula.execFunctionExist.push({ "r": r, "c": c, "i": Store.currentSheetIndex }); + } + } + } + formula.execFunctionExist.reverse(); + formula.execFunctionGroup(null, null, null, null, data); + formula.execFunctionGlobalData = null; + //刷新表格 setTimeout(function () { luckysheetrefreshgrid();