From aacb03ddb6f10c59be2561c40434843a4e6e79d8 Mon Sep 17 00:00:00 2001 From: wbfsa Date: Mon, 27 Jul 2020 02:18:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BD=E6=95=B0=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vs/luckysheet/config/applicationhost.config | 1025 ++++++++++++++++++ .vs/luckysheet/v16/.suo | Bin 0 -> 10752 bytes .vs/slnx.sqlite | Bin 0 -> 118784 bytes src/controllers/dropCell.js | 16 +- src/controllers/sheetmanage.js | 2 - src/function/func.js | 104 +- src/function/functionImplementation.js | 146 ++- src/global/formula.js | 368 ++++++- src/global/refresh.js | 20 +- 9 files changed, 1616 insertions(+), 65 deletions(-) create mode 100644 .vs/luckysheet/config/applicationhost.config create mode 100644 .vs/luckysheet/v16/.suo create mode 100644 .vs/slnx.sqlite diff --git a/.vs/luckysheet/config/applicationhost.config b/.vs/luckysheet/config/applicationhost.config new file mode 100644 index 0000000..7a99442 --- /dev/null +++ b/.vs/luckysheet/config/applicationhost.config @@ -0,0 +1,1025 @@ + + + + + + + +
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vs/luckysheet/v16/.suo b/.vs/luckysheet/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..d97978dfb7a269fd92351192157de7bc31a632b3 GIT binary patch literal 10752 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 4) { + height = func_methods.getFirstValue(arguments[3]); + if (valueIsError(height)) { + return height; + } + + if (!isRealNum(height)) { + return formula.error.v; + } + + height = parseInt(height); + } + + //要从偏移目标开始返回的范围的宽度 + var width = arguments[0].coll; + if (arguments.length == 5) { + width = func_methods.getFirstValue(arguments[4]); + if (valueIsError(width)) { + return width; + } + + if (!isRealNum(width)) { + return formula.error.v; + } + + width = parseInt(width); + } + + if (height < 1 || width < 1) { + return formula.error.r; + } + + //计算 + var cellrange = formula.getcellrange(reference); + var cellRow0 = cellrange["row"][0]; + var cellCol0 = cellrange["column"][0]; + + cellRow0 += rows; + cellCol0 += cols; + + var cellRow1 = cellRow0 + height - 1; + var cellCol1 = cellCol0 + width - 1; + + if (cellRow0 < 0 || cellRow1 >= Store.flowdata.length || cellCol0 < 0 || cellCol1 >= Store.flowdata[0].length) { + return formula.error.r; + } + + return getRangetxt(Store.currentSheetIndex, { + row: [cellRow0, cellRow1], + column: [cellCol0, cellCol1] + }); +} + export { luckysheet_compareWith, luckysheet_getarraydata, luckysheet_getcelldata, luckysheet_parseData, luckysheet_getValue, + luckysheet_indirect_check, + luckysheet_indirect_check_return, + luckysheet_offset_check } \ No newline at end of file diff --git a/src/function/functionImplementation.js b/src/function/functionImplementation.js index f9e540a..e62054c 100644 --- a/src/function/functionImplementation.js +++ b/src/function/functionImplementation.js @@ -10299,21 +10299,27 @@ const functionImplementation = { } } + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //计算 if(A1){ if(formula.iscelldata(ref_text)){ let cellrange = formula.getcellrange(ref_text); let row = cellrange.row[0], col = cellrange.column[0]; - if(row < 0 || row >= Store.flowdata.length || col < 0 || col >= Store.flowdata[0].length){ + if (row < 0 || row >= sheetdata.length || col < 0 || col >= sheetdata[0].length){ return formula.error.r; } - if(Store.flowdata[row][col] == null || isRealNull(Store.flowdata[row][col].v)){ + if (sheetdata[row][col] == null || isRealNull(sheetdata[row][col].v)){ return 0; } - return Store.flowdata[row][col].v; + return sheetdata[row][col].v; } else{ return formula.error.r; @@ -10324,15 +10330,15 @@ const functionImplementation = { let cellrange = formula.getcellrange(ref_text); let row = cellrange.row[0], col = cellrange.column[0]; - if(row < 0 || row >= Store.flowdata.length || col < 0 || col >= Store.flowdata[0].length){ + if (row < 0 || row >= sheetdata.length || col < 0 || col >= sheetdata[0].length){ return formula.error.r; } - if(Store.flowdata[row][col] == null || isRealNull(Store.flowdata[row][col].v)){ + if (sheetdata[row][col] == null || isRealNull(sheetdata[row][col].v)){ return 0; } - return Store.flowdata[row][col].v; + return sheetdata[row][col].v; } else{ return formula.error.r; @@ -10611,7 +10617,13 @@ const functionImplementation = { var cellRow1 = cellRow0 + height - 1; var cellCol1 = cellCol0 + width - 1; - if(cellRow0 < 0 || cellRow1 >= Store.flowdata.length || cellCol0 < 0 || cellCol1 >= Store.flowdata[0].length){ + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + + if (cellRow0 < 0 || cellRow1 >= sheetdata.length || cellCol0 < 0 || cellCol1 >= sheetdata[0].length){ return formula.error.r; } @@ -10621,8 +10633,8 @@ const functionImplementation = { var rowArr = []; for(var c = cellCol0; c <= cellCol1; c++){ - if(Store.flowdata[r][c] != null && !isRealNull(Store.flowdata[r][c].v)){ - rowArr.push(Store.flowdata[r][c].v); + if (sheetdata[r][c] != null && !isRealNull(sheetdata[r][c].v)){ + rowArr.push(sheetdata[r][c].v); } else{ rowArr.push(0); @@ -23288,6 +23300,12 @@ 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; + } + switch(info_type){ case "address": return reference; @@ -23299,28 +23317,28 @@ const functionImplementation = { return 0; break; case "contents": - if(Store.flowdata[row_index][col_index] == null || Store.flowdata[row_index][col_index].v == null || Store.flowdata[row_index][col_index].v ==""){ + if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==""){ return 0; } - return Store.flowdata[row_index][col_index].v; + return sheetdata[row_index][col_index].v; break; case "filename": return file.name; break; case "format": - if(Store.flowdata[row_index][col_index] == null || Store.flowdata[row_index][col_index].ct == null){ + if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].ct == null){ return "G"; } - return Store.flowdata[row_index][col_index].ct.fa; + return sheetdata[row_index][col_index].ct.fa; break; case "parentheses": - if(Store.flowdata[row_index][col_index] == null || Store.flowdata[row_index][col_index].v == null || Store.flowdata[row_index][col_index].v ==""){ + if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==""){ return 0; } - if(Store.flowdata[row_index][col_index].v > 0){ + if (sheetdata[row_index][col_index].v > 0){ return 1; } else{ @@ -23328,17 +23346,17 @@ const functionImplementation = { } break; case "prefix": - if(Store.flowdata[row_index][col_index] == null || Store.flowdata[row_index][col_index].ht == null || Store.flowdata[row_index][col_index].v == null || Store.flowdata[row_index][col_index].v ==""){ + 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 ==""){ return ""; } - if(Store.flowdata[row_index][col_index].ht == 0){//居中对齐 + if (sheetdata[row_index][col_index].ht == 0){//居中对齐 return "^"; } - else if(Store.flowdata[row_index][col_index].ht == 1){//左对齐 + else if (sheetdata[row_index][col_index].ht == 1){//左对齐 return "'"; } - else if(Store.flowdata[row_index][col_index].ht == 2){//右对齐 + else if (sheetdata[row_index][col_index].ht == 2){//右对齐 return '"'; } else{ @@ -23352,7 +23370,7 @@ const functionImplementation = { return row_index + 1; break; case "type": - if(Store.flowdata[row_index][col_index] == null || Store.flowdata[row_index][col_index].v == null || Store.flowdata[row_index][col_index].v ==""){ + if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[row_index][col_index].v ==""){ return "b"; } @@ -25366,11 +25384,17 @@ const functionImplementation = { var minSpot = arguments[6]; var spotRadius = arguments[7]; + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -25506,8 +25530,14 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -25637,8 +25667,14 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -25779,8 +25815,14 @@ const functionImplementation = { } var offsetY = data[0].length; } + + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -25866,8 +25908,14 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -26007,8 +26055,14 @@ const functionImplementation = { } var offsetY = data[0].length; } + + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -26094,8 +26148,14 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -26179,8 +26239,14 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -26274,8 +26340,14 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -26363,8 +26435,14 @@ const functionImplementation = { //定义需要格式化data数据 var dataformat = formula.readCellDataToOneArray(rangeValue); + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; @@ -26449,8 +26527,14 @@ const functionImplementation = { //定义需要格式化data数据 //var dataformat = formula.readCellDataToOneArray(rangeValue); + let sheetdata = null; + sheetdata = Store.flowdata; + if (formula.execFunctionGroupData != null) { + sheetdata = formula.execFunctionGroupData; + } + //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 - var cellSize = menuButton.getCellRealSize(Store.flowdata, cell_r, cell_c); + var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var width = cellSize[0]; var height = cellSize[1]; diff --git a/src/global/formula.js b/src/global/formula.js index 868a554..9515f77 100644 --- a/src/global/formula.js +++ b/src/global/formula.js @@ -20,7 +20,7 @@ import { luckysheetRangeLast } from './cursorPos'; import { jfrefreshgrid } from './refresh'; import luckysheet_function from '../function/luckysheet_function'; import functionlist from '../function/functionlist'; -import { luckysheet_compareWith, luckysheet_getcelldata } from '../function/func'; +import { luckysheet_compareWith, luckysheet_getcelldata, luckysheet_indirect_check, luckysheet_indirect_check_return, luckysheet_offset_check } from '../function/func'; import Store from '../store'; const luckysheetformula = { @@ -1217,6 +1217,8 @@ const luckysheetformula = { } window.luckysheet_getcelldata_cache = null; + + let isRunExecFunction = true; let d = editor.deepCopyFlowData(Store.flowdata); @@ -1245,7 +1247,7 @@ const luckysheetformula = { else{ _this.delFunctionGroup(r, c); _this.execFunctionGroup(r, c, value); - + isRunExecFunction = false; curv = _this.execFunctionGroupData[r][c]; delete curv.f; @@ -1278,6 +1280,7 @@ const luckysheetformula = { else{ _this.delFunctionGroup(r, c); _this.execFunctionGroup(r, c, value); + isRunExecFunction = false; } } @@ -1325,10 +1328,10 @@ const luckysheetformula = { } if(RowlChange){ - jfrefreshgrid(d, [{"row": [r, r], "column": [c, c]}], cfg, null, RowlChange); + jfrefreshgrid(d, [{ "row": [r, r], "column": [c, c] }], cfg, null, RowlChange, isRunExecFunction); } - else{ - jfrefreshgrid(d, [{"row": [r, r], "column": [c, c]}]); + else { + jfrefreshgrid(d, [{ "row": [r, r], "column": [c, c] }], undefined, undefined, undefined, isRunExecFunction); } // Store.luckysheetCellUpdate.length = 0; //clear array @@ -3922,7 +3925,7 @@ const luckysheetformula = { setluckysheetfile(luckysheetfile); }, isFunctionRangeSave: false, - isFunctionRange: function(txt, r, c) { + isFunctionRange1: function(txt, r, c) { let _this = this; if (_this.operatorjson == null) { @@ -4020,12 +4023,12 @@ const luckysheetformula = { let row = range.row, col = range.column; - if((r + "_" + c) in dynamicArray_compute){ + if ((r + "_" + c) in dynamicArray_compute) { let isd_range = false; - for(let d_r = row[0]; d_r <= row[1]; d_r++){ - for(let d_c = col[0]; d_c <= col[1]; d_c++){ - if((d_r + "_" + d_c) in dynamicArray_compute && dynamicArray_compute[d_r + "_" + d_c].r == r && dynamicArray_compute[d_r + "_" + d_c].c == c){ + for (let d_r = row[0]; d_r <= row[1]; d_r++) { + for (let d_c = col[0]; d_c <= col[1]; d_c++) { + if ((d_r + "_" + d_c) in dynamicArray_compute && dynamicArray_compute[d_r + "_" + d_c].r == r && dynamicArray_compute[d_r + "_" + d_c].c == c) { isd_range = true; } } @@ -4033,38 +4036,367 @@ const luckysheetformula = { if (isd_range) { _this.isFunctionRangeSave = _this.isFunctionRangeSave || true; - } + } else { _this.isFunctionRangeSave = _this.isFunctionRangeSave || false; } } - else{ + else { if (r >= row[0] && r <= row[1] && c >= col[0] && c <= col[1]) { _this.isFunctionRangeSave = _this.isFunctionRangeSave || true; - } + } else { _this.isFunctionRangeSave = _this.isFunctionRangeSave || false; } } - } + } else { let sheetlen = $.trim(str).split("!"); if (sheetlen.length > 1) { _this.isFunctionRangeSave = _this.isFunctionRangeSave || true; - } + } else { _this.isFunctionRangeSave = _this.isFunctionRangeSave || false; } } } + else { + //console.log(str); + } } i++; } + //console.log(function_str); + return function_str; + }, + isFunctionRange: function (txt, r, c) { + let _this = this; + if (_this.operatorjson == null) { + let arr = _this.operator.split("|"), + op = {}; + + for (let i = 0; i < arr.length; i++) { + op[arr[i].toString()] = 1; + } + + _this.operatorjson = op; + } + + if (txt.substr(0, 1) == "=") { + txt = txt.substr(1); + } + + let funcstack = txt.split(""); + let i = 0, + str = "", + function_str = "", + ispassby = true; + + let matchConfig = { + "bracket": 0, + "comma": 0, + "squote": 0, + "dquote": 0, + "compare": 0, + "braces": 0 + } + + let luckysheetfile = getluckysheetfile(); + let dynamicArray_compute = luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["dynamicArray_compute"] == null ? {} : luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["dynamicArray_compute"]; + + //bracket 0为运算符括号、1为函数括号 + let cal1 = [], cal2 = [], bracket = []; + + while (i < funcstack.length) { + let s = funcstack[i]; + + if (s == "(" && matchConfig.dquote == 0 && matchConfig.braces == 0) { + if (str.length > 0 && bracket.length == 0) { + function_str += "luckysheet_function." + str.toUpperCase() + ".f("; + bracket.push(1); + str = ""; + } + else if (bracket.length == 0) { + function_str += "("; + bracket.push(0); + str = ""; + } + else { + bracket.push(0); + str += s; + } + } + else if (s == ")" && matchConfig.dquote == 0 && matchConfig.braces == 0) { + let bt = bracket.pop(); + + if (bracket.length == 0) { + function_str += _this.isFunctionRange(str,r,c) + ")"; + str = ""; + } + else { + str += s; + } + } + else if (s == "{" && matchConfig.dquote == 0) { + str += '{'; + matchConfig.braces += 1; + } + else if (s == "}" && matchConfig.dquote == 0) { + str += '}'; + matchConfig.braces -= 1; + } + else if (s == '"') { + str += '"'; + + if (matchConfig.dquote > 0) { + matchConfig.dquote -= 1; + } + else { + matchConfig.dquote += 1; + } + } + else if (s == ',' && matchConfig.dquote == 0 && matchConfig.braces == 0) { + if (bracket.length <= 1) { + function_str += _this.isFunctionRange(str, r, c) + ","; + str = ""; + } + else { + str += ","; + } + } + else if (s in _this.operatorjson && matchConfig.dquote == 0 && matchConfig.braces == 0) { + let s_next = ""; + let op = _this.operatorPriority; + + if ((i + 1) < funcstack.length) { + s_next = funcstack[i + 1]; + } + + if ((s + s_next) in _this.operatorjson) { + if (bracket.length == 0) { + if ($.trim(str).length > 0) { + cal2.unshift(_this.isFunctionRange($.trim(str), r, c)); + } + else if ($.trim(function_str).length > 0) { + cal2.unshift($.trim(function_str)); + } + + if (cal1[0] in _this.operatorjson) { + let stackCeilPri = op[cal1[0]]; + + while (cal1.length > 0 && stackCeilPri != null) { + cal2.unshift(cal1.shift()); + stackCeilPri = op[cal1[0]]; + } + } + + cal1.unshift(s + s_next); + + function_str = ""; + str = ""; + } + else { + str += s + s_next; + } + + i++; + } + else { + if (bracket.length == 0) { + if ($.trim(str).length > 0) { + cal2.unshift(_this.isFunctionRange($.trim(str), r, c)); + } + else if ($.trim(function_str).length > 0) { + cal2.unshift($.trim(function_str)); + } + + if (cal1[0] in _this.operatorjson) { + let stackCeilPri = op[cal1[0]]; + stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri; + + let sPri = op[s]; + sPri = sPri == null ? 1000 : sPri; + + while (cal1.length > 0 && sPri >= stackCeilPri) { + cal2.unshift(cal1.shift()); + + stackCeilPri = op[cal1[0]]; + stackCeilPri = stackCeilPri == null ? 1000 : stackCeilPri; + } + } + + cal1.unshift(s); + + function_str = ""; + str = ""; + } + else { + str += s; + } + } + } + else { + if (matchConfig.dquote == 0) { + str += $.trim(s); + } + else { + str += s; + } + } + + if (i == funcstack.length - 1) { + let endstr = ""; + + if (_this.iscelldata($.trim(str))) { + endstr = "luckysheet_getcelldata('" + $.trim(str) + "')"; + + _this.isFunctionRangeSaveChange(str, r, c, dynamicArray_compute); + } + else { + str = $.trim(str); + + let regx = /{.*?}/; + if (regx.test(str) && str.substr(0, 1) != '"' && str.substr(str.length - 1, 1) != '"') { + let arraytxt = regx.exec(str)[0]; + let arraystart = str.search(regx); + let alltxt = ""; + + if (arraystart > 0) { + endstr += str.substr(0, arraystart); + } + + endstr += "luckysheet_getarraydata('" + arraytxt + "')"; + + if (arraystart + arraytxt.length < str.length) { + endstr += str.substr(arraystart + arraytxt.length, str.length); + } + } + else { + endstr = str; + } + } + + if (endstr.length > 0) { + cal2.unshift(endstr); + } + + if (cal1.length > 0) { + if (function_str.length > 0) { + cal2.unshift(function_str); + function_str = ""; + } + + while (cal1.length > 0) { + cal2.unshift(cal1.shift()); + } + } + + if (cal2.length > 0) { + function_str = _this.calPostfixExpression(cal2); + } + else { + function_str += endstr; + } + } + + i++; + } + //console.log(function_str); + _this.checkSpecialFunctionRange(function_str, r, c, dynamicArray_compute); return function_str; }, + isFunctionRangeSaveChange: function (str, r, c, dynamicArray_compute) { + let _this = this; + if (r != null && c != null) { + let range = _this.getcellrange($.trim(str)); + let row = range.row, + col = range.column; + + if ((r + "_" + c) in dynamicArray_compute) { + let isd_range = false; + + for (let d_r = row[0]; d_r <= row[1]; d_r++) { + for (let d_c = col[0]; d_c <= col[1]; d_c++) { + if ((d_r + "_" + d_c) in dynamicArray_compute && dynamicArray_compute[d_r + "_" + d_c].r == r && dynamicArray_compute[d_r + "_" + d_c].c == c) { + isd_range = true; + } + } + } + + if (isd_range) { + _this.isFunctionRangeSave = _this.isFunctionRangeSave || true; + } + else { + _this.isFunctionRangeSave = _this.isFunctionRangeSave || false; + } + } + else { + if (r >= row[0] && r <= row[1] && c >= col[0] && c <= col[1]) { + _this.isFunctionRangeSave = _this.isFunctionRangeSave || true; + } + else { + _this.isFunctionRangeSave = _this.isFunctionRangeSave || false; + } + } + } + else { + let sheetlen = $.trim(str).split("!"); + + if (sheetlen.length > 1) { + _this.isFunctionRangeSave = _this.isFunctionRangeSave || true; + } + else { + _this.isFunctionRangeSave = _this.isFunctionRangeSave || false; + } + } + }, + checkSpecialFunctionRange: function (function_str, r, c, dynamicArray_compute) { + if (!window.luckysheet_indirect_check) { + window.luckysheet_indirect_check = luckysheet_indirect_check; + window.luckysheet_indirect_check_return = luckysheet_indirect_check_return; + window.luckysheet_offset_check = luckysheet_offset_check; + } + if (function_str.substr(0, 20) == "luckysheet_function.") { + let funcName = function_str.split(".")[1]; + if (funcName != null) { + funcName = funcName.toUpperCase(); + if (funcName == "INDIRECT") { + let tempFunc = "luckysheet_indirect_check" + function_str.substr(30, function_str.length); + + //tempFunc = tempFunc.replace(/luckysheet_getcelldata/g, "luckysheet_indirect_check_return"); + + try { + let str = eval(tempFunc); + if (this.iscelldata($.trim(str))) { + this.isFunctionRangeSaveChange(str, r, c, dynamicArray_compute); + console.log(function_str, str, this.isFunctionRangeSave,r,c); + } + } + catch{ + + } + } + else if (funcName == "OFFSET") { + let tempFunc = "luckysheet_offset_check" + function_str.substr(28, function_str.length); + + let str = eval(tempFunc); + if (this.iscelldata($.trim(str))) { + this.isFunctionRangeSaveChange(str, r, c, dynamicArray_compute); + + //console.log(function_str, str, this.isFunctionRangeSave,r,c); + } + + //let result = eval(function_str); + + //console.log(function_str, result); + } + } + + } + }, execvertex: {}, execFunctionGroupData: null, execFunctionExist: null, @@ -4332,10 +4664,10 @@ const luckysheetformula = { quotalen += quota2.length; } - if ((fp.substr(0, 16) == "luckysheet_function." || fp.substr(0, 18) == "luckysheet_compareWith") && funclen != quotalen / 2) { + if ((fp.substr(0, 20) == "luckysheet_function." || fp.substr(0, 22) == "luckysheet_compareWith") && funclen != quotalen / 2) { fp += ")"; - if(fp.substr(0, 16) == "luckysheet_function."){ + if(fp.substr(0, 20) == "luckysheet_function."){ txt += ")"; } @@ -4410,7 +4742,7 @@ const luckysheetformula = { let fp = $.trim(_this.functionParser(txt)); - if ((fp.substr(0, 16) == "luckysheet_function." || fp.substr(0, 18) == "luckysheet_compareWith") ) { + if ((fp.substr(0, 20) == "luckysheet_function." || fp.substr(0, 22) == "luckysheet_compareWith") ) { _this.functionHTMLIndex = 0; } diff --git a/src/global/refresh.js b/src/global/refresh.js index 7a28101..4f3abe8 100644 --- a/src/global/refresh.js +++ b/src/global/refresh.js @@ -18,19 +18,21 @@ import { createFilterOptions } from '../controllers/filter'; import { getSheetIndex } from '../methods/get'; import Store from '../store'; -function jfrefreshgrid(data, range, cfg, cdformat, RowlChange) { +function jfrefreshgrid(data, range, cfg, cdformat, RowlChange, isRunExecFunction=true) { //单元格数据更新联动 - 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 }); + 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.execFunctionGroupData = null; } - formula.execFunctionExist.reverse(); - formula.execFunctionGroup(null, null, null, null, data); - formula.execFunctionGroupData = null; if (Store.clearjfundo) { Store.jfundo = [];