Browse Source

feat(optimization function): setCellvalue support any cell param

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

267
src/controllers/menuButton.js

@ -2871,6 +2871,142 @@ const menuButton = {
return [style, color]; return [style, color];
}, },
updateFormatCell:function(d, attr, foucsStatus,row_st, row_ed, col_st, col_ed){
if(d==null || attr==null){
return;
}
if(attr == "ct"){
for (let r = row_st; r <= row_ed; r++) {
if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
continue;
}
for (let c = col_st; c <= col_ed; c++) {
let cell = d[r][c], value = null;
if (getObjType(cell) == "object") {
value = d[r][c]["v"];
}
else{
value = d[r][c];
}
if(foucsStatus != "@" && isRealNum(value)){
value = parseFloat(value);
}
let mask = update(foucsStatus, value);
let type = "n";
if(is_date(foucsStatus) || foucsStatus === 14 || foucsStatus === 15 || foucsStatus === 16 || foucsStatus === 17 || foucsStatus === 18 || foucsStatus === 19 || foucsStatus === 20 || foucsStatus === 21 || foucsStatus === 22 || foucsStatus === 45 || foucsStatus === 46 || foucsStatus === 47){
type = "d";
}
else if(foucsStatus == "@" || foucsStatus === 49){
type = "s"
}
else if(foucsStatus == "General" || foucsStatus === 0){
type = "g";
}
if (getObjType(cell) == "object") {
d[r][c]["m"] = mask;
if(d[r][c]["ct"] == null){
d[r][c]["ct"] = {};
}
d[r][c]["ct"]["fa"] = foucsStatus;
d[r][c]["ct"]["t"] = type;
}
else{
d[r][c] = { "ct":{"fa":foucsStatus, "t":type}, "v": value, "m": mask };
}
}
}
}
else{
if(attr == "ht"){
if(foucsStatus == "left"){
foucsStatus = "1";
}
else if(foucsStatus == "center"){
foucsStatus = "0";
}
else if(foucsStatus == "right"){
foucsStatus = "2";
}
}
else if(attr == "vt"){
if(foucsStatus == "top"){
foucsStatus = "1";
}
else if(foucsStatus == "middle"){
foucsStatus = "0";
}
else if(foucsStatus == "bottom"){
foucsStatus = "2";
}
}
else if(attr == "tb"){
if(foucsStatus == "overflow"){
foucsStatus = "1";
}
else if(foucsStatus == "clip"){
foucsStatus = "0";
}
else if(foucsStatus == "wrap"){
foucsStatus = "2";
}
}
else if(attr == "tr"){
if(foucsStatus == "none"){
foucsStatus = "0";
}
else if(foucsStatus == "angleup"){
foucsStatus = "1";
}
else if(foucsStatus == "angledown"){
foucsStatus = "2";
}
else if(foucsStatus == "vertical"){
foucsStatus = "3";
}
else if(foucsStatus == "rotation-up"){
foucsStatus = "4";
}
else if(foucsStatus == "rotation-down"){
foucsStatus = "5";
}
}
for (let r = row_st; r <= row_ed; r++) {
if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
continue;
}
for (let c = col_st; c <= col_ed; c++) {
let value = d[r][c];
if (getObjType(value) == "object") {
// if(attr in inlineStyleAffectAttribute && isInlineStringCell(value)){
updateInlineStringFormatOutside(value, attr, foucsStatus);
// }
// else{
d[r][c][attr] = foucsStatus;
// }
}
else{
d[r][c] = { v: value };
d[r][c][attr] = foucsStatus;
}
// if(attr == "tr" && d[r][c].tb != null){
// d[r][c].tb = "0";
// }
}
}
}
},
updateFormat: function(d, attr, foucsStatus){ updateFormat: function(d, attr, foucsStatus){
let _this = this; let _this = this;
@ -2903,136 +3039,7 @@ const menuButton = {
let col_st = Store.luckysheet_select_save[s]["column"][0], let col_st = Store.luckysheet_select_save[s]["column"][0],
col_ed = Store.luckysheet_select_save[s]["column"][1]; col_ed = Store.luckysheet_select_save[s]["column"][1];
if(attr == "ct"){ this.updateFormatCell(d, attr, foucsStatus, row_st, row_ed, col_st, col_ed);
for (let r = row_st; r <= row_ed; r++) {
if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
continue;
}
for (let c = col_st; c <= col_ed; c++) {
let cell = d[r][c], value = null;
if (getObjType(cell) == "object") {
value = d[r][c]["v"];
}
else{
value = d[r][c];
}
if(foucsStatus != "@" && isRealNum(value)){
value = parseFloat(value);
}
let mask = update(foucsStatus, value);
let type = "n";
if(is_date(foucsStatus) || foucsStatus === 14 || foucsStatus === 15 || foucsStatus === 16 || foucsStatus === 17 || foucsStatus === 18 || foucsStatus === 19 || foucsStatus === 20 || foucsStatus === 21 || foucsStatus === 22 || foucsStatus === 45 || foucsStatus === 46 || foucsStatus === 47){
type = "d";
}
else if(foucsStatus == "@" || foucsStatus === 49){
type = "s"
}
else if(foucsStatus == "General" || foucsStatus === 0){
type = "g";
}
if (getObjType(cell) == "object") {
d[r][c]["m"] = mask;
if(d[r][c]["ct"] == null){
d[r][c]["ct"] = {};
}
d[r][c]["ct"]["fa"] = foucsStatus;
d[r][c]["ct"]["t"] = type;
}
else{
d[r][c] = { "ct":{"fa":foucsStatus, "t":type}, "v": value, "m": mask };
}
}
}
}
else{
if(attr == "ht"){
if(foucsStatus == "left"){
foucsStatus = "1";
}
else if(foucsStatus == "center"){
foucsStatus = "0";
}
else if(foucsStatus == "right"){
foucsStatus = "2";
}
}
else if(attr == "vt"){
if(foucsStatus == "top"){
foucsStatus = "1";
}
else if(foucsStatus == "middle"){
foucsStatus = "0";
}
else if(foucsStatus == "bottom"){
foucsStatus = "2";
}
}
else if(attr == "tb"){
if(foucsStatus == "overflow"){
foucsStatus = "1";
}
else if(foucsStatus == "clip"){
foucsStatus = "0";
}
else if(foucsStatus == "wrap"){
foucsStatus = "2";
}
}
else if(attr == "tr"){
if(foucsStatus == "none"){
foucsStatus = "0";
}
else if(foucsStatus == "angleup"){
foucsStatus = "1";
}
else if(foucsStatus == "angledown"){
foucsStatus = "2";
}
else if(foucsStatus == "vertical"){
foucsStatus = "3";
}
else if(foucsStatus == "rotation-up"){
foucsStatus = "4";
}
else if(foucsStatus == "rotation-down"){
foucsStatus = "5";
}
}
for (let r = row_st; r <= row_ed; r++) {
if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
continue;
}
for (let c = col_st; c <= col_ed; c++) {
let value = d[r][c];
if (getObjType(value) == "object") {
// if(attr in inlineStyleAffectAttribute && isInlineStringCell(value)){
updateInlineStringFormatOutside(value, attr, foucsStatus);
// }
// else{
d[r][c][attr] = foucsStatus;
// }
}
else{
d[r][c] = { v: value };
d[r][c][attr] = foucsStatus;
}
// if(attr == "tr" && d[r][c].tb != null){
// d[r][c].tb = "0";
// }
}
}
}
if(attr == "tb" || attr == "tr" || attr == "fs"){ if(attr == "tb" || attr == "tr" || attr == "fs"){
cfg = rowlenByRange(d, row_st, row_ed, cfg); 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 luckysheetformula from './formula';
import cleargridelement from './cleargridelement'; import cleargridelement from './cleargridelement';
import { genarate, update } from './format'; import { genarate, update } from './format';
import { setAccuracy } from "./setdata"; import { setAccuracy,setcellvalue } from "./setdata";
import { orderbydata } from "./sort"; import { orderbydata } from "./sort";
import { rowlenByRange } from "./getRowlen"; import { rowlenByRange } from "./getRowlen";
import { getdatabyselection, getcellvalue } from "./getdata"; import { getdatabyselection, getcellvalue } from "./getdata";
@ -98,16 +98,89 @@ export function setCellValue(row, column, value, options = {}) {
} }
let curSheetOrder = getSheetIndex(Store.currentSheetIndex); let curSheetOrder = getSheetIndex(Store.currentSheetIndex);
let { let {
index = Store.currentSheetIndex,
order = curSheetOrder, order = curSheetOrder,
isRefresh = true,
success success
} = {...options} } = {...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') { if (success && typeof success === 'function') {
success(); success(data);
} }
} }

90
src/global/formula.js

@ -1212,7 +1212,7 @@ const luckysheetformula = {
"opacity": "0.13" "opacity": "0.13"
}); });
}, },
updatecell: function(r, c, value) { updatecell: function(r, c, value, isRefresh=true) {
let _this = this; let _this = this;
let $input = $("#luckysheet-rich-text-editor"); 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 // 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"){ else {
let valueFunction = value.f; for(let attr in value){
curv[attr] = value[attr];
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;
}
}
} }
// 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; dynamicArrayItem = v[3].data;
} }
} }
else{
let v = curv;
if(value.v==null){
value.v = v;
}
}
} }
else{ else{
@ -1578,10 +1587,17 @@ const luckysheetformula = {
} }
} }
jfrefreshgrid(d, [{ "row": [r, r], "column": [c, c] }], allParam, isRunExecFunction); if(isRefresh){
jfrefreshgrid(d, [{ "row": [r, r], "column": [c, c] }], allParam, isRunExecFunction);
// Store.luckysheetCellUpdate.length = 0; //clear array // Store.luckysheetCellUpdate.length = 0; //clear array
_this.execFunctionGlobalData = null; //销毁 _this.execFunctionGlobalData = null; //销毁
}
else{
return {
data:d,
allParam:allParam
};
}
}, },
cancelNormalSelected: function() { cancelNormalSelected: function() {
let _this = this; let _this = this;

25
src/global/refresh.js

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

4
src/global/setdata.js

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

Loading…
Cancel
Save