Browse Source

feat(optimization function): setCellvalue support any cell param

master
wbfsa 5 years ago
parent
commit
9b208e4e2e
  1. 67
      src/controllers/menuButton.js
  2. 79
      src/global/api.js
  3. 86
      src/global/formula.js
  4. 25
      src/global/refresh.js
  5. 4
      src/global/setdata.js

67
src/controllers/menuButton.js

@ -2871,38 +2871,10 @@ const menuButton = {
return [style, color];
},
updateFormat: function(d, attr, foucsStatus){
let _this = this;
if(Store.allowEdit===false){
updateFormatCell:function(d, attr, foucsStatus,row_st, row_ed, col_st, col_ed){
if(d==null || attr==null){
return;
}
let canvasElement = document.createElement('canvas');
let canvas = canvasElement.getContext("2d");
if(attr in inlineStyleAffectAttribute ){
if (parseInt($("#luckysheet-input-box").css("top")) > 0 ) {
let value = $("#luckysheet-input-box").text();
if(value.substr(0,1)!="="){
let cell = d[Store.luckysheetCellUpdate[0]][Store.luckysheetCellUpdate[1]];
updateInlineStringFormat(cell, attr, foucsStatus, luckysheetformula.rangeResizeTo);
// return;
}
}
}
let cfg = $.extend(true, {}, Store.config);
if(cfg["rowlen"] == null){
cfg["rowlen"] = {};
}
for(let s = 0; s < Store.luckysheet_select_save.length; s++){
let row_st = Store.luckysheet_select_save[s]["row"][0],
row_ed = Store.luckysheet_select_save[s]["row"][1];
let col_st = Store.luckysheet_select_save[s]["column"][0],
col_ed = Store.luckysheet_select_save[s]["column"][1];
if(attr == "ct"){
for (let r = row_st; r <= row_ed; r++) {
if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
@ -3034,6 +3006,41 @@ const menuButton = {
}
}
},
updateFormat: function(d, attr, foucsStatus){
let _this = this;
if(Store.allowEdit===false){
return;
}
let canvasElement = document.createElement('canvas');
let canvas = canvasElement.getContext("2d");
if(attr in inlineStyleAffectAttribute ){
if (parseInt($("#luckysheet-input-box").css("top")) > 0 ) {
let value = $("#luckysheet-input-box").text();
if(value.substr(0,1)!="="){
let cell = d[Store.luckysheetCellUpdate[0]][Store.luckysheetCellUpdate[1]];
updateInlineStringFormat(cell, attr, foucsStatus, luckysheetformula.rangeResizeTo);
// return;
}
}
}
let cfg = $.extend(true, {}, Store.config);
if(cfg["rowlen"] == null){
cfg["rowlen"] = {};
}
for(let s = 0; s < Store.luckysheet_select_save.length; s++){
let row_st = Store.luckysheet_select_save[s]["row"][0],
row_ed = Store.luckysheet_select_save[s]["row"][1];
let col_st = Store.luckysheet_select_save[s]["column"][0],
col_ed = Store.luckysheet_select_save[s]["column"][1];
this.updateFormatCell(d, attr, foucsStatus, row_st, row_ed, col_st, col_ed);
if(attr == "tb" || attr == "tr" || attr == "fs"){
cfg = rowlenByRange(d, row_st, row_ed, cfg);
}

79
src/global/api.js

@ -11,7 +11,7 @@ import editor from "./editor";
import luckysheetformula from './formula';
import cleargridelement from './cleargridelement';
import { genarate, update } from './format';
import { setAccuracy } from "./setdata";
import { setAccuracy,setcellvalue } from "./setdata";
import { orderbydata } from "./sort";
import { rowlenByRange } from "./getRowlen";
import { getdatabyselection, getcellvalue } from "./getdata";
@ -98,16 +98,89 @@ export function setCellValue(row, column, value, options = {}) {
}
let curSheetOrder = getSheetIndex(Store.currentSheetIndex);
let {
index = Store.currentSheetIndex,
order = curSheetOrder,
isRefresh = true,
success
} = {...options}
let luckysheetfile = getluckysheetfile();
let arrayIndex = getSheetIndex(index);
let data = luckysheetfile[arrayIndex].data;
// luckysheetformula.updatecell(row, column, value);
let formatList = {
//ct:1, //celltype,Cell value format: text, time, etc.
bg: 1,//background,#fff000
ff: 1,//fontfamily,
fc: 1,//fontcolor
bl: 1,//Bold
it: 1,//italic
fs: 1,//font size
cl: 1,//Cancelline, 0 Regular, 1 Cancelline
un: 1,//underline, 0 Regular, 1 underlines, fonts
vt: 1,//Vertical alignment, 0 middle, 1 up, 2 down
ht: 1,//Horizontal alignment,0 center, 1 left, 2 right
mc: 1, //Merge Cells
tr: 1, //Text rotation,0: 0、1: 45 、2: -45、3 Vertical text、4: 90 、5: -90
tb: 1, //Text wrap,0 truncation, 1 overflow, 2 word wrap
//v: 1, //Original value
//m: 1, //Display value
rt:1, //text rotation angle 0-180 alignment
//f: 1, //formula
qp:1 //quotePrefix, show number as string
}
if(value instanceof Object){
let curv = {};
if(value.f!=null && value.v==null){
curv.f = value.f;
if(value.ct!=null){
curv.ct = value.ct;
}
data = luckysheetformula.updatecell(row, column, curv, false).data;//update formula value
}
else{
if(value.ct!=null){
curv.ct = value.ct;
}
if(value.f!=null){
curv.f = value.f;
}
if(value.v!=null){
curv.v = value.v;
}
if(value.m!=null){
curv.m = value.m;
}
setcellvalue(row, column, data, curv);//update text value
}
for(let attr in value){
let v = value[attr];
if(attr in formatList){
menuButton.updateFormatCell(data, attr, v, row, row, column, column);//change range format
}
}
}
else{
if(value.substr(0,1)=="=" || value.substr(0,5)=="<span"){
data = luckysheetformula.updatecell(row, column, value, false).data;//update formula value or convert inline string html to object
}
else{
setcellvalue(row, column, data, value);
}
}
luckysheetformula.updatecell(row, column, value);
if(isRefresh){
jfrefreshgrid(data, [{ "row": [row, row], "column": [column, column] }]);//update data, meanwhile refresh canvas and store data to history
}
else{
luckysheetfile[arrayIndex] = data;//only update data
}
if (success && typeof success === 'function') {
success();
success(data);
}
}

86
src/global/formula.js

@ -1212,7 +1212,7 @@ const luckysheetformula = {
"opacity": "0.13"
});
},
updatecell: function(r, c, value) {
updatecell: function(r, c, value, isRefresh=true) {
let _this = this;
let $input = $("#luckysheet-rich-text-editor");
@ -1361,39 +1361,42 @@ const luckysheetformula = {
}
}
// from API setCellValue,luckysheet.setCellValue(0, 0, {f: "=sum(D1)", bg:"#0188fb"}),value is an object, so get attribute f as value
else if(getObjType(value) == "object"){
let valueFunction = value.f;
if(getObjType(valueFunction) == "string" && valueFunction.slice(0, 1) == "=" && valueFunction.length > 1){
let v = _this.execfunction(valueFunction, r, c, undefined, true);
isRunExecFunction = false;
// get v/m/ct
curv = d[r][c];
curv.v = v[1];
// get f
curv.f = v[2];
// get other cell style attribute
delete value.v;
delete value.m;
delete value.f;
Object.assign(curv,value);
//打进单元格的sparklines的配置串, 报错需要单独处理。
if(v.length == 4 && v[3].type == "sparklines"){
delete curv.m;
delete curv.v;
let curCalv = v[3].data;
if(getObjType(curCalv) == "array" && getObjType(curCalv[0]) != "object"){
curv.v = curCalv[0];
}
else{
curv.spl = v[3].data;
}
}
}
else {
for(let attr in value){
curv[attr] = value[attr];
}
// let valueFunction = value.f;
// if(getObjType(valueFunction) == "string" && valueFunction.slice(0, 1) == "=" && valueFunction.length > 1){
// let v = _this.execfunction(valueFunction, r, c, undefined, true);
// isRunExecFunction = false;
// // get v/m/ct
// curv = d[r][c];
// curv.v = v[1];
// // get f
// curv.f = v[2];
// // get other cell style attribute
// delete value.v;
// delete value.m;
// delete value.f;
// Object.assign(curv,value);
// //打进单元格的sparklines的配置串, 报错需要单独处理。
// if(v.length == 4 && v[3].type == "sparklines"){
// delete curv.m;
// delete curv.v;
// let curCalv = v[3].data;
// if(getObjType(curCalv) == "array" && getObjType(curCalv[0]) != "object"){
// curv.v = curCalv[0];
// }
// else{
// curv.spl = v[3].data;
// }
// }
// }
}
@ -1480,6 +1483,12 @@ const luckysheetformula = {
dynamicArrayItem = v[3].data;
}
}
else{
let v = curv;
if(value.v==null){
value.v = v;
}
}
}
else{
@ -1578,10 +1587,17 @@ const luckysheetformula = {
}
}
if(isRefresh){
jfrefreshgrid(d, [{ "row": [r, r], "column": [c, c] }], allParam, isRunExecFunction);
// Store.luckysheetCellUpdate.length = 0; //clear array
_this.execFunctionGlobalData = null; //销毁
}
else{
return {
data:d,
allParam:allParam
};
}
},
cancelNormalSelected: function() {
let _this = this;

25
src/global/refresh.js

@ -19,6 +19,7 @@ import { createFilterOptions } from '../controllers/filter';
import { getSheetIndex } from '../methods/get';
import Store from '../store';
let refreshCanvasTimeOut = null;
function runExecFunction(range, index, data){
formula.execFunctionExist = [];
@ -43,6 +44,8 @@ function jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefres
range = Store.luckysheet_select_save;
}
clearTimeout(refreshCanvasTimeOut);
//关联参数
@ -178,7 +181,7 @@ function jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefres
}
//刷新表格
if(isRefreshCanvas){
setTimeout(function () {
refreshCanvasTimeOut = setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
@ -188,7 +191,7 @@ function jfrefreshgrid(data, range, allParam, isRunExecFunction = true, isRefres
function jfrefreshgridall(colwidth, rowheight, data, cfg, range, ctrlType, ctrlValue, cdformat, isRefreshCanvas=true) {
let redo = {}, isRunExecFunction=false;
clearTimeout(refreshCanvasTimeOut);
if (ctrlType == "cellRowChange") {
redo["type"] = "cellRowChange";
redo["config"] = $.extend(true, {}, Store.config);
@ -318,7 +321,7 @@ function jfrefreshgridall(colwidth, rowheight, data, cfg, range, ctrlType, ctrlV
jfrefreshgrid_rhcw(rowheight, colwidth);
if(isRefreshCanvas){
setTimeout(function () {
refreshCanvasTimeOut = setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
@ -330,7 +333,7 @@ function jfrefreshgridall(colwidth, rowheight, data, cfg, range, ctrlType, ctrlV
}
function jfrefreshrange(data, range, cdformat) {
clearTimeout(refreshCanvasTimeOut);
if (Store.clearjfundo) {
Store.jfundo = [];
@ -361,7 +364,7 @@ function jfrefreshrange(data, range, cdformat) {
runExecFunction(range, Store.currentSheetIndex, data);
//刷新表格
setTimeout(function () {
refreshCanvasTimeOut = setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
@ -571,7 +574,7 @@ function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf,
//删除单元格 刷新表格
function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVerification){
let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];
clearTimeout(refreshCanvasTimeOut);
//merge改变对应的单元格值改变
let mcData = [];
if(JSON.stringify(cfg["merge"]) == "{}"){
@ -726,7 +729,7 @@ function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf, dataVeri
file.dataVerification = dataVerification;
server.saveParam("all", Store.currentSheetIndex, file.dataVerification, { "k": "dataVerification" });
setTimeout(function () {
refreshCanvasTimeOut = setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}
@ -736,7 +739,7 @@ function jfrefreshgrid_pastcut(source, target, RowlChange){
//单元格数据更新联动
let execF_rc = {};
formula.execFunctionExist = [];
clearTimeout(refreshCanvasTimeOut);
for(let r = source["range"].row[0]; r <= source["range"].row[1]; r++){
for(let c = source["range"].column[0]; c <= source["range"].column[1]; c++){
if((r + "_" + c + "_" + source["sheetIndex"]) in execF_rc){
@ -863,7 +866,7 @@ function jfrefreshgrid_pastcut(source, target, RowlChange){
formula.execFunctionGroup(null, null, null, null, target["curData"]);
formula.execFunctionGlobalData = null;
setTimeout(function () {
refreshCanvasTimeOut = setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
@ -894,7 +897,7 @@ function jfrefreshgrid_pastcut(source, target, RowlChange){
//行高、列宽改变 刷新表格
function jfrefreshgrid_rhcw(rowheight, colwidth, isRefreshCanvas=true){
rhchInit(rowheight, colwidth);
clearTimeout(refreshCanvasTimeOut);
sheetmanage.storeSheetParam();
//行高列宽改变时 重新计算sparklines
@ -1046,7 +1049,7 @@ function jfrefreshgrid_rhcw(rowheight, colwidth, isRefreshCanvas=true){
sheetmanage.showSheet();
if(isRefreshCanvas){
setTimeout(function () {
refreshCanvasTimeOut = setTimeout(function () {
luckysheetrefreshgrid();
}, 1);
}

4
src/global/setdata.js

@ -26,6 +26,10 @@ function setcellvalue(r, c, d, v) {
if(v.spl != null){
cell.spl = v.spl;
}
if(v.ct != null){
cell.ct = v.ct;
}
}

Loading…
Cancel
Save