javahuang 5 years ago
parent
commit
5d3c3f1600
  1. 38
      docs/zh/guide/api.md
  2. 13
      src/controllers/constant.js
  3. 6
      src/controllers/insertFormula.js
  4. 11
      src/controllers/keyboard.js
  5. 2
      src/controllers/postil.js
  6. 102
      src/controllers/rowColumnOperation.js
  7. 2
      src/controllers/selection.js
  8. 14
      src/controllers/sheetmanage.js
  9. 2
      src/css/luckysheet-core.css
  10. 34
      src/function/func.js
  11. 51
      src/function/functionImplementation.js
  12. 338
      src/global/api.js
  13. 9
      src/global/cursorPos.js
  14. 353
      src/global/extend.js
  15. 610
      src/global/formula.js
  16. 4
      src/global/getdata.js
  17. 20
      src/global/refresh.js
  18. 3
      src/store/index.js

38
docs/zh/guide/api.md

@ -1444,9 +1444,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### deleteRangeConditionalFormat(itemIndex [,setting])
[todo]
- **参数**
- {Number} [itemIndex]: 条件格式规则索引
@ -1469,9 +1466,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### clearRange([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1481,7 +1475,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
- **说明**
清除指定工作表指定单元格区域的内容,返回清除掉的数据,不同于删除选区的功能,不需要设定单元格移动情况
清除指定工作表指定单元格区域的内容,不同于删除选区的功能,不需要设定单元格移动情况
- **示例**:
@ -1492,9 +1486,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### deleteRange(move [,setting])
[todo]
- **参数**
- {String} [move]: 删除后,右侧还是下方的单元格移动
@ -1505,13 +1496,13 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
+ `"up"`: 下方单元格上移
- {PlainObject} [setting]: 可选参数
+ {Array | Object | String} [range]: 要删除的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,允许多个选区组成的数组;默认为当前选区
+ {Object | String} [range]: 要删除的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`;默认为当前选区
+ {Number} [order]: 工作表下标;默认值为当前工作表下标
+ {Function} [success]: 操作结束的回调函数
- **说明**
删除指定工作表指定单元格区域,返回删除掉的数据,同时,指定是右侧单元格左移还是下方单元格上移
删除指定工作表指定单元格区域,同时,指定是右侧单元格左移还是下方单元格上移
- **示例**:
@ -1558,9 +1549,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### matrixOperation(type [,setting])
[todo]
- **参数**
- {String} [type]: 矩阵操作的类型
@ -1603,9 +1591,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### matrixCalculation(type, number [,setting])
[todo]
- **参数**
- {String} [type]: 计算方式
@ -1678,8 +1663,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getSheet([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1695,9 +1678,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getSheetData([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1711,9 +1691,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getConfig([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1725,20 +1702,17 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setConfig([setting])
[todo]
### setConfig(cfg, [setting])
- **参数**
- {Object} [cfg]: config配置
- {PlainObject} [setting]: 可选参数
+ {Number} [order]: 工作表下标;默认值为当前工作表下标
+ {Function} [success]: 操作结束的回调函数
- **说明**
快捷设置当前工作表config配置
快捷设置指定工作表config配置
------------

13
src/controllers/constant.js

@ -287,24 +287,22 @@ function rightclickHTML(){
</div>
<div id="luckysheet-cols-rows-add">
<div class="luckysheet-menuseparator luckysheet-mousedown-cancel" role="separator"></div>
<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
<div id="luckysheet-top-left-add-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">
${rightclick.to}
<span class="luckysheet-cols-rows-shift-left">${rightclick.left}</span>
${rightclick.add}
<input type="text" class="luckysheet-mousedown-cancel" placeholder="${rightclick.number}" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align:center;margin-left:5px;"/>
<span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">${rightclick.column}</span>
<button id="luckysheet-add-lefttop" class="btn btn-primary luckysheet-copy-btn luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">${rightclick.confirm}</button>
</div>
</div>
<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
<div id="luckysheet-bottom-right-add-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">
${rightclick.to}
<span class="luckysheet-cols-rows-shift-right">${rightclick.right}</span>
${rightclick.add}
<input type="text" class="luckysheet-mousedown-cancel" placeholder="${rightclick.number}" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;;margin-left:5px;"/>
<span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">${rightclick.column}</span>
<button id="luckysheet-add-rightbottom" class="btn btn-primary luckysheet-copy-btn luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">${rightclick.confirm}</button>
</div>
</div>
<div id="luckysheet-del-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
@ -313,13 +311,12 @@ function rightclickHTML(){
<span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">${rightclick.column}</span>
</div>
</div>
<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
<div id="luckysheet-column-row-width-selected" class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel">
<span class="luckysheet-cols-rows-shift-word luckysheet-mousedown-cancel">${rightclick.column}</span>
<span class="luckysheet-cols-rows-shift-size luckysheet-mousedown-cancel">${rightclick.width}</span>
<input type="number" class="luckysheet-mousedown-cancel rcsize" min="0" max="255" placeholder="${rightclick.number}" value="" style="width:40px;height:20px;box-sizing:border-box;text-align: center;;margin-left:5px;">
px
<button id="luckysheet-rows-cols-changesize" class="btn btn-primary luckysheet-copy-btn luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">${rightclick.confirm}</button>
</div>
</div>
</div>
@ -409,7 +406,6 @@ function rightclickHTML(){
${rightclick.to}${rightclick.top}${rightclick.add}
<input type="text" class="luckysheet-mousedown-cancel" placeholder="${rightclick.number}" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;;margin-left:5px;"/>
<span class="luckysheet-mousedown-cancel">${rightclick.row}</span>
<button id="luckysheet-addTopRows" class="btn btn-primary luckysheet-copy-btn luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">${rightclick.confirm}</button>
</div>
</div>
<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
@ -417,7 +413,6 @@ function rightclickHTML(){
${rightclick.to}${rightclick.bottom}${rightclick.add}
<input type="text" class="luckysheet-mousedown-cancel" placeholder="${rightclick.number}" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;;margin-left:5px;"/>
<span class="luckysheet-mousedown-cancel">${rightclick.row}</span>
<button id="luckysheet-addBottomRows" class="btn btn-primary luckysheet-copy-btn luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">${rightclick.confirm}</button>
</div>
</div>
<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
@ -425,7 +420,6 @@ function rightclickHTML(){
${rightclick.to}${rightclick.left}${rightclick.add}
<input type="text" class="luckysheet-mousedown-cancel" placeholder="${rightclick.number}" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;;margin-left:5px;"/>
<span class="luckysheet-mousedown-cancel">${rightclick.column}</span>
<button id="luckysheet-addLeftCols" class="btn btn-primary luckysheet-copy-btn luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">${rightclick.confirm}</button>
</div>
</div>
<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel">
@ -433,7 +427,6 @@ function rightclickHTML(){
${rightclick.to}${rightclick.right}${rightclick.add}
<input type="text" class="luckysheet-mousedown-cancel" placeholder="${rightclick.number}" value="1" style="width:40px;height:20px;box-sizing:border-box;text-align: center;;margin-left:5px;"/>
<span class="luckysheet-mousedown-cancel">${rightclick.column}</span>
<button id="luckysheet-addRightCols" class="btn btn-primary luckysheet-copy-btn luckysheet-mousedown-cancel" style="margin-left:5px;padding:2px 3px;line-height:12px;font-size:12px;">${rightclick.confirm}</button>
</div>
</div>
</div>

6
src/controllers/insertFormula.js

@ -329,7 +329,7 @@ const insertFormula = {
}
}
else{ //参数是公式
$("#luckysheet-search-formula-parm .parmBox").eq(index).find(".val").text(" = {"+ eval($.trim(formula.functionParser("=" + parmtxt))) +"}");
$("#luckysheet-search-formula-parm .parmBox").eq(index).find(".val").text(" = {"+ eval($.trim(formula.functionParserExe("=" + parmtxt))) +"}");
}
})
@ -419,7 +419,7 @@ const insertFormula = {
luckysheet_count_show(col_pre, row_pre, col - col_pre - 1, row - row_pre - 1, cellrange.row, cellrange.column);
$("#luckysheet-search-formula-parm .parmBox").eq(formula.data_parm_index).find(".val").text(" = {"+ eval($.trim(formula.functionParser("=" + parmtxt))) +"}");
$("#luckysheet-search-formula-parm .parmBox").eq(formula.data_parm_index).find(".val").text(" = {"+ eval($.trim(formula.functionParserExe("=" + parmtxt))) +"}");
}
},
functionStrCompute: function(){
@ -471,7 +471,7 @@ const insertFormula = {
$("#luckysheet-functionbox-cell").html($("#luckysheet-rich-text-editor").html());
if(isVal){ //公式计算
let fp = $.trim(formula.functionParser($("#luckysheet-rich-text-editor").text()));
let fp = $.trim(formula.functionParserExe($("#luckysheet-rich-text-editor").text()));
let result = null;

11
src/controllers/keyboard.js

@ -909,4 +909,15 @@ export function keyboardInitial(){
}).change(function(){
server.saveParam("na", null, $(this).val());
});
// 右击菜单的input输入框 敲击Enter一样生效
$("#" + Store.container).add("input.luckysheet-mousedown-cancel").keydown(function (event) {
const element = event.target.closest('.luckysheet-cols-menuitem');
if (typeof(element) != 'undefined' && element != null && event.keyCode === 13){
$(element).trigger('click');
}
})
}

2
src/controllers/postil.js

@ -799,7 +799,7 @@ const luckysheetPostil = {
editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据
Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].data = Store.flowdata;
formula.execFunctionGroupData = Store.flowdata;
// formula.execFunctionGroupData = Store.flowdata;
//共享编辑模式
if(server.allowUpdate){

102
src/controllers/rowColumnOperation.js

@ -929,7 +929,14 @@ export function rowColumnOperationInitial(){
});
//向左增加列,向上增加行
$("#luckysheet-add-lefttop, #luckysheet-add-lefttop_t").click(function (event) {
// $("#luckysheet-add-lefttop, #luckysheet-add-lefttop_t").click(function (event) {
$("#luckysheet-top-left-add-selected").click(function (event) {
// Click input element, don't comfirm
if(event.target.nodeName === 'INPUT'){
return;
}
$("#luckysheet-rightclick-menu").hide();
luckysheetContainerFocus();
@ -950,7 +957,7 @@ export function rowColumnOperationInitial(){
let $t = $(this), value = $t.parent().find("input").val();
let $t = $(this), value = $t.find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert(locale_info.tipInputNumber);
@ -977,7 +984,16 @@ export function rowColumnOperationInitial(){
let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][0];
luckysheetextendtable(Store.luckysheetRightHeadClickIs, st_index, value, "lefttop");
});
$("#luckysheet-addTopRows").click(function (event) {
// Add the row up, and click the text area to trigger the confirmation instead of clicking the confirmation button to enhance the experience
// $("#luckysheet-addTopRows").click(function (event) {
$("#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:first-child").click(function (event) {
// Click input element, don't comfirm
if(event.target.nodeName === 'INPUT'){
return;
}
$("#luckysheet-rightclick-menu").hide();
luckysheetContainerFocus();
@ -996,7 +1012,7 @@ export function rowColumnOperationInitial(){
return;
}
let $t = $(this), value = $t.parent().find("input").val();
let $t = $(this), value = $t.find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert(locale_info.tipInputNumber);
@ -1022,8 +1038,24 @@ export function rowColumnOperationInitial(){
let st_index = Store.luckysheet_select_save[0].row[0];
luckysheetextendtable('row', st_index, value, "lefttop");
$("#luckysheetColsRowsHandleAdd_sub").hide();
})
$("#luckysheet-addLeftCols").click(function (event) {
// // input输入时阻止冒泡,禁止父级元素的确认事件触发
// $("input.luckysheet-mousedown-cancel").click(function(event) {
// event.stopPropagation;
// })
// $("#luckysheet-addLeftCols").click(function (event) {
$("#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(3)").click(function (event) {
// Click input element, don't comfirm
if(event.target.nodeName === 'INPUT'){
return;
}
$("#luckysheet-rightclick-menu").hide();
luckysheetContainerFocus();
@ -1042,7 +1074,7 @@ export function rowColumnOperationInitial(){
return;
}
let $t = $(this), value = $t.parent().find("input").val();
let $t = $(this), value = $t.find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert(locale_info.tipInputNumber);
@ -1068,10 +1100,20 @@ export function rowColumnOperationInitial(){
let st_index = Store.luckysheet_select_save[0].column[0];
luckysheetextendtable('column', st_index, value, "lefttop");
$("#luckysheetColsRowsHandleAdd_sub").hide();
})
//向右增加列,向下增加行
$("#luckysheet-add-rightbottom, #luckysheet-add-rightbottom_t").click(function (event) {
// $("#luckysheet-add-rightbottom, #luckysheet-add-rightbottom_t").click(function (event) {
$("#luckysheet-bottom-right-add-selected").click(function (event) {
// Click input element, don't comfirm
if(event.target.nodeName === 'INPUT'){
return;
}
$("#luckysheet-rightclick-menu").hide();
luckysheetContainerFocus();
@ -1090,7 +1132,7 @@ export function rowColumnOperationInitial(){
return;
}
let $t = $(this), value = $t.parent().find("input").val();
let $t = $(this), value = $t.find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert(locale_info.tipInputNumber);
@ -1118,7 +1160,15 @@ export function rowColumnOperationInitial(){
let st_index = Store.luckysheet_select_save[0][Store.luckysheetRightHeadClickIs][1];
luckysheetextendtable(Store.luckysheetRightHeadClickIs, st_index, value, "rightbottom");
});
$("#luckysheet-addBottomRows").click(function (event) {
// $("#luckysheet-addBottomRows").click(function (event) {
$("#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(2)").click(function (event) {
// Click input element, don't comfirm
if(event.target.nodeName === 'INPUT'){
return;
}
$("#luckysheet-rightclick-menu").hide();
luckysheetContainerFocus();
@ -1137,7 +1187,7 @@ export function rowColumnOperationInitial(){
return;
}
let $t = $(this), value = $t.parent().find("input").val();
let $t = $(this), value = $t.find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert(locale_info.tipInputNumber);
@ -1164,8 +1214,17 @@ export function rowColumnOperationInitial(){
let st_index = Store.luckysheet_select_save[0].row[1];
luckysheetextendtable('row', st_index, value, "rightbottom");
$("#luckysheetColsRowsHandleAdd_sub").hide();
});
$("#luckysheet-addRightCols").click(function (event) {
// $("#luckysheet-addRightCols").click(function (event) {
$("#luckysheetColsRowsHandleAdd_sub .luckysheet-cols-menuitem:nth-child(4)").click(function (event) {
// Click input element, don't comfirm
if(event.target.nodeName === 'INPUT'){
return;
}
$("#luckysheet-rightclick-menu").hide();
luckysheetContainerFocus();
@ -1184,7 +1243,7 @@ export function rowColumnOperationInitial(){
return;
}
let $t = $(this), value = $t.parent().find("input").val();
let $t = $(this), value = $t.find("input").val();
if (!isRealNum(value)) {
if(isEditMode()){
alert(locale_info.tipInputNumber);
@ -1211,6 +1270,9 @@ export function rowColumnOperationInitial(){
let st_index = Store.luckysheet_select_save[0].column[1];
luckysheetextendtable('column', st_index, value, "rightbottom");
$("#luckysheetColsRowsHandleAdd_sub").hide();
});
//删除选中行列
@ -1577,6 +1639,10 @@ export function rowColumnOperationInitial(){
delete d[r][c]["spl"];
}
if(d[r][c]["ct"] != null && d[r][c]["ct"].t == 'inlineStr'){
delete d[r][c]["ct"];
}
}
else{
d[r][c] = null;
@ -1590,11 +1656,19 @@ export function rowColumnOperationInitial(){
});
//行高列宽设置
$("#luckysheet-rows-cols-changesize").click(function(){
// $("#luckysheet-rows-cols-changesize").click(function(){
$("#luckysheet-column-row-width-selected").click(function (event) {
// Click input element, don't comfirm
if(event.target.nodeName === 'INPUT'){
return;
}
$("#luckysheet-rightclick-menu").hide();
luckysheetContainerFocus();
let size = parseInt($(this).siblings("input[type='number']").val().trim());
// let size = parseInt($(this).siblings("input[type='number']").val().trim());
let size = parseInt($(this).closest('.luckysheet-cols-menuitem').find("input[type='number']").val().trim());
if(size < 0 || size > 255){
const locale_info = locale().info;

2
src/controllers/selection.js

@ -1451,7 +1451,7 @@ const selection = {
func = "=" + formula.functionCopy(func, "left", Math.abs(offsetCol));
}
let funcV = formula.execfunction(func, h, c, true);
let funcV = formula.execfunction(func, h, c, undefined, true);
if(value.spl != null){
value.f = funcV[2];

14
src/controllers/sheetmanage.js

@ -864,7 +864,8 @@ const sheetmanage = {
Store.flowdata = file["data"];
editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据
formula.execFunctionGroupData = null;
// formula.execFunctionGroupData = null;
formula.execFunctionGlobalData = null;
window.luckysheet_getcelldata_cache = null;
this.sheetParamRestore(file, Store.flowdata);
@ -1152,7 +1153,7 @@ const sheetmanage = {
_this.restoreselect();
},
checkLoadSheetIndex: function(file) {
let calchain = file.calcChain; //index
let calchain = formula.getAllFunctionGroup();//file.calcChain; //index
let chart = file.chart; //dataSheetIndex
let pivotTable = file.pivotTable; //pivotDataSheetIndex
@ -1166,7 +1167,14 @@ const sheetmanage = {
let dataindex = f.index;
let formulaTxt = getcellFormula(f.r, f.c, dataindex);
if(formulaTxt==null){
let file = Store.luckysheetfile[this.getSheetIndex(dataindex)];
file.data = this.buildGridData(file);
formulaTxt = getcellFormula(f.r, f.c, dataindex);
}
formula.functionParser(formulaTxt, (str)=>{
formula.addToCellList(formulaTxt, str);
if(str.indexOf("!")>-1){
let name = str.substr(0, str.indexOf('!'));
dataNameList[name] = true;
@ -1178,7 +1186,7 @@ const sheetmanage = {
}
if(cache[dataindex.toString()] == null){
ret.push(dataindex);
// ret.push(dataindex);
cache[dataindex.toString()] = 1;
}
}

2
src/css/luckysheet-core.css

@ -360,7 +360,7 @@
background-color: #0081f9;
height: 3px;
width: 55%;
left: 25%;
left: 30%;
}
.luckysheet-toolbar-button-inner-box .luckysheet-icon,

34
src/function/func.js

@ -190,7 +190,7 @@ function luckysheet_compareWith() {
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){
value = luckysheet_calcADPMM(fp[m][n], sp, tp[p][n]);//parseFloat(fp[m][n]) * parseFloat(tp[m][n]);
value = luckysheet_calcADPMM(fp[m][n], sp, tp[m][n]);//parseFloat(fp[m][n]) * parseFloat(tp[m][n]);
}
else{
value = error.v;
@ -1621,15 +1621,16 @@ function luckysheet_getcelldata(txt) {
}
}
else {
let index = getSheetIndex(Store.currentSheetIndex);
let index = getSheetIndex(Store.calculateSheetIndex);
sheettxt = luckysheetfile[index].name;
sheetIndex = luckysheetfile[index].index;
sheetdata = Store.flowdata;
// sheetdata = Store.flowdata;
sheetdata = luckysheetfile[index].data;
rangetxt = val[0];
if (formula.execFunctionGroupData != null) {
sheetdata = formula.execFunctionGroupData;
}
// if (formula.execFunctionGroupData != null) {
// sheetdata = formula.execFunctionGroupData;
// }
}
if (rangetxt.indexOf(":") == -1) {
@ -1642,6 +1643,13 @@ function luckysheet_getcelldata(txt) {
"column": [col, col]
})[0][0];
if (formula.execFunctionGlobalData != null) {
let ef = formula.execFunctionGlobalData[row+"_"+col+"_"+sheetIndex];
if(ef!=null){
ret = ef;
}
}
//范围的长宽
let rowl = 1;
let coll = 1;
@ -1700,6 +1708,18 @@ function luckysheet_getcelldata(txt) {
"row": row,
"column": col
});
if(formula.execFunctionGlobalData!=null){
for(let r=row[0];r<=row[1];r++){
for(let c=col[0];c<=col[1];c++){
let ef = formula.execFunctionGlobalData[r+"_"+c+"_"+sheetIndex];
if(ef!=null){
ret[r-row[0]][c-col[0]] = ef;
}
}
}
}
//范围的长宽
let rowl = row[1] - row[0] + 1;
@ -1887,7 +1907,7 @@ function luckysheet_offset_check() {
return formula.error.r;
}
return getRangetxt(Store.currentSheetIndex, {
return getRangetxt(Store.calculateSheetIndex, {
row: [cellRow0, cellRow1],
column: [cellCol0, cellCol1]
});

51
src/function/functionImplementation.js

@ -10299,11 +10299,13 @@ const functionImplementation = {
}
}
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;
// sheetdata = Store.flowdata;
// if (formula.execFunctionGroupData != null) {
// sheetdata = formula.execFunctionGroupData;
// }
//计算
if(A1){
@ -10319,6 +10321,13 @@ const functionImplementation = {
return 0;
}
if (formula.execFunctionGlobalData != null) {
let ef = formula.execFunctionGlobalData[row+"_"+col+"_"+Store.calculateSheetIndex];
if(ef!=null){
return ef.v;
}
}
return sheetdata[row][col].v;
}
else{
@ -10338,6 +10347,13 @@ const functionImplementation = {
return 0;
}
if (formula.execFunctionGlobalData != null) {
let ef = formula.execFunctionGlobalData[row+"_"+col+"_"+Store.calculateSheetIndex];
if(ef!=null){
return ef.v;
}
}
return sheetdata[row][col].v;
}
else{
@ -10617,11 +10633,15 @@ const functionImplementation = {
var cellRow1 = cellRow0 + height - 1;
var cellCol1 = cellCol0 + width - 1;
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;
if (cellRow0 < 0 || cellRow1 >= sheetdata.length || cellCol0 < 0 || cellCol1 >= sheetdata[0].length){
return formula.error.r;
@ -10633,7 +10653,16 @@ const functionImplementation = {
var rowArr = [];
for(var c = cellCol0; c <= cellCol1; c++){
if (sheetdata[r][c] != null && !isRealNull(sheetdata[r][c].v)){
if(formula.execFunctionGlobalData != null && formula.execFunctionGlobalData[r+"_"+c+"_"+Store.calculateSheetIndex]!=null){
let ef = formula.execFunctionGlobalData[r+"_"+c+"_"+Store.calculateSheetIndex];
if(ef!=null){
rowArr.push(ef.v);
}
else{
rowArr.push(0);
}
}
else if (sheetdata[r][c] != null && !isRealNull(sheetdata[r][c].v)){
rowArr.push(sheetdata[r][c].v);
}
else{

338
src/global/api.js

@ -1136,6 +1136,10 @@ export function getRangeHtml(options = {}) {
}];
}
if(getObjType(range) != 'array'){
return tooltip.info("The range parameter is invalid.", "");
}
let file = Store.luckysheetfile[order];
if(file == null){
@ -3040,6 +3044,10 @@ export function setRangeConditionalFormatDefault(conditionName, conditionValue,
cellrange = [cellrange];
}
if(getObjType(cellrange) != 'array'){
return tooltip.info('The cellrange parameter is invalid.', '');
}
let rule = {
"type": "default",
"cellrange": cellrange,
@ -3309,6 +3317,10 @@ export function setRangeConditionalFormat(type, options = {}) {
cellrange = [cellrange];
}
if(getObjType(cellrange) != 'array'){
return tooltip.info('The cellrange parameter is invalid.', '');
}
let rule = {
"type": type,
"cellrange": cellrange,
@ -3342,14 +3354,247 @@ export function setRangeConditionalFormat(type, options = {}) {
/**
*
* @param {String} move 删除后右侧还是下方的单元格移动
* 为指定下标的工作表删除条件格式规则返回被删除的条件格式规则
* @param {Number} itemIndex 条件格式规则索引
* @param {Object} options 可选参数
* @param {Number} options.order 工作表下标默认值为当前工作表下标
* @param {Function} options.success 操作结束的回调函数
*/
function deleteRange(move, options = {}) {
export function deleteRangeConditionalFormat(itemIndex, options = {}) {
if(!isRealNum(itemIndex)){
return tooltip.info('The itemIndex parameter is invalid.', '');
}
itemIndex = Number(itemIndex);
let {
order = getSheetIndex(Store.currentSheetIndex),
success
} = {...options}
let file = Store.luckysheetfile[order];
if(file == null){
return tooltip.info('The order parameter is invalid.', '');
}
let cdformat = $.extend(true, [], file.luckysheet_conditionformat_save);
if(cdformat.length == 0){
return tooltip.info('This worksheet has no conditional format to delete', '');
}
else if(cdformat[itemIndex] == null){
return tooltip.info('The conditional format of the index cannot be found', '');
}
let cdformatItem = cdformat.splice(itemIndex, 1);
//保存之前的规则
let fileH = $.extend(true, [], Store.luckysheetfile);
let historyRules = conditionformat.getHistoryRules(fileH);
//保存当前的规则
file["luckysheet_conditionformat_save"] = cdformat;
let fileC = $.extend(true, [], Store.luckysheetfile);
let currentRules = conditionformat.getCurrentRules(fileC);
//刷新一次表格
conditionformat.ref(historyRules, currentRules);
//发送给后台
if(server.allowUpdate){
server.saveParam("all", file.index, ruleArr, { "k": "luckysheet_conditionformat_save" });
}
setTimeout(() => {
if (success && typeof success === 'function') {
success();
}
}, 1);
return cdformatItem;
}
/**
* 清除指定工作表指定单元格区域的内容不同于删除选区的功能不需要设定单元格移动情况
* @param {Object} options 可选参数
* @param {Array | Object | String} options.range 要清除的选区范围
* @param {Number} options.order 工作表下标默认值为当前工作表下标
* @param {Function} options.success 操作结束的回调函数
*/
export function clearRange(options = {}) {
let {
range = Store.luckysheet_select_save,
order = getSheetIndex(Store.currentSheetIndex),
success
} = {...options}
if(getObjType(range) == 'string'){
if(!formula.iscelldata(range)){
return tooltip.info("The range parameter is invalid.", "");
}
let cellrange = formula.getcellrange(range);
range = [{
"row": cellrange.row,
"column": cellrange.column
}]
}
else if(getObjType(range) == 'object'){
if(range.row == null || range.column == null){
return tooltip.info("The range parameter is invalid.", "");
}
range = [{
"row": range.row,
"column": range.column
}];
}
if(getObjType(range) != 'array'){
return tooltip.info("The range parameter is invalid.", "");
}
let file = Store.luckysheetfile[order];
if(file == null){
return tooltip.info("The order parameter is invalid.", "");
}
let cfg = $.extend(true, {}, file.config);
let has_PartMC = false;
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];
has_PartMC = hasPartMC(cfg, r1, r2, c1, c2);
if(has_PartMC){
break;
}
}
if(has_PartMC){
return tooltip.info('Cannot perform this operation on partially merged cells', '');
}
let d = $.extend(true, [], file.data);
if(d.length == 0){
d = $.extend(true, [], sheetmanage.buildGridData(file));
}
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];
for(let r = r1; r <= r2; r++){
for(let c = c1; c <= c2; c++){
let cell = d[r][c];
if(getObjType(cell) == "object"){
delete cell["m"];
delete cell["v"];
if(cell["f"] != null){
delete cell["f"];
formula.delFunctionGroup(r, c, file.index);
delete cell["spl"];
}
if(cell["ct"] != null && cell["ct"].t == 'inlineStr'){
delete cell["ct"];
}
}
else{
d[r][c] = null;
}
}
}
}
if(file.index == Store.currentSheetIndex){
jfrefreshgrid(d, range);
}
else{
file.data = d;
}
if (success && typeof success === 'function') {
success();
}
}
/**
* 删除指定工作表指定单元格区域返回删除掉的数据同时指定是右侧单元格左移还是下方单元格上移
* @param {String} move 删除后单元格左移/上移
* @param {Object} options 可选参数
* @param {Object | String} options.range 要删除的选区范围
* @param {Number} options.order 工作表下标默认值为当前工作表下标
* @param {Function} options.success 操作结束的回调函数
*/
export function deleteRange(move, options = {}) {
let moveList = ['left', 'up'];
if(!moveList.includes(move)){
return tooltip.info("The move parameter is invalid.", "");
}
let {
range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],
order = getSheetIndex(Store.currentSheetIndex),
success
} = {...options}
if(getObjType(range) == 'string'){
if(!formula.iscelldata(range)){
return tooltip.info("The range parameter is invalid.", "");
}
let cellrange = formula.getcellrange(range);
range = {
"row": cellrange.row,
"column": cellrange.column
};
}
if(getObjType(range) != 'object' || range.row == null || range.column == null){
return tooltip.info("The range parameter is invalid.", "");
}
let file = Store.luckysheetfile[order];
if(file == null){
return tooltip.info("The order parameter is invalid.", "");
}
let str = range.row[0],
edr = range.row[1],
stc = range.column[0],
edc = range.column[1];
if(move == 'left'){
luckysheetDeleteCell('moveLeft', str, edr, stc, edc, order);
}
else if(move == 'up'){
luckysheetDeleteCell('moveUp', str, edr, stc, edc, order);
}
if (success && typeof success === 'function') {
success();
}
}
/**
* 指定工作表指定单元格区域的数据进行矩阵操作返回操作成功后的结果数据
* @param {String} type 矩阵操作的类型
@ -4033,6 +4278,93 @@ export function getSheet(options = {}){
}
/**
* 快捷返回指定工作表的数据
* @param {Object} options 可选参数
* @param {Number} options.order 工作表下标默认值为当前工作表下标
*/
export function getSheetData(options = {}) {
let {
order = getSheetIndex(Store.currentSheetIndex)
} = {...options};
let file = Store.luckysheetfile[order];
if(file == null){
return tooltip.info("The order parameter is invalid.", "");
}
let data = $.extend(true, [], file.data);
if(data == null || data.length == 0){
data = $.extend(true, [], sheetmanage.buildGridData(file));
}
return data;
}
/**
* 快捷返回指定工作表的config配置
* @param {Object} options 可选参数
* @param {Number} options.order 工作表下标默认值为当前工作表下标
*/
export function getConfig(options = {}) {
let {
order = getSheetIndex(Store.currentSheetIndex)
} = {...options};
let file = Store.luckysheetfile[order];
if(file == null){
return tooltip.info("The order parameter is invalid.", "");
}
let config = $.extend(true, {}, file.config);
return config;
}
/**
* 快捷设置指定工作表config配置
* @param {Object} options 可选参数
* @param {Number} options.order 工作表下标默认值为当前工作表下标
* @param {Function} options.success 操作结束的回调函数
*/
export function setConfig(cfg, options = {}) {
if(getObjType(cfg) != 'object'){
return tooltip.info("The cfg parameter is invalid.", "");
}
let {
order = getSheetIndex(Store.currentSheetIndex),
success
} = {...options};
let file = Store.luckysheetfile[order];
if(file == null){
return tooltip.info("The order parameter is invalid.", "");
}
file.config = cfg;
if(file.index == Store.currentSheetIndex){
Store.config = cfg;
if("rowhidden" in cfg || "colhidden" in cfg || "rowlen" in cfg || "columnlen" in cfg){
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
if (success && typeof success === 'function') {
success();
}
}
/**
* 返回所有表格数据结构的一维数组luckysheetfile
*/

9
src/global/cursorPos.js

@ -48,11 +48,18 @@ function getCursortPosition(textDom){
}
function hideMenuByCancel(event){
// Right-click the menu in the title bar, and click on the elements whose class is luckysheet-cols-rows-shift-left and luckysheet-cols-rows-shift-right will trigger the hiding of the menu bar. It should be prohibited. Exclude these two elements. There may be more Other elements will also jump here for more testing
if(event.target.classList.contains('luckysheet-cols-rows-shift-left') || event.target.classList.contains('luckysheet-cols-rows-shift-right')){
return;
}
if (!$(event.target).hasClass("luckysheet-mousedown-cancel") && $(event.target).filter("[class*='sp-palette']").length == 0 && $(event.target).filter("[class*='sp-thumb']").length == 0 && $(event.target).filter("[class*='sp-']").length == 0) {
$("#luckysheet-rightclick-menu").hide();
$("#luckysheet-cols-h-hover").hide();
$("#luckysheet-cols-menu-btn").hide();
$("#luckysheet-rightclick-menu").hide();
// $("#luckysheet-rightclick-menu").hide();
$("#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu, #luckysheet-user-menu").hide();
$("body > .luckysheet-filter-menu, body > .luckysheet-filter-submenu, body > .luckysheet-cols-menu").hide();
//$("body > luckysheet-menuButton").hide();

353
src/global/extend.js

@ -1612,6 +1612,13 @@ function luckysheetDeleteCell(type, str, edr, stc, edc, order) {
else if(str <= r && edr >= r + rs - 1 && edc < c){
merge_new[r + "_" + (c - clen)] = { "r": r, "c": c - clen, "rs": rs, "cs": cs };
}
else{
for(let r_i = r; r_i <= r + rs - 1; r_i++){
for(let c_i = c; c_i <= c + cs - 1; c_i++){
delete d[r_i][c_i].mc;
}
}
}
}
else if(type == "moveUp"){
if(stc > c + cs - 1 || edc < c || str > r + rs - 1){
@ -1620,6 +1627,13 @@ function luckysheetDeleteCell(type, str, edr, stc, edc, order) {
else if(stc <= c && edc >= c + cs - 1 && edr < r){
merge_new[(r - rlen) + "_" + c] = { "r": r - rlen, "c": c, "rs": rs, "cs": cs };
}
else{
for(let r_i = r; r_i <= r + rs - 1; r_i++){
for(let c_i = c; c_i <= c + cs - 1; c_i++){
delete d[r_i][c_i].mc;
}
}
}
}
}
cfg["merge"] = merge_new;
@ -1905,19 +1919,9 @@ function luckysheetDeleteCell(type, str, edr, stc, edc, order) {
CFr2 = cf_range[j].row[1],
CFc1 = cf_range[j].column[0],
CFc2 = cf_range[j].column[1];
if(!(str > CFr2 || edr < CFr1) || !(stc > CFc2 || edc < CFc1)){
let range = conditionformat.CFSplitRange(
cf_range[j],
{ "row": [str, edr], "column": [stc, edc] },
{ "row": [str, edr], "column": [stc, edc] },
"restPart"
);
cf_new_range.concat(range);
}
else{
cf_new_range.push(cf_range[j]);
if(!(str <= CFr1 && edr >= CFr2 && stc <= CFc1 && edc >= CFc2)){
cf_new_range = getMoveRange(type, str, edr, stc, edc, CFr1, CFr2, CFc1, CFc2, rlen, clen);
}
}
@ -1978,18 +1982,8 @@ function luckysheetDeleteCell(type, str, edr, stc, edc, order) {
bd_c1 = borderRange[j].column[0],
bd_c2 = borderRange[j].column[1];
if(!(str > bd_r2 || edr < bd_r1) || !(stc > bd_c2 || edc < bd_c1)){
let range = conditionformat.CFSplitRange(
borderRange[j],
{ "row": [str, edr], "column": [stc, edc] },
{ "row": [str, edr], "column": [stc, edc] },
"restPart"
);
emptyRange.concat(range);
}
else{
emptyRange.push(borderRange[j]);
if(!(str <= bd_r1 && edr >= bd_r2 && stc <= bd_c1 && edc >= bd_c2)){
emptyRange = getMoveRange(type, str, edr, stc, edc, bd_r1, bd_r2, bd_c1, bd_c2, rlen, clen);
}
}
@ -2095,6 +2089,315 @@ function luckysheetDeleteCell(type, str, edr, stc, edc, order) {
}
}
function getMoveRange(type, str, edr, stc, edc, r1, r2, c1, c2, rlen, clen) {
let newRange = [];
if(type == "moveLeft"){
if(str > r2 || edr < r1 || stc > c2){
newRange.push({
"row": [r1, r2],
"column": [c1, c2]
});
}
else if(edc < c1){
if(str <= r1 && edr >= r2){
newRange.push({
"row": [r1, r2],
"column": [c1 - clen, c2 - clen]
});
}
else if(str > r1 && edr < r2){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
{ "row": [str, edr], "column": [c1 - clen, c2 - clen] }
];
newRange = newRange.concat(range);
}
else if(str > r1){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [str, r2], "column": [c1 - clen, c2 - clen] },
];
newRange = newRange.concat(range);
}
else if(edr < r2){
let range= [
{ "row": [r1, edr], "column": [c1 - clen, c2 - clen] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
];
newRange = newRange.concat(range);
}
}
else if(edc >= c1){
if(stc <= c1 && edc >= c2){
if(str > r1 && edr < r2){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
];
newRange = newRange.concat(range);
}
else if(str > r1){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
];
newRange = newRange.concat(range);
}
else if(edr < r2){
let range= [
{ "row": [edr + 1, r2], "column": [c1, c2] },
];
newRange = newRange.concat(range);
}
}
else if(stc > c1 && edc < c2){
if(str <= r1 && edr >= r2){
newRange.push({
"row": [r1, r2],
"column": [c1, c2 - clen]
});
}
else if(str > r1 && edr < r2){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
{ "row": [str, edr], "column": [c1, c2 - clen] }
];
newRange = newRange.concat(range);
}
else if(str > r1){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [str, r2], "column": [c1, c2 - clen] },
];
newRange = newRange.concat(range);
}
else if(edr < r2){
let range= [
{ "row": [r1, edr], "column": [c1, c2 - clen] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
];
newRange = newRange.concat(range);
}
}
else if(stc > c1){
if(str <= r1 && edr >= r2){
newRange.push({
"row": [r1, r2],
"column": [c1, stc - 1]
});
}
else if(str > r1 && edr < r2){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
{ "row": [str, edr], "column": [c1, stc - 1] }
];
newRange = newRange.concat(range);
}
else if(str > r1){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [str, r2], "column": [c1, stc - 1] },
];
newRange = newRange.concat(range);
}
else if(edr < r2){
let range= [
{ "row": [r1, edr], "column": [c1, stc - 1] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
];
newRange = newRange.concat(range);
}
}
else if(edc < c2){
if(str <= r1 && edr >= r2){
newRange.push({
"row": [r1, r2],
"column": [c1 - clen, c2 - clen]
});
}
else if(str > r1 && edr < r2){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
{ "row": [str, edr], "column": [c1 - clen, c2 - clen] }
];
newRange = newRange.concat(range);
}
else if(str > r1){
let range= [
{ "row": [r1, str - 1], "column": [c1, c2] },
{ "row": [str, r2], "column": [c1 - clen, c2 - clen] },
];
newRange = newRange.concat(range);
}
else if(edr < r2){
let range= [
{ "row": [r1, edr], "column": [c1 - clen, c2 - clen] },
{ "row": [edr + 1, r2], "column": [c1, c2] },
];
newRange = newRange.concat(range);
}
}
}
}
else if(type == "moveUp"){
if(stc > c2 || edc < c1 || str > r2){
newRange.push({
"row": [r1, r2],
"column": [c1, c2]
});
}
else if(edr < r1){
if(stc <= c1 && edc >= c2){
newRange.push({
"row": [r1 - rlen, r2 - rlen],
"column": [c1, c2]
});
}
else if(stc > c1 && edc < c2){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
{ "row": [r1 - rlen, r2 - rlen], "column": [stc, edc] }
];
newRange = newRange.concat(range);
}
else if(stc > c1){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1 - rlen, r2 - rlen], "column": [stc, c2] },
];
newRange = newRange.concat(range);
}
else if(edc < c2){
let range= [
{ "row": [r1 - rlen, r2 - rlen], "column": [c1, edc] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
];
newRange = newRange.concat(range);
}
}
else if(edr >= r1){
if(str <= r1 && edr >= r2){
if(stc > c1 && edc < c2){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
];
newRange = newRange.concat(range);
}
else if(stc > c1){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
];
newRange = newRange.concat(range);
}
else if(edc < c2){
let range= [
{ "row": [r1, r2], "column": [edc + 1, c2] },
];
newRange = newRange.concat(range);
}
}
else if(str > r1 && edr < r2){
if(stc <= c1 && edc >= c2){
newRange.push({
"row": [r1, r2 - rlen],
"column": [c1, c2]
});
}
else if(stc > c1 && edc < c2){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
{ "row": [r1, r2 - rlen], "column": [stc, edc] }
];
newRange = newRange.concat(range);
}
else if(stc > c1){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1, r2 - rlen], "column": [stc, c2] },
];
newRange = newRange.concat(range);
}
else if(edc < c2){
let range= [
{ "row": [r1, r2 - rlen], "column": [c1, edc] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
];
newRange = newRange.concat(range);
}
}
else if(str > r1){
if(stc <= c1 && edc >= c2){
newRange.push({
"row": [r1, str - 1],
"column": [c1, c2]
});
}
else if(stc > c1 && edc < c2){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
{ "row": [r1, str - 1], "column": [stc, edc] }
];
newRange = newRange.concat(range);
}
else if(stc > c1){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1, str - 1], "column": [stc, c2] },
];
newRange = newRange.concat(range);
}
else if(edc < c2){
let range= [
{ "row": [r1, str - 1], "column": [c1, edc] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
];
newRange = newRange.concat(range);
}
}
else if(edr < r2){
if(stc <= c1 && edc >= c2){
newRange.push({
"row": [r1 - rlen, r2 - rlen],
"column": [c1, c2]
});
}
else if(stc > c1 && edc < c2){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
{ "row": [r1 - rlen, r2 - rlen], "column": [stc, edc] }
];
newRange = newRange.concat(range);
}
else if(stc > c1){
let range= [
{ "row": [r1, r2], "column": [c1, stc - 1] },
{ "row": [r1 - rlen, r2 - rlen], "column": [stc, c2] },
];
newRange = newRange.concat(range);
}
else if(edc < c2){
let range= [
{ "row": [r1 - rlen, r2 - rlen], "column": [c1, edc] },
{ "row": [r1, r2], "column": [edc + 1, c2] },
];
newRange = newRange.concat(range);
}
}
}
}
return newRange;
}
export {
luckysheetextendtable,
luckysheetextendData,

610
src/global/formula.js

File diff suppressed because it is too large

4
src/global/getdata.js

@ -61,6 +61,10 @@ export function getdatabyselectionD(d, range) {
let dynamicArray_compute = dynamicArrayCompute(Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]["dynamicArray"]);
let data = [];
if(d==null){
return data;
}
for (let r = range["row"][0]; r <= range["row"][1]; r++) {
if(d[r] == null){
continue;

20
src/global/refresh.js

@ -40,7 +40,7 @@ function jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefres
}
formula.execFunctionExist.reverse();
formula.execFunctionGroup(null, null, null, null, data);
formula.execFunctionGroupData = null;
formula.execFunctionGlobalData = null;
}
//关联参数
@ -157,7 +157,7 @@ function jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefres
window.luckysheetCurrentColumn = c1;
window.luckysheetCurrentFunction = Store.flowdata[r1][c1].f;
let fp = $.trim(formula.functionParser(Store.flowdata[r1][c1].f));
let fp = $.trim(formula.functionParserExe(Store.flowdata[r1][c1].f));
let sparklines = eval(fp);
Store.flowdata[r1][c1].spl = sparklines;
}
@ -260,7 +260,7 @@ function jfrefreshgridall(colwidth, rowheight, data, cfg, range, ctrlType, ctrlV
}
formula.execFunctionExist.reverse();
formula.execFunctionGroup(null, null, null, null, data);
formula.execFunctionGroupData = null;
formula.execFunctionGlobalData = null;
redo["type"] = "datachangeAll";
@ -341,7 +341,7 @@ function jfrefreshrange(data, range, cdformat) {
}
formula.execFunctionExist.reverse();
formula.execFunctionGroup(null, null, null, null, data);
formula.execFunctionGroupData = null;
formula.execFunctionGlobalData = null;
if (Store.clearjfundo) {
Store.jfundo = [];
@ -409,12 +409,12 @@ function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf,
//公式链中公式范围改变对应单元格值的改变
let funcData = [];
if(calc.length > 0){
formula.execFunctionGroupData = data;
// formula.execFunctionGroupData = data;
for(let i = 0; i < calc.length; i++){
let clc = calc[i];
let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr = getcellFormula(clc_r, clc_c, clc_i, data);
let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, null, true);
let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);
clc.func = clc_result;
if(data[clc_r][clc_c].f == clc_funcStr){
@ -620,12 +620,12 @@ function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVeri
//公式链中公式范围改变对应单元格值的改变
let funcData = [];
if(calc.length > 0){
formula.execFunctionGroupData = data;
// formula.execFunctionGroupData = data;
for(let i = 0; i < calc.length; i++){
let clc = calc[i];
let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr = getcellFormula(clc_r, clc_c, clc_i, data);
let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, null, true);
let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, clc_i,null, true);
clc.func = clc_result;
if(data[clc_r][clc_c].f == clc_funcStr){
@ -769,7 +769,7 @@ function jfrefreshgrid_pastcut(source, target, RowlChange){
formula.execFunctionExist.reverse();
formula.execFunctionGroup(null, null, null, null, target["curData"]);
formula.execFunctionGroupData = null;
formula.execFunctionGlobalData = null;
if(Store.clearjfundo){
Store.jfundo = [];
@ -922,7 +922,7 @@ function jfrefreshgrid_rhcw(rowheight, colwidth, isRefreshCanvas=true){
window.luckysheetCurrentColumn = c;
window.luckysheetCurrentFunction = Store.flowdata[r][c].f;
let fp = $.trim(formula.functionParser(Store.flowdata[r][c].f));
let fp = $.trim(formula.functionParserExe(Store.flowdata[r][c].f));
let sparklines = eval(fp);
Store.flowdata[r][c].spl = sparklines;

3
src/store/index.js

@ -6,7 +6,8 @@ const Store = {
fullscreenmode: true,
devicePixelRatio: 1,
currentSheetIndex: 0,
currentSheetIndex: 0,
calculateSheetIndex: 0,
flowdata: [],
config: {},

Loading…
Cancel
Save