Browse Source

fix(undo redo bug fix): formula update bug

master
liuyang 5 years ago
parent
commit
373dc4f464
  1. 11
      src/controllers/controlHistory.js
  2. 126
      src/function/functionImplementation.js
  3. 12
      src/global/formula.js
  4. 56
      src/global/refresh.js

11
src/controllers/controlHistory.js

@ -37,6 +37,8 @@ const controlHistory = {
sheetmanage.changeSheetExec(ctr.sheetIndex); sheetmanage.changeSheetExec(ctr.sheetIndex);
} }
// formula.execFunctionExist = [];
if (ctr.type == "datachange") { if (ctr.type == "datachange") {
//如果有单元格为null,则对应公式应该删除 //如果有单元格为null,则对应公式应该删除
for(let s = 0; s < ctr.range.length; s++){ for(let s = 0; s < ctr.range.length; s++){
@ -50,14 +52,14 @@ const controlHistory = {
if(r > ctr.data.length - 1){ if(r > ctr.data.length - 1){
break; break;
} }
// formula.execFunctionExist.push({ "r": r, "c": c, "i": ctr.sheetIndex });
if(ctr.data[r][c] == null){ if(ctr.data[r][c] == null){
formula.delFunctionGroup(r,c); formula.delFunctionGroup(r,c);
} }
} }
} }
} }
formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据
let allParam = { let allParam = {
"cfg": ctr.config, "cfg": ctr.config,
@ -68,6 +70,7 @@ const controlHistory = {
} }
jfrefreshgrid(ctr.data, ctr.range, allParam); jfrefreshgrid(ctr.data, ctr.range, allParam);
// formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据
} }
else if (ctr.type == "pasteCut") { else if (ctr.type == "pasteCut") {
let s = { let s = {
@ -106,15 +109,17 @@ const controlHistory = {
for(let r = st_r;r < ed_r + 1; r++){ for(let r = st_r;r < ed_r + 1; r++){
for(let c = st_c; c < ed_c +1; c++){ 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){ if(ctr.data[r][c] == null){
formula.delFunctionGroup(r,c); formula.delFunctionGroup(r,c);
} }
} }
} }
} }
formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据
jfrefreshrange(ctr.data, ctr.range, ctr.cdformat); jfrefreshrange(ctr.data, ctr.range, ctr.cdformat);
// formula.execFunctionGroup(null, null, null, null, ctr.data);//取之前的数据
} }
else if (ctr.type == "resize") { else if (ctr.type == "resize") {
Store.config = ctr.config; Store.config = ctr.config;

126
src/function/functionImplementation.js

@ -23329,10 +23329,28 @@ const functionImplementation = {
var row_index = cellrange.row[0]; var row_index = cellrange.row[0];
var col_index = cellrange.column[0]; var col_index = cellrange.column[0];
let sheetdata = null; // let sheetdata = null;
sheetdata = Store.flowdata; // sheetdata = Store.flowdata;
if (formula.execFunctionGroupData != null) { // if (formula.execFunctionGroupData != null) {
sheetdata = formula.execFunctionGroupData; // 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){ switch(info_type){
@ -23346,11 +23364,11 @@ const functionImplementation = {
return 0; return 0;
break; break;
case "contents": case "contents":
if (sheetdata[row_index][col_index] == null || sheetdata[row_index][col_index].v == null || sheetdata[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; // value = 0;
} // }
return sheetdata[row_index][col_index].v; return value;
break; break;
case "filename": case "filename":
return file.name; return file.name;
@ -23375,7 +23393,7 @@ const functionImplementation = {
} }
break; break;
case "prefix": 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 ""; return "";
} }
@ -23399,7 +23417,7 @@ const functionImplementation = {
return row_index + 1; return row_index + 1;
break; break;
case "type": 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"; return "b";
} }
@ -25413,11 +25431,9 @@ const functionImplementation = {
var minSpot = arguments[6]; var minSpot = arguments[6];
var spotRadius = arguments[7]; var spotRadius = arguments[7];
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//定义需要格式化data数据 //定义需要格式化data数据
var dataformat = formula.readCellDataToOneArray(rangeValue); var dataformat = formula.readCellDataToOneArray(rangeValue);
@ -25559,11 +25575,9 @@ const functionImplementation = {
//定义需要格式化data数据 //定义需要格式化data数据
var dataformat = formula.readCellDataToOneArray(rangeValue); var dataformat = formula.readCellDataToOneArray(rangeValue);
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
@ -25696,11 +25710,9 @@ const functionImplementation = {
//定义需要格式化data数据 //定义需要格式化data数据
var dataformat = formula.readCellDataToOneArray(rangeValue); var dataformat = formula.readCellDataToOneArray(rangeValue);
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
@ -25845,11 +25857,9 @@ const functionImplementation = {
var offsetY = data[0].length; var offsetY = data[0].length;
} }
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
var width = cellSize[0]; var width = cellSize[0];
@ -25937,11 +25947,9 @@ const functionImplementation = {
//定义需要格式化data数据 //定义需要格式化data数据
var dataformat = formula.readCellDataToOneArray(rangeValue); var dataformat = formula.readCellDataToOneArray(rangeValue);
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
@ -26085,11 +26093,9 @@ const functionImplementation = {
var offsetY = data[0].length; var offsetY = data[0].length;
} }
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
var width = cellSize[0]; var width = cellSize[0];
@ -26177,11 +26183,9 @@ const functionImplementation = {
//定义需要格式化data数据 //定义需要格式化data数据
var dataformat = formula.readCellDataToOneArray(rangeValue); var dataformat = formula.readCellDataToOneArray(rangeValue);
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
@ -26268,11 +26272,9 @@ const functionImplementation = {
//定义需要格式化data数据 //定义需要格式化data数据
var dataformat = formula.readCellDataToOneArray(rangeValue); var dataformat = formula.readCellDataToOneArray(rangeValue);
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
@ -26369,11 +26371,9 @@ const functionImplementation = {
//定义需要格式化data数据 //定义需要格式化data数据
var dataformat = formula.readCellDataToOneArray(rangeValue); var dataformat = formula.readCellDataToOneArray(rangeValue);
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
@ -26464,11 +26464,9 @@ const functionImplementation = {
//定义需要格式化data数据 //定义需要格式化data数据
var dataformat = formula.readCellDataToOneArray(rangeValue); var dataformat = formula.readCellDataToOneArray(rangeValue);
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);
@ -26556,11 +26554,9 @@ const functionImplementation = {
//定义需要格式化data数据 //定义需要格式化data数据
//var dataformat = formula.readCellDataToOneArray(rangeValue); //var dataformat = formula.readCellDataToOneArray(rangeValue);
let sheetdata = null; let luckysheetfile = getluckysheetfile();
sheetdata = Store.flowdata; let index = getSheetIndex(Store.calculateSheetIndex);
if (formula.execFunctionGroupData != null) { let sheetdata = luckysheetfile[index].data;
sheetdata = formula.execFunctionGroupData;
}
//在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题 //在下面获得该单元格的长度和宽度,同时考虑了合并单元格问题
var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c); var cellSize = menuButton.getCellRealSize(sheetdata, cell_r, cell_c);

12
src/global/formula.js

@ -676,7 +676,7 @@ const luckysheetformula = {
num = num % d; num = num % d;
return num; return num;
}, },
getcellrange: function(txt) { getcellrange: function(txt, formulaIndex) {
if(txt==null || txt.length==0){ if(txt==null || txt.length==0){
return; return;
} }
@ -707,7 +707,11 @@ const luckysheetformula = {
} }
} }
else { else {
let index = getSheetIndex(Store.currentSheetIndex); let i = formulaIndex;
if(i==null){
i = Store.currentSheetIndex;
}
let index = getSheetIndex(i);
sheettxt = luckysheetfile[index].name; sheettxt = luckysheetfile[index].name;
sheetIndex = luckysheetfile[index].index; sheetIndex = luckysheetfile[index].index;
sheetdata = Store.flowdata; sheetdata = Store.flowdata;
@ -4553,7 +4557,7 @@ const luckysheetformula = {
isFunctionRangeSaveChange: function (str, r, c, index, dynamicArray_compute) { isFunctionRangeSaveChange: function (str, r, c, index, dynamicArray_compute) {
let _this = this; let _this = this;
if (r != null && c != null) { if (r != null && c != null) {
let range = _this.getcellrange($.trim(str)); let range = _this.getcellrange($.trim(str), index);
let row = range.row, let row = range.row,
col = range.column, col = range.column,
sheetIndex = range.sheetIndex; sheetIndex = range.sheetIndex;
@ -4822,7 +4826,7 @@ const luckysheetformula = {
} }
// console.time("1"); // console.time("1");
let iii =0;
while (stack.length > 0) { while (stack.length > 0) {
let u = stack.shift(); let u = stack.shift();

56
src/global/refresh.js

@ -28,20 +28,7 @@ function jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefres
range = Store.luckysheet_select_save; 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){ 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]); 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){ if(isRefreshCanvas){
setTimeout(function () { setTimeout(function () {
@ -330,18 +330,7 @@ function jfrefreshgridall(colwidth, rowheight, data, cfg, range, ctrlType, ctrlV
} }
function jfrefreshrange(data, range, cdformat) { 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) { if (Store.clearjfundo) {
Store.jfundo = []; Store.jfundo = [];
@ -368,6 +357,19 @@ function jfrefreshrange(data, range, cdformat) {
Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["luckysheet_conditionformat_save"] = 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 () { setTimeout(function () {
luckysheetrefreshgrid(); luckysheetrefreshgrid();

Loading…
Cancel
Save