产品一张表luckysheet前端代码库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1885 lines
58 KiB

import func_methods from '../global/func_methods';
import formula from '../global/formula';
import tooltip from '../global/tooltip';
import { isRealNum, valueIsError,error } from '../global/validate';
import { getdatabyselectionD } from '../global/getdata';
import { genarate } from '../global/format';
import { inverse } from '../function/matrix_methods';
import { getSheetIndex, getluckysheetfile, getRangetxt } from '../methods/get';
import { getObjType, ABCatNum } from '../utils/util';
import Store from '../store';
//函数功能:比较或运算
function luckysheet_compareWith() {
//第一个参数和第三个参数,返回比较结果的布尔值或者运算值
//formula.operatorjson; 存储运算符和比较符
let sp = arguments[1]; //操作符
//参数一
let data_fp = arguments[0];
let fp;
if(getObjType(data_fp) == "object" && data_fp.startCell != null){ //参数是选区
if(sp == "&"){
fp = func_methods.getCellDataDyadicArr(data_fp, "text");
}
else{
fp = func_methods.getCellDataDyadicArr(data_fp, "number");
}
if(fp.length == 1 && fp[0].length == 1){
fp = fp[0][0];
}
}
else{
fp = data_fp;
}
//参数二
let data_tp = arguments[2];
let tp;
if(getObjType(data_tp) == "object" && data_tp.startCell != null){ //参数是选区
if(sp == "&"){
tp = func_methods.getCellDataDyadicArr(data_tp, "text");
}
else{
tp = func_methods.getCellDataDyadicArr(data_tp, "number");
}
if(tp.length == 1 && tp[0].length == 1){
tp = tp[0][0];
}
}
else{
tp = data_tp;
}
if(valueIsError(fp)){
return fp;
}
if(valueIsError(tp)){
return tp;
}
//参数是不规则二维数组 时 return #VALUE! 错误
if(getObjType(fp) == "array" && getObjType(fp[0]) == "array" && !func_methods.isDyadicArr(fp)){
return error.v;
}
if(getObjType(tp) == "array" && getObjType(tp[0]) == "array" && !func_methods.isDyadicArr(tp)){
return error.v;
}
if(sp == "<>"){
sp = "!=";
}
if(sp == "="){
sp = "==";
}
if(fp==null && tp==null){
return "#INVERSE!";
}
else if(fp=="#INVERSE!"){
fp =0;
if(sp=="-"){
sp = "+";
}
else if(sp=="+"){
sp = "-";
}
}
else if(sp == "-" && fp == null){
fp = 0;
}
else if(sp == "/" && (tp == 0 || tp == null)){
return error.d;
}
//计算result
function booleanOperation(a, operator, b){
if(isRealNum(a)){
a = parseFloat(a);
}
if(isRealNum(b)){
b = parseFloat(b);
}
if(operator == "=="){
if(a == b){
return true;
}
else{
return false;
}
}
else if(operator == "!="){
if(a != b){
return true;
}
else{
return false;
}
}
else if(operator == ">="){
if(a >= b){
return true;
}
else{
return false;
}
}
else if(operator == "<="){
if(a <= b){
return true;
}
else{
return false;
}
}
else if(operator == ">"){
if(a > b){
return true;
}
else{
return false;
}
}
else if(operator == "<"){
if(a < b){
return true;
}
else{
return false;
}
}
}
//布尔值对应数字(true = 1, false = 1)
function booleanToNum(v){
if(v == null){
return v;
}
if(v.toString().toLowerCase() == "true"){
return 1;
}
if(v.toString().toLowerCase() == "false"){
return 0;
}
return v;
}
if(sp == "*"){ //乘
if(getObjType(fp) == "array" && getObjType(tp) == "array"){
let result = [];
if(getObjType(fp[0]) == "array" && getObjType(tp[0]) == "array"){
//二维数组相乘(m*n 与 m*n 等于 m*n;m*p 与 p*n 等于 m*n;其它错误)
if(fp.length == tp.length && fp[0].length == tp[0].length){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){
value = parseFloat(fp[m][n]) * parseFloat(tp[m][n]);
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(fp[0].length == tp.length){
let rowlen = fp.length;
let collen = tp[0].length;
for(let m = 0; m < rowlen; m++){
let rowArr = [];
for(let n = 0; n < collen; n++){
let value = 0;
for(let p = 0; p < fp[0].length; p++){
fp[m][p] = booleanToNum(fp[m][p]);
tp[p][n] = booleanToNum(tp[p][n]);
if(isRealNum(fp[m][p]) && isRealNum(tp[p][n])){
value += parseFloat(fp[m][p]) * parseFloat(tp[p][n]);
}
else{
value += error.v;
}
}
if(value.toString() == "NaN"){
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(fp.length == tp[0].length){
let rowlen = tp.length;
let collen = fp[0].length;
for(let m = 0; m < rowlen; m++){
let rowArr = [];
for(let n = 0; n < collen; n++){
let value = 0;
for(let p = 0; p < tp[0].length; p++){
fp[p][n] = booleanToNum(fp[p][n]);
tp[m][p] = booleanToNum(tp[m][p]);
if(isRealNum(tp[m][p]) && isRealNum(fp[p][n])){
value += parseFloat(tp[m][p]) * parseFloat(fp[p][n]);
}
else{
value += error.v;
}
}
if(value.toString() == "NaN"){
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
return error.na;
}
}
else if(getObjType(fp[0]) == "array"){
//二维数组与一维数组相乘(m*n 与 n 等于 m*n;m*1 与 n 等于 m*n;其它错误)
if(fp[0].length == tp.length){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[n])){
value = parseFloat(fp[m][n]) * parseFloat(tp[n]);
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(fp[0].length == 1){
let rowlen = fp.length;
let collen = tp.length;
for(let m = 0; m < rowlen; m++){
let rowArr = [];
for(let n = 0; n < collen; n++){
fp[m][0] = booleanToNum(fp[m][0]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[m][0]) && isRealNum(tp[n])){
value = parseFloat(fp[m][0]) * parseFloat(tp[n]);
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
return error.na;
}
}
else if(getObjType(tp[0]) == "array"){
//二维数组与一维数组相乘(m*n 与 n 等于 m*n;m*1 与 n 等于 m*n;其它错误)
if(tp[0].length == fp.length){
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
fp[n] = booleanToNum(fp[n]);
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[m][n])){
value = parseFloat(fp[n]) * parseFloat(tp[m][n]);
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(tp[0].length == 1){
let rowlen = tp.length;
let collen = fp.length;
for(let m = 0; m < rowlen; m++){
let rowArr = [];
for(let n = 0; n < collen; n++){
fp[n] = booleanToNum(fp[n]);
tp[m][0] = booleanToNum(tp[m][0]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[m][0])){
value = parseFloat(fp[n]) * parseFloat(tp[m][0]);
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
return error.na;
}
}
else{
//一维数组与一维数组相乘时,数组大小不一样是错误
if(fp.length != tp.length){
return error.na;
}
for(let n = 0; n < fp.length; n++){
fp[n] = booleanToNum(fp[n]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[n])){
value = parseFloat(fp[n]) * parseFloat(tp[n]);
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else if(getObjType(fp) == "array"){
tp = booleanToNum(tp);
let result = [];
if(getObjType(fp[0]) == "array"){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp)){
value = parseFloat(fp[m][n]) * parseFloat(tp);
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < fp.length; n++){
fp[n] = booleanToNum(fp[n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp)){
value = parseFloat(fp[n]) * parseFloat(tp);
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else if(getObjType(tp) == "array"){
fp = booleanToNum(fp);
let result = [];
if(getObjType(tp[0]) == "array"){
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp) && isRealNum(tp[m][n])){
value = parseFloat(fp) * parseFloat(tp[m][n]);
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < tp.length; n++){
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp) && isRealNum(tp[n])){
value = parseFloat(fp) * parseFloat(tp[n]);
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else{
fp = booleanToNum(fp);
tp = booleanToNum(tp);
let result;
if(isRealNum(fp) && isRealNum(tp)){
result = parseFloat(fp) * parseFloat(tp);
}
else{
result = error.v;
}
return result;
}
}
else if(sp == "/"){ //除
if(getObjType(fp) == "array" && getObjType(tp) == "array"){
let result = [];
if(getObjType(fp[0]) == "array" && getObjType(tp[0]) == "array"){
//二维数组相除(m*n 与 m*n 等于 m*n;m*p 与 p*n 等于 m*n;其它错误)
if(fp.length == tp.length && fp[0].length == tp[0].length){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){
if(parseFloat(tp[m][n]) == 0){
value = error.d;
}
else{
value = parseFloat(fp[m][n]) / parseFloat(tp[m][n]);
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(fp[0].length == tp.length){
let tp_inverse = inverse(tp);
let rowlen = fp.length;
let collen = tp_inverse[0].length;
for(let m = 0; m < rowlen; m++){
let rowArr = [];
for(let n = 0; n < collen; n++){
let value = 0;
for(let p = 0; p < fp[0].length; p++){
fp[m][p] = booleanToNum(fp[m][p]);
tp_inverse[p][n] = booleanToNum(tp_inverse[p][n]);
if(isRealNum(fp[m][p]) && isRealNum(tp_inverse[p][n])){
value += parseFloat(fp[m][p]) * parseFloat(tp_inverse[p][n]);
}
else{
value += error.v;
}
}
if(value.toString() == "NaN"){
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
return error.na;
}
}
else if(getObjType(fp[0]) == "array"){
//二维数组与一维数组相除(m*n 与 n 等于 m*n;m*1 与 n 等于 m*n;其它错误)
if(fp[0].length == tp.length){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[n])){
if(parseFloat(tp[n]) == 0){
value = error.d;
}
else{
value = parseFloat(fp[m][n]) / parseFloat(tp[n]);
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(fp[0].length == 1){
let rowlen = fp.length;
let collen = tp.length;
for(let m = 0; m < rowlen; m++){
let rowArr = [];
for(let n = 0; n < collen; n++){
fp[m][0] = booleanToNum(fp[m][0]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[m][0]) && isRealNum(tp[n])){
if(parseFloat(tp[n]) == 0){
value = error.d;
}
else{
value = parseFloat(fp[m][0]) / parseFloat(tp[n]);
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
return error.na;
}
}
else if(getObjType(tp[0]) == "array"){
//二维数组与一维数组相除(m*n 与 n 等于 m*n;m*1 与 n 等于 m*n;其它错误)
if(tp[0].length == fp.length){
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
fp[n] = booleanToNum(fp[n]);
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[m][n])){
if(parseFloat(tp[m][n]) == 0){
value = error.d;
}
else{
value = parseFloat(fp[n]) / parseFloat(tp[m][n]);
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(tp[0].length == 1){
let rowlen = tp.length;
let collen = fp.length;
for(let m = 0; m < rowlen; m++){
let rowArr = [];
for(let n = 0; n < collen; n++){
fp[n] = booleanToNum(fp[n]);
tp[m][0] = booleanToNum(tp[m][0]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[m][0])){
if(parseFloat(tp[m][0]) == 0){
value = error.d;
}
else{
value = parseFloat(fp[n]) / parseFloat(tp[m][0]);
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
return error.na;
}
}
else{
//一维数组与一维数组相除时,数组大小不一样是错误
if(fp.length != tp.length){
return error.na;
}
for(let n = 0; n < fp.length; n++){
fp[n] = booleanToNum(fp[n]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[n])){
if(parseFloat(tp[n]) == 0){
value = error.d;
}
else{
value = parseFloat(fp[n]) / parseFloat(tp[n]);
}
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else if(getObjType(fp) == "array"){
tp = booleanToNum(tp);
let result = [];
if(getObjType(fp[0]) == "array"){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp)){
if(parseFloat(tp) == 0){
value = error.d;
}
else{
value = parseFloat(fp[m][n]) / parseFloat(tp);
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < fp.length; n++){
fp[n] = booleanToNum(fp[n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp)){
if(parseFloat(tp) == 0){
value = error.d;
}
else{
value = parseFloat(fp[n]) / parseFloat(tp);
}
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else if(getObjType(tp) == "array"){
fp = booleanToNum(fp);
let result = [];
if(getObjType(tp[0]) == "array"){
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp) && isRealNum(tp[m][n])){
if(parseFloat(tp[m][n]) == 0){
value = error.d;
}
else{
value = parseFloat(fp) / parseFloat(tp[m][n]);
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < tp.length; n++){
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp) && isRealNum(tp[n])){
if(parseFloat(tp[n]) == 0){
value = error.d;
}
else{
value = parseFloat(fp) / parseFloat(tp[n]);
}
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else{
fp = booleanToNum(fp);
tp = booleanToNum(tp);
let result;
if(isRealNum(fp) && isRealNum(tp)){
if(parseFloat(tp) == 0){
result = error.d;
}
else{
result = parseFloat(fp) / parseFloat(tp);
}
}
else{
result = error.v;
}
return result;
}
}
else if(sp == "+" || sp == "-" || sp == "%"){ //加 减 取余
if(getObjType(fp) == "array" && getObjType(tp) == "array"){
let result = [];
if(getObjType(fp[0]) == "array" && getObjType(tp[0]) == "array"){
if(fp.length != tp.length && fp[0].length != tp[0].length){
return error.na;
}
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){
if(sp == "%" && parseFloat(tp[m][n]) == 0){
value = error.d;
}
else{
value = eval(parseFloat(fp[m][n]) + sp + parseFloat(tp[m][n]));
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(getObjType(fp[0]) == "array"){
if(fp[0].length != tp.length){
return error.na;
}
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[n])){
if(sp == "%" && parseFloat(tp[n]) == 0){
value = error.d;
}
else{
value = eval(parseFloat(fp[m][n]) + sp + parseFloat(tp[n]));
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(getObjType(tp[0]) == "array"){
if(tp[0].length != fp.length){
return error.na;
}
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
fp[n] = booleanToNum(fp[n]);
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[m][n])){
if(sp == "%" && parseFloat(tp[m][n]) == 0){
value = error.d;
}
else{
value = eval(parseFloat(fp[n]) + sp + parseFloat(tp[m][n]));
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
if(fp.length != tp.length){
return error.na;
}
for(let n = 0; n < fp.length; n++){
fp[n] = booleanToNum(fp[n]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[n])){
if(sp == "%" && parseFloat(tp[n]) == 0){
value = error.d;
}
else{
value = eval(parseFloat(fp[n]) + sp + "(" + parseFloat(tp[n]) + ")" );
}
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else if(getObjType(fp) == "array"){
tp = booleanToNum(tp);
let result = [];
if(getObjType(fp[0]) == "array"){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp)){
if(sp == "%" && parseFloat(tp) == 0){
value = error.d;
}
else{
value = eval(parseFloat(fp[m][n]) + sp + parseFloat(tp));
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < fp.length; n++){
fp[n] = booleanToNum(fp[n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp)){
if(sp == "%" && parseFloat(tp) == 0){
value = error.d;
}
else{
value = eval(parseFloat(fp[n]) + sp + parseFloat(tp));
}
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else if(getObjType(tp) == "array"){
fp = booleanToNum(fp);
let result = [];
if(getObjType(tp[0]) == "array"){
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp) && isRealNum(tp[m][n])){
if(sp == "%" && parseFloat(tp[m][n]) == 0){
value = error.d;
}
else{
value = eval(parseFloat(fp) + sp + parseFloat(tp[m][n]));
}
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < tp.length; n++){
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp) && isRealNum(tp[n])){
if(sp == "%" && parseFloat(tp[n]) == 0){
value = error.d;
}
else{
value = eval(parseFloat(fp) + sp + parseFloat(tp[n]));
}
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else{
fp = booleanToNum(fp);
tp = booleanToNum(tp);
let result;
if(isRealNum(fp) && isRealNum(tp)){
if(sp == "%" && parseFloat(tp) == 0){
result = error.d;
}
else{
result = eval(parseFloat(fp) + sp + "(" + parseFloat(tp) + ")");
}
}
else{
result = error.v;
}
return result;
}
}
else if(sp == "==" || sp == "!=" || sp == ">=" || sp == "<=" || sp == ">" || sp == "<"){ //比较运算符
if(getObjType(fp) == "array" && getObjType(tp) == "array"){
let result = [];
if(getObjType(fp[0]) == "array" && getObjType(tp[0]) == "array"){
if(fp.length != tp.length && fp[0].length != tp[0].length){
return error.na;
}
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
let value = booleanOperation(fp[m][n], sp, tp[m][n]);
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(getObjType(fp[0]) == "array"){
if(fp[0].length != tp.length){
return error.na;
}
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
let value = booleanOperation(fp[m][n], sp, tp[n]);
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(getObjType(tp[0]) == "array"){
if(tp[0].length != fp.length){
return error.na;
}
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
let value = booleanOperation(fp[n], sp, tp[m][n]);
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
if(fp.length != tp.length){
return error.na;
}
for(let n = 0; n < fp.length; n++){
let value = booleanOperation(fp[n], sp, tp[n]);
result.push(value);
}
}
return result;
}
else if(getObjType(fp) == "array"){
let result = [];
if(getObjType(fp[0]) == "array"){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
let value = booleanOperation(fp[m][n], sp, tp);
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < fp.length; n++){
let value = booleanOperation(fp[n], sp, tp);
result.push(value);
}
}
return result;
}
else if(getObjType(tp) == "array"){
let result = [];
if(getObjType(tp[0]) == "array"){
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
let value = booleanOperation(fp, sp, tp[m][n]);
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < tp.length; n++){
let value = booleanOperation(fp, sp, tp[n]);
result.push(value);
}
}
return result;
}
else{
return booleanOperation(fp, sp, tp);
}
}
else if(sp == "&"){ //连接符
if(getObjType(fp) == "array" && getObjType(tp) == "array"){
let result = [];
if(getObjType(fp[0]) == "array" && getObjType(tp[0]) == "array"){
if(fp.length != tp.length && fp[0].length != tp[0].length){
return error.na;
}
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
rowArr.push(fp[m][n] + "" + tp[m][n]);
}
result.push(rowArr);
}
}
else if(getObjType(fp[0]) == "array"){
if(fp[0].length != tp.length){
return error.na;
}
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
rowArr.push(fp[m][n] + "" + tp[n]);
}
result.push(rowArr);
}
}
else if(getObjType(tp[0]) == "array"){
if(tp[0].length != fp.length){
return error.na;
}
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
rowArr.push(fp[n] + "" + tp[m][n]);
}
result.push(rowArr);
}
}
else{
if(fp.length != tp.length){
return error.na;
}
for(let n = 0; n < fp.length; n++){
result.push(fp[n] + "" + tp[n]);
}
}
return result;
}
else if(getObjType(fp) == "array"){
let result = [];
if(getObjType(fp[0]) == "array"){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
rowArr.push(fp[m][n] + "" + tp);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < fp.length; n++){
result.push(fp[n] + "" + tp);
}
}
return result;
}
else if(getObjType(tp) == "array"){
let result = [];
if(getObjType(tp[0]) == "array"){
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
rowArr.push(fp + "" + tp[m][n]);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < tp.length; n++){
result.push(fp + "" + tp[n]);
}
}
return result;
}
else{
return fp + "" + tp;
}
}
else if(sp == "^"){ //幂
if(getObjType(fp) == "array" && getObjType(tp) == "array"){
let result = [];
if(getObjType(fp[0]) == "array" && getObjType(tp[0]) == "array"){
if(fp.length != tp.length && fp[0].length != tp[0].length){
return error.na;
}
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[m][n])){
value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp[m][n]));
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(getObjType(fp[0]) == "array"){
if(fp[0].length != tp.length){
return error.na;
}
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp[n])){
value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp[n]));
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else if(getObjType(tp[0]) == "array"){
if(tp[0].length != fp.length){
return error.na;
}
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
fp[n] = booleanToNum(fp[n]);
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[m][n])){
value = Math.pow(parseFloat(fp[n]), parseFloat(tp[m][n]));
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
if(fp.length != tp.length){
return error.na;
}
for(let n = 0; n < fp.length; n++){
fp[n] = booleanToNum(fp[n]);
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp[n])){
value = Math.pow(parseFloat(fp[n]), parseFloat(tp[n]));
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else if(getObjType(fp) == "array"){
tp = booleanToNum(tp);
let result = [];
if(getObjType(fp[0]) == "array"){
for(let m = 0; m < fp.length; m++){
let rowArr = [];
for(let n = 0; n < fp[m].length; n++){
fp[m][n] = booleanToNum(fp[m][n]);
let value;
if(isRealNum(fp[m][n]) && isRealNum(tp)){
value = Math.pow(parseFloat(fp[m][n]), parseFloat(tp));
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < fp.length; n++){
fp[n] = booleanToNum(fp[n]);
let value;
if(isRealNum(fp[n]) && isRealNum(tp)){
value = Math.pow(parseFloat(fp[n]), parseFloat(tp));
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else if(getObjType(tp) == "array"){
fp = booleanToNum(fp);
let result = [];
if(getObjType(tp[0]) == "array"){
for(let m = 0; m < tp.length; m++){
let rowArr = [];
for(let n = 0; n < tp[m].length; n++){
tp[m][n] = booleanToNum(tp[m][n]);
let value;
if(isRealNum(fp) && isRealNum(tp[m][n])){
value = Math.pow(parseFloat(fp), parseFloat(tp[m][n]));
}
else{
value = error.v;
}
rowArr.push(value);
}
result.push(rowArr);
}
}
else{
for(let n = 0; n < tp.length; n++){
tp[n] = booleanToNum(tp[n]);
let value;
if(isRealNum(fp) && isRealNum(tp[n])){
value = Math.pow(parseFloat(fp), parseFloat(tp[n]));
}
else{
value = error.v;
}
result.push(value);
}
}
return result;
}
else{
fp = booleanToNum(fp);
tp = booleanToNum(tp);
let result;
if(isRealNum(fp) && isRealNum(tp)){
result = Math.pow(parseFloat(fp), parseFloat(tp));
}
else{
result = error.v;
}
return result;
}
}
}
//解析 公式中{1,2,3;2,3,4} 为数组[[1,2,3],[2,3,4]]
function luckysheet_getarraydata() {
let fp = arguments[0];
fp = fp.replace("{", "").replace("}", "").replace(/\"/g, '');
let arr = [];
if(fp.indexOf(";") > -1){
arr = fp.split(";");
for(let i = 0; i < arr.length; i++){
arr[i] = arr[i].split(",");
}
}
else{
arr = fp.split(",");
}
return arr;
}
function luckysheet_getcelldata(txt) {
if (window.luckysheet_getcelldata_cache == null) {
window.luckysheet_getcelldata_cache = {};
}
if (txt in window.luckysheet_getcelldata_cache) {
return window.luckysheet_getcelldata_cache[txt];
}
let luckysheetfile = getluckysheetfile();
let val = txt.split("!");
let sheettxt = "",
rangetxt = "",
sheetIndex = -1,
sheetdata = null;
if (val.length > 1) {
sheettxt = val[0];
rangetxt = val[1];
for (let i in luckysheetfile) {
if (sheettxt == luckysheetfile[i].name) {
sheetIndex = luckysheetfile[i].index;
sheetdata = luckysheetfile[i].data;
break;
}
}
if (sheetIndex == -1) {
sheetIndex = 0;
}
}
else {
let index = getSheetIndex(Store.currentSheetIndex);
sheettxt = luckysheetfile[index].name;
sheetIndex = luckysheetfile[index].index;
sheetdata = Store.flowdata;
rangetxt = val[0];
if (formula.execFunctionGroupData != null) {
sheetdata = formula.execFunctionGroupData;
}
}
if (rangetxt.indexOf(":") == -1) {
let row = parseInt(rangetxt.replace(/[^0-9]/g, "")) - 1;
let col = ABCatNum(rangetxt.replace(/[^A-Za-z]/g, ""));
if (!isNaN(row) && !isNaN(col)) {
let ret = getdatabyselectionD(sheetdata, {
"row": [row, row],
"column": [col, col]
})[0][0];
//范围的长宽
let rowl = 1;
let coll = 1;
let retAll= {
"sheetName": sheettxt,
"startCell": rangetxt,
"rowl": rowl,
"coll": coll,
"data": ret
};
window.luckysheet_getcelldata_cache[txt] = retAll;
return retAll;
}
else {
return [];
}
}
else {
rangetxt = rangetxt.split(":");
let row = [], col = [];
row[0] = parseInt(rangetxt[0].replace(/[^0-9]/g, "")) - 1;
row[1] = parseInt(rangetxt[1].replace(/[^0-9]/g, "")) - 1;
if (isNaN(row[0])) {
row[0] = 0;
}
if (isNaN(row[1])) {
row[1] = sheetdata.length - 1;
}
if (row[0] > row[1]) {
tooltip.info("选择失败", "输入范围错误!");
return [];
}
col[0] = ABCatNum(rangetxt[0].replace(/[^A-Za-z]/g, ""));
col[1] = ABCatNum(rangetxt[1].replace(/[^A-Za-z]/g, ""));
if (isNaN(col[0])) {
col[0] = 0;
}
if (isNaN(col[1])) {
col[1] = sheetdata[0].length - 1;
}
if (col[0] > col[1]) {
tooltip.info("选择失败", "输入范围错误!");
return [];
}
let ret = getdatabyselectionD(sheetdata, {
"row": row,
"column": col
});
//范围的长宽
let rowl = row[1] - row[0] + 1;
let coll = col[1] - col[0] + 1;
let retAll= {
"sheetName": sheettxt,
"startCell": rangetxt[0],
"rowl": rowl,
"coll": coll,
"data": ret
};
window.luckysheet_getcelldata_cache[txt] = retAll;
return retAll;
}
}
//解析单个取得的值,有字符串,数字,引用单元格或者函数
function luckysheet_parseData(value) {
if(typeof value === "object" ){
if(value == null){
return "";
}
else if(Array.isArray(value)){ //函数返回的带期望格式的数组,可提取格式
let v = genarate(value[0]);
return v[2];
}
else{ //getcelldat引用单元格对象,带有格式
if(Array.isArray(value.data)){ //单元格区域
return error.v;
}
else{ //单个单元格
if(value.data.v === undefined){
return "";
}
else{
return value.data.v;
}
}
}
}
else if(!formula.isCompareOperator(value).flag){
let v = genarate(value);
return v[2];
}
else if(typeof value === "string" || typeof value === "number"){
return value;
}
return error.v;
}
function luckysheet_getValue() {
//解析获取函数参数,无格式,且可包含带操作符的">5"
//数据类型:1.手动输入或函数返回的字符串,普通字符串或数字直接取值,特殊格式需转化 如:"2019-1-1"(特殊格式转化为数字)、">5"或数字
//2.引用单元格对象,取得二维数组或单个的v 如:A1
//3.函数返回的带期望格式的数组,取得第一个参数,转化为数字 如:["2019-1-1",true]
let args = arguments[0];
for(let i = 0; i < args.length; i++){
let value = args[i];
if(typeof value === "object" ){
if(value == null){
value = "";
}
else if(Array.isArray(value)){ //函数返回的带期望格式的数组,可提取格式
let v = genarate(value[0]);
value = v[2];
}
else{ //getcelldat引用单元格对象,带有格式
if(Array.isArray(value.data)){ //单元格区域
value = value.data;
}
else{ //单个单元格
if(value.data.v === undefined){ //空白单元格
value = "";
}
else{
value = value.data.v;
}
}
}
}
else if(!formula.isCompareOperator(value).flag){
let v = genarate(value);
value = v[2];
}
args[i] = value;
}
}
function luckysheet_indirect_check() {
let cellTxt = arguments[0];
if (cellTxt == null || cellTxt.length == 0) {
return null;
}
return cellTxt;
}
function luckysheet_indirect_check_return(txt) {
return txt;
}
function luckysheet_offset_check() {
if (!(getObjType(arguments[0]) == "object" && arguments[0].startCell != null)) {
return formula.error.v;
}
var reference = arguments[0].startCell;
//要偏移的行数
var rows = func_methods.getFirstValue(arguments[1]);
if (valueIsError(rows)) {
return rows;
}
if (!isRealNum(rows)) {
return formula.error.v;
}
rows = parseInt(rows);
//要偏移的列数
var cols = func_methods.getFirstValue(arguments[2]);
if (valueIsError(cols)) {
return cols;
}
if (!isRealNum(cols)) {
return formula.error.v;
}
cols = parseInt(cols);
//要从偏移目标开始返回的范围的高度
var height = arguments[0].rowl;
if (arguments.length >= 4) {
height = func_methods.getFirstValue(arguments[3]);
if (valueIsError(height)) {
return height;
}
if (!isRealNum(height)) {
return formula.error.v;
}
height = parseInt(height);
}
//要从偏移目标开始返回的范围的宽度
var width = arguments[0].coll;
if (arguments.length == 5) {
width = func_methods.getFirstValue(arguments[4]);
if (valueIsError(width)) {
return width;
}
if (!isRealNum(width)) {
return formula.error.v;
}
width = parseInt(width);
}
if (height < 1 || width < 1) {
return formula.error.r;
}
//计算
var cellrange = formula.getcellrange(reference);
var cellRow0 = cellrange["row"][0];
var cellCol0 = cellrange["column"][0];
cellRow0 += rows;
cellCol0 += cols;
var cellRow1 = cellRow0 + height - 1;
var cellCol1 = cellCol0 + width - 1;
if (cellRow0 < 0 || cellRow1 >= Store.flowdata.length || cellCol0 < 0 || cellCol1 >= Store.flowdata[0].length) {
return formula.error.r;
}
return getRangetxt(Store.currentSheetIndex, {
row: [cellRow0, cellRow1],
column: [cellCol0, cellCol1]
});
}
export {
luckysheet_compareWith,
luckysheet_getarraydata,
luckysheet_getcelldata,
luckysheet_parseData,
luckysheet_getValue,
luckysheet_indirect_check,
luckysheet_indirect_check_return,
luckysheet_offset_check
}