常见的函数--帆软(4)

函数

 

1、描述
FineBI使用过程中,在自助数据集、仪表板驾驶舱中均存在添加公式/函数,FineBI支持多种函数,包括数值、文本、时间、数组等。
          FineBI版本         
          jar包版本        
  5.1
  2019.1.7
2、自助数据集函数
在创建自助数据集进行数据加工时,在新增列、过滤等操作中,可添加公式进行数据处理,在添加公式的时候FineBI提供了添加函数到公式的功能。支持的函数下图所示,包括常用函数数学和三角函数文本函数日期函数逻辑函数其他函数

 

 

 
3、计算指标函数
在驾驶舱编辑仪表板添加计算指标的时候,同样可以添加函数到公式中对数据进行处理,与自助数据集不同的是,计算指标中增加了聚合函数、快速计算函数。支持的函数如下图所示,包括聚合函数快速计算函数数学和三角函数文本函数日期函数逻辑函数其他函数

 

 

4、函数操作
在使用函数的时候,点击“>>”可展开所有支持的函数,如下图:

 

 

 
选择函数添加到公式的时候,需要在函数栏点击选中,在公式框手动输入无效。

 

 

若要查看某个函数的释义,可将鼠标悬浮在该函数上,即可查看。同时在添加到公式中以后,在函数释义框同样可查看。

 

 

 

常用函数
1、版本
         FineBI版本          
         jar包版本          
  5.1
  2019.1.7
2、IF
IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。
boolean:用于判断的布尔值,true或者false。
number1/string1:第一个参数,如果boolean为true,返回这个值。
number2/string2:第二个参数,如果boolean为false,返回这个值。
示例:
IF(true,2,8)等于2;
IF(false,"first","second")等于second;
IF(true,"first",7)等于first。
3、SUM
SUM(number1,number2,...):求一个指定单元格区域中所有数字之和。Number1,number2,...:1到30个参数或指定单元格区域中所有数字。
备注:函数将直接键入参数中的数值、逻辑值及文本表达式计算在内。若参数是数值或引用,则只有数组或单元格引用中的数值进行计算。
示例:
SUM(70,80)等于150;
SUM("70",80,TRUE)等于151,逻辑值“TRUE”作为1来计算;“FALSE”作为0计算;文本“70”作为70来计算。
4、ABS
ABS(number):返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。
示例:
ABS(-1.5)等于1.5;
ABS(0)等于0;
ABS(2.5)等于2.5。
5、ROUND
ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果num_digits大于0,则舍入到指定的小数位。如果num_digits等于0,则舍入到最接近的整数。如果num_digits小于0,则在小数点左侧进行舍入。
示例:
ROUND(2.15,1)等于2.2;
ROUND(2.149,1)等于2.1;
ROUND(-1.475,2)等于-1.48;
ROUND(21.5,-1)等于20。
因浮点数存在精度计算丢失的问题,导致计算结果可能带上9999,0000这些,因此加入第三个参数true来控制是否需要去除9999,true表示需要过滤9999,0000这些数据。
6、INT
INT(number):返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。
示例:
INT(4.8)等于4;
INT(-4.8)等于-5;
INT(4.3)等于4;
INT(-4.3)等于-5。
公式INT(A1)将返回A1单元格中的一个正实数的整数部分。
 
聚合函数
1、描述
当在添加计算指标,需要先进行汇总,再进行二次计算时,在添加计算字段的时候通过聚合函数提供了不同汇总方式选择,包括求和,平均,中位数,最大值,最小值,标准差,方差,去重计数,计数。当将包含聚合函数的计算指标添加到组件的指标栏后,随着用户分析维度的切换,计算字段数据会自动跟随维度动态调整。
如某公司明细数据为日期、销售额、工作时间。按照日分析单位工作时间产出时,需要按照日统计销售额汇总值,再除以按照日汇总的工作时长;而有时需要按照月分析单位时间产出,此时需要按照月统计销售额汇总值,再除以按照月汇总的工作时长。此时可利用聚合函数创建计算字段 sum_agg(销量)/sum_agg(时长),然后随着用户分析的维度日或月切换时,计算字段数据自动跟随维度调整为日产出或月产出。
2、MIN_AGG
MIN_AGG(array):根据当前分析维度,动态返回指标字段的最小值,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段MIN_AGG(销量)返回的值为每日的最小值销量;
当用户横轴为维度字段'月'时,MIN_AGG(销量)返回的值为每月的最小值销量。
3、COUNT_AGG
COUNT_AGG(array):根据当前分析维度,动态返回某字段的计数,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段COUNT_AGG(销量)返回的值为每日的销量的个数;
当用户横轴为维度字段'月'时,COUNT_AGG(销量)返回的值为每月的销量的个数。
4、MAX_AGG
MAX_AGG(array):根据当前分析维度,动态返回指标字段的最大值,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段MAX_AGG(销量)返回的值为每日的最大值销量;
当用户横轴为维度字段'月'时,MAX_AGG(销量)返回的值为每月的最大值销量。
5、MEDIAN_AGG
MEDIAN_AGG(array):根据当前分析维度,动态返回指标字段的中位数,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段MEDIAN_AGG(销量)返回的值为每日的中位数销量;
当用户横轴为维度字段'月'时,MEDIAN_AGG(销量)返回的值为每月的中位数销量。
6、COUNTD_AGG
COUNTD_AGG(array):根据当前分析维度,动态返回某字段的去重计数,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段COUNTD_AGG(销量)返回的值为每日的销量的去重个数;
当用户横轴为维度字段'月'时,COUNTD_AGG(销量)返回的值为每月的销量的去重个数。
7、VAR_AGG
VAR_AGG(array):根据当前分析维度,动态返回指标字段的方差,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段VAR_AGG(销量)返回的值为每日的销量方差;
当用户横轴为维度字段'月'时,VAR_AGG(销量)返回的值为每月的销量方差。
8、AVG_AGG
AVG_AGG(array):根据当前分析维度,动态返回指标字段的汇总平均值,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段AVG_AGG(销量)返回的值为每日的平均销量;
当用户横轴为维度字段'月'时,AVG_AGG(销量)返回的值为每月的平均销量。
9、STDEV_AGG
STDEV_AGG(array):根据当前分析维度,动态返回指标字段的标准差,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段STDEV_AGG(销量)返回的值为每日的销量标准差;
当用户横轴为维度字段'月'时,STDEV_AGG(销量)返回的值为每月的销量标准差。
10、SUM_AGG
SUM_AGG(array):根据当前分析维度,动态返回指标字段的汇总求和值,生成结果为一动态数据列,行数与当前分析维度行数一致。
array必须为非聚合函数公式返回的结果,可以是某指标字段、维度或指标字段与普通公式的计算结果。
示例:
用户横轴为维度字段'日'时,纵轴的计算字段SUM_AGG(销量)返回的值为每日的汇总销量;
当用户横轴为维度字段'月'时,SUM_AGG(销量)返回的值为每月的汇总销量。
11、示例
比如当要在数据分析时添加平均销售额的计算指标,该平均销售额由合同金额除以购买数量得到,就需要先进行合同金额的汇总再计算。
如下图,添加计算指标后,选择SUM_AGG函数,用户汇总合同金额,并添加计算符除以用户汇总的购买数量字段。
修改该计算指标的名称为平均销售额,如下图:
点击确定保存该计算指标,此时我们将该平均销售额拖入轴中显示,该平均销售额中的合同金额及购买数量会根据维度的不同先进行汇总,再计算得出不同维度下的平均销售额数值。如下图为根据不同年份动态生成平均销售额的计算数据。

 

 

快速计算函数
1、描述
快速计算函数仅在添加计算指标中支持,是对聚合函数字段的一种计算,参数均需添加聚合函数或者聚合指标,否则公式会标红,无法使用。当将包含聚合函数的计算指标添加到组件的指标栏后,随着用户分析维度的切换,计算字段数据会自动跟随维度动态调整,但聚合函数只能支持一次汇总统计,无法再求汇总后的累加等计算。因此快速计算函数用于将聚合函数计算后的结果再进行计算,包括上期末、同期、环期、跨行累计、跨行排名、跨行汇总。
注:该快速计算函数需要FineBI5.0 2018.11.16之后的版本才支持使用。  
时间类函数
2、PERIOD_ANLS
period_anls(x_agg(array), datepart):根据横纵轴或行列维度添加的日期字段进行上期末的计算。
第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算的上期末为上年期末或者上月期末。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。
示例:
period_anls(sum_agg(amount), "Y"):用户横纵轴拖拽的销售日期(年月分组),则该指标计算结果为,根据年月对销量进行分组汇总,然后计算出该月数据上年年末的销量;如果参数2为"M",则需切换维度字段为年月日分组,计算结果为该日销量上月月末的销量。

 

 

 

 

 

 

3、SAME_PERIOD
same_period(x_agg(array), detepart):根据横纵轴或行列维度添加的日期字段进行同期值的计算。
第一个参数为用于计算的指标,该指标必须为聚合函数或聚合指标;第二个参数用于配置计算同期时,计算某日的年同期或者某日的月同期。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。
示例:
same_period(sum_agg(amount), "Y"):用户横纵轴拖拽了销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上年同日的销量;如果参数2为"M",则计算结果为该日销量上月同日的销量。

 

 

 

 

 

 

4、PREVIOUS_PERIOD
previous_period(x_agg(array)):根据横纵轴或行列维度添加的日期字段进行环期值的计算。
参数为用于计算的指标,该指标必须为聚合函数或聚合指标。横纵轴拖拽的字段不满足函数的计算要求时,该指标会标红。
示例:
previous_period(sum_agg(amount)):用户横纵轴拖拽的销售日期(年月日分组),则该指标计算结果为,根据年月日对销量进行分组汇总,然后计算出该日数据上一日的销量。

 

 

 

 

 

 

普通跨行函数
5、ACC_SUM
acc_sum(x_agg(array),range):根据横纵轴或行列维度添加的字段对指标进行跨行累计的计算。
第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行累计,1为对组内所有行进行累计。
示例:
acc_sum(sum_agg(array),0):用户横纵轴拖拽了销售日期(年月分组)维度,则该指标计算结果为,根据销售日期(年月)对销量进行分组汇总,然后根据对所有行从上到下进行累加,获得每月的累计销量;

 

 

 

 

 

 

6、RANK_ANLS
rank_anls(x_agg(array), range, order):根据横纵轴或行列维度添加的字段对指标进行跨行排名的计算。
第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行排名,1为对组内所有行进行排名;第三个参数order为排名的计算规则,"asc"为升序排名,"desc"为降序排名。
示例:
rank_anls(sum_agg(amount), 0, "asc"):用户横纵轴拖拽省份,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算每个省份的销量在所有省份中的升序排名情况。

 

 

 

 

 

 

7、TOTAL
total(x_agg(array), range, agg):根据横纵轴或行列维度添加的字段对指标进行跨行汇总的计算。
第一个参数为用户计算的指标,该指标必须为聚合函数或聚合指标;第二个参数range为用户设置计算的范围,0为对所有行进行汇总,1为对组内所有行进行汇总;第三个参数agg为汇总的计算规则,"sum"为求和;"avg"为求平均;"max"为求最大值;"min"为求最小值。
示例:
total(sum_agg(array), 0, "avg"):用户横纵轴拖拽了省份字段,则该指标计算结果为,根据省份对销量进行分组汇总,然后计算平均每个省份的销量。

 

 

 

 

 

 

8、示例
如某公司需要展示按年月汇总统计的销售额,并求对应年月的占比,此时仅使用聚合函数SUM_AGG无法实现,就可以使用快速计算函数来对聚合的指标进行二次计算。
首先我们需要利用SUM_AGG的聚合函数计算出销售年月汇总统计的数据,如下图:

 

 

 

而要求每个月份销售额的占比时,就需要将该按年月汇总的销售额叠加计算总的销售额,用年月的汇总额除以该总值即可得出占比。我们可以使用TOTAL快速计算函数,如下图:

 

 

 

我们还可以为该销售额占比字段设置数值格式为百分比,在组件中分别拖入字段,可以查看到随维度统计的对应指标数值,如下图:

 

 

 

数学和三角函数
1、描述
         FineBI版本           
          jar包版本         
  5.1
  2019.1.7
数值函数包含绝对值,平均,二进制取反运算,位运算,取整,组合,余弦,双曲线余弦,求个数,弧度转化为度,偶数,指数,阶乘,取整,四舍五入,对数,最大值,最小值,余数,取余,奇数,pi,乘幂,角度转换成弧度,随机数,随机整数,奇进偶不进,平方根,求和,平方和,加权平均。
所有函数使用范围为数值字段,部分函数允许添加一些指定参数数值。
2、RAND
RAND():返回均匀分布的随机数。每计算一次工作表,函数都会返回一个新的随机数值。
备注:要生成一个位于a和b之间的随机数,可以使用以下的公式:C=RAND()*(b-a)+a。如果要使一个随机产生的数值不随单元格的重计算而改变,可以在编辑框中输入=RAND()并保持编辑状态,然后按F9,将公式永久性的改为随机数。
示例:
假如需要生成一个大于等于0,小于60的随机数,使用公式:=RAND()*60。
假如需要生成一个大于等于0,小于19的随机数,使用公式:=RAND()*19。
假如需要生成一个大于等于0,小于50的随机数,使用公式:=RAND()*50。
3、SQRT
SQRT(number):返回一个正数的平方根。Number:要求其平方根的任一正数。
备注:Number必须是一个正数,否则函数返回错误信息*NUM!。
示例:
SQRT(64)等于8;
SQRT(-64)返回*NUM!。
4、LOG10
LOG10(number):返回以10为底的对数。number:用于常用对数计算的正实数。
示例:
LOG10(86)等于1.934498451;
LOG10(10)等于1;
LOG10(1E5)等于5。
5、FLOOR
FLOOR(number):将参数number沿绝对值减小的方向去尾舍入。Number:待舍入的数值。
示例:
FLOOR(-2.5)等于-2;
FLOOR(2.5)等于2。
6、LOG
LOG(number,base):按指定的任意底数,返回数值的对数。Number:需要求对数的正实数。Base:对数的底数。如果省略底数,默认值为10。
示例:
LOG(16,2)等于4;
LOG(10)等于1;
LOG(24,3)等于2.892789261。
7、MIN
MIN(number1,number2,...):返回参数列表中的最小值。Number1,number2,...:1到30个需要找出最小值的参数。
备注:若参数中没有数字,函数MIN将返回0。
参数应为数字、空白单元格、逻辑值或是表示数值的文本串。如果参数是错误值时,MIN将返回错误信息。如果数组或引用参数中包含可解析文本值、逻辑值、零值或空白单元格,这些值都将参与计算,而不可解析的文本值忽略不计。
示例:
如果B1:B4包含3,6,9,12,则MIN(B1:B4)等于3;MIN(B1:B4,0)等于0。
8、MAX
MAX(number1,number2,...):返回参数列表中的最大值。Number1,number2,...:1到30个需要找出最大值的参数。
备注:参数可以是数字、空白单元格、逻辑值或数字的文本表达式。
如果数组或引用参数中包含可解析文本值、逻辑值、零值或空白单元格,这些都将参与计算,而不可解析的文本值忽略不计。如果参数中没有任何数字,MAX将返回0。
示例:
MAX(0.1,0,1.2)等于1.2。
9、TRUNC
TRUNC(number,num_digits):将数字的小数部分截去,返回整数。number:需要截尾取整的数字。num_digits:用于指定取整精度的数字。
示例:
TRUNC(8.9)等于8;
TRUNC(-8.9)等于-8;
TRUNC(PI())等于3。
10、FACT
FACT(number):返回数的阶乘,一个数的阶乘等于1*2*3*...*该数。number:要计算其阶乘的非负数。如果输入的number不是整数,则截尾取整。
示例:
FACT(1)等于1;
FACT(1.9)等于FACT(1)等于1;
FACT(0)等于1;
FACT(5)等于1*2*3*4*5等于120。
11、RANDBETWEEN
RANDBETWEEN(value1,value2):返回value1和value2之间的一个随机整数。
示例:
RANDBETWEEN(12.333,13.233)只会返回13;
RANDBETWEEN(11.2,13.3)有可能返回12或者13。
12、ABS
ABS(number):返回指定数字的绝对值。绝对值是指没有正负符号的数值。Number:需要求出绝对值的任意实数。
示例:
ABS(-1.5)等于1.5;
ABS(0)等于0;
ABS(2.5)等于2.5。
13、LN
LN(number):返回一个数的自然对数。自然对数以常数项e(2.71828182845904)为底。number:是用于计算其自然对数的正实数。
示例:
LN(86)等于4.45437;
LN(2.7182818)等于1;
LN(EXP(3))等于3;
EXP(LN(4))等于4。
14、SIGN
SIGN(number):返回数字的符号。当数字为正数时返回1,为零时返回0,为负数时返回-1。Number:为任意实数。
示例:
SIGN(10)等于1;
SIGN(4-4)等于0;
SIGN(-0.00001)等于-1。
15、CEILING
CEILING(number):将参数number沿绝对值增大的方向,舍入为最接近的整数。Number:指待舍入的数值。
示例:
CEILING(-2.5)等于-3;
CEILING(0.5)等于1。
16、ROUND
ROUND(number,num_digits):返回某个数字按指定位数舍入后的数字。number:需要进行舍入的数字。num_digits:指定的位数,按此位数进行舍入。如果num_digits大于0,则舍入到指定的小数位。如果num_digits等于0,则舍入到最接近的整数。如果num_digits小于0,则在小数点左侧进行舍入。
示例:
ROUND(2.15,1)等于2.2;
ROUND(2.149,1)等于2.1;
ROUND(-1.475,2)等于-1.48;
ROUND(21.5,-1)等于20。
因浮点数存在精度计算丢失的问题,导致计算结果可能带上9999,0000这些,因此加入第三个参数true来控制是否需要去除9999,true表示需要过滤9999,0000这些数据。
17、INT
INT(number):返回数字下舍入(数值减小的方向)后最接近的整数值。Number:需要下舍入为整数的实数。
示例:
INT(4.8)等于4;
INT(-4.8)等于-5;
INT(4.3)等于4;
INT(-4.3)等于-5。
公式INT(A1)将返回A1单元格中的一个正实数的整数部分。
18、MOD
MOD(number,divisor):返回两数相除的余数。结果的正负号与除数相同。number:为被除数。divisor:为除数。
示例:
MOD(3,2)等于1;
MOD(-3,2)等于1;
MOD(3,-2)等于-1;
MOD(-3,-2)等于-1。
19、PROMOTION
PROMOTION(value1,value2):返回value2在value1上提升的比例。
示例:
PROMOTION(12,14)等于0.166666666,即提升了16.6666666%;
PROMOTION(-12,14)等于2.166666666,即提升了216.6666666%。
20、EXP
EXP(number):返回e的n次幂。常数e为自然对数的底数,等于2.171828182845904。Number:为任意实数,作为常数e的指数。
备注:如果要返回其他常数作为底数的幂,可以使用指数运算符(^)。例如在4^2中,4是底数,而2是指数。EXP函数与LN函数互为反函数。
示例:
EXP(0)等于1;
EXP(3)等于20.08553692;
EXP(LN(2))等于2。
21、ACOS
ACOS(number):返回指定数值的反余弦值。反余弦值为一个角度,返回角度以弧度形式表示。 Number:需要返回角度的余弦值。
注: 函数的参数必须在-1和1之间,包括-1和1。 返回的角度值在0和Pi之间。 如果要把返回的角度用度数来表示,用180/PI()乘返回值即可。
示例:
ACOS(1)等于0(弧度);
ACOS(0.5)等于1.047197551(Pi/3弧度);
ACOS(0.5)*180/PI()等于60(度)。
22、ASIN
ASIN(number):返回指定数值的反正弦值。反正弦值为一个角度,返回角度以弧度形式表示。 Number:需要返回角度的正弦值。
注: 指定数值必须在-1到1之间(含1与-1)。 返回角度在-pi/2到pi/2之间(含-pi/2与pi/2)。 用角度形式返回数值时,可以用返回数值乘以180/PI()。
示例:
ASIN(0.5)等于0.523598776(pi/6弧度);
ASIN(1)等于1.570796327(pi/2弧度);
ASIN(0.5)*180/PI()等于30(度)。
23、ATAN
ATAN(number):计算指定数值的反正切值。指定数值是返回角度的正切值,返回角度以弧度形式表示。 Number:返回角度的正切。
注: 返回角度在-pi/2到pi/2之间。 如果返回角度等于-pi/2或pi/2,ATAN将返回错误信息*NUM!。 用角度形式返回数值时,返回数值乘以180/PI()。
示例:
ATAN(-1)等于-0.785398163(-pi/4弧度);
ATAN(0)等于0(弧度);
ATAN(2)*180/PI()等于63.43494882(度)。
24、ATAN2
ATAN2(x_num,y_num):返回x、y坐标的反正切值。返回角度为x轴与过(x_num,y_num)与坐标原点(0,0)的一条直线形成的角度。该角度以弧度显示。 X_num:指定点的x坐标。 Y_num:指定点的y坐标。
注: 正值表示从x轴开始以逆时针方式所得的角度;负值表示从x轴开始以顺时针方式所得的角度。 ATAN2(a,b)=ATAN(b/a),a为0时除外。 当x_num与y_num都为0时,ATAN2返回错误信息*DIV/0!。 用角度制显示返回数值时,把返回数值乘以180/PI()。 返回值以弧度表示(返回值大于-pi且小于等于pi)。
示例:
ATAN2(-2,2)等于2.356194490(弧度制的3*pi/4);
ATAN2(2,2)等于0.785398163(弧度制的pi/4);
ATAN2(-2,2)*180/PI()等于135(角度制)。
25、COS
COS(number):返回一个角度的余弦值。 Number:以弧度表示的需要求余弦值的角度。
注:要把一个角度转换成弧度值,将角度乘于PI()/180。 COS(n*2*PI()+number)=COS(number)(其中n为整数,number从-pi到pi)。
示例:
COS(0.5)等于0.877582562;
COS(30*PI()/180)等于0.866025404。
26、DEGREES
DEGREES(angle):将弧度转化为度。 Angle:待转换的弧度角。
示例:
DEGREES(PI()/2)等于90;
DEGREES(3.1415926)等于179.9999969。
27、PI
PI:是一个数学常量,函数返回精确到15位的数值3.141592653589793;当参数不为空时,number表示PI的倍数。
示例:
SIN(PI()/2)等于1。( 计算圆的面积的公式: S=PI()*(r^2),其中S为圆的面积,R为圆的半径。)
PI(3)等于9.42477796076938。
28、POWER
POWER(number,power):返回指定数字的乘幂。 Number:底数,可以为任意实数。 Power:指数。参数number按照该指数次幂乘方。
注: 可以使用符号“^”代替POWER,如: POWER(5,2)等于5^2。 
示例:
POWER(6,2)等于36。(6^2=6*6)
POWER(14,5)等于537824。(14^5=14*14*14*14*14)
POWER(4,2/3)等于2.519842100。(=3√(4^2)即3√16)
POWER(3,-2.3)等于0.079913677。(3√(1/9))
29、RADIANS
RADIANS(angle):将角度转换成弧度。 Angle:需要转换为弧度的角度。
示例:
RADIANS(90)等于1.570796327(Pi/2弧度)。
30、SIN
SIN(number):计算给定角度的正弦值。 Number:待求正弦值的以弧度表示的角度。
注: 如果参数的单位是度,将其乘以PI()/180即可转换成弧度。 
示例:
SIN(10)等于-0.544021111;
SIN(45*PI()/180)等于0.707106781。
31、TAN
TAN(number):返回指定角度的正切值。 Number:待求正切值的角度,以弧度表示。如果参数是以度为单位的,乘以Pi()/180后转换为弧度。
示例:
TAN(0.8)等于1.029638557;
TAN(45*Pi()/180)等于1。
 
 
文本函数
1、版本
          FineBI版本         
         jar包版本          
  5.1
  2019.1.7
2、TRIM
TRIM(text):清除文本中所有空格,单词间的单个空格除外,也可用于带有不规则空格的文本。
Text:需要清除空格的文本。
示例:
TRIM(" Monthly Report")等于Monthly Report。
3、FORMAT
FORMAT(object,format) : 返回object的format格式。
object:需要被格式化对象,可以是String,数字,Object(常用的有Date, Time)。format:格式化的样式。
示例:
FORMAT(1234.5, "#,##0.00") => 1234.50
FORMAT(1234.5, "#,##0") => 1234
FORMAT(1234.5, "¥#,##0.00") => ¥1234.50
FORMAT(1.5, "0%") => 150%
FORMAT(1.5, "0.000%") => 150.000%
FORMAT(6789, "##0.0E0") => 6.789E3
FORMAT(6789, "0.00E00") => 6.79E03
FORMAT(date(2007,1,1), "EEEEE, MMMMM dd, yyyy") => 星期一,一月 01,2007
FORMAT(date(2007,1,13), "MM/dd/yyyy") => 01/13/2007
FORMAT(date(2007,1,13), "M-d-yy") => 1-13-07
FORMAT(time(16,23,56), "h:mm:ss a") => 4:23:56 下午
注:format对日期的操作,日期的大小写必须按照年份小写yy或yyyy,月份大写M或MM,日期小写d或dd。
4、ENDWITH
ENDWITH(str1,str2):判断字符串str1是否以str2结束。 备注: str1和str2都是大小写敏感的。
示例:
ENDWITH("FineReport","Report")等于true
ENDWITH("FineReport","Fine")等于false。
ENDWITH("FineReport","report")等于false。
5、NUMTO
NUMTO(number,bool)或NUMTO(number):返回number的中文表示。其中bool用于选择中文表示的方式,当没有bool时采用默认方式显示。
示例:
NUMTO(2345,true)等于二三四五;
NUMTO(2345,false)等于二千三百四十五;
NUMTO(2345)等于二千三百四十五。
6、LEFT
LEFT(text,num_chars):根据指定的字符数返回文本串中的第一个或前几个字符。
Text:包含需要选取字符的文本串或单元格引用。
Num_chars:指定返回的字符串长度。
备注: Num_chars的值必须等于或大于0。如果num_chars大于整个文本的长度,LEFT函数将返回所有的文本。如果省略num_chars,则默认值为1。
示例:
LEFT("Fine software",8)等于“Fine sof”;
LEFT("Fine software")等于“F”;
如果单元格A3中含有“China”,则LEFT(A3,2)等于“Ch”。
7、SUBSTITUTE
SUBSTITUTE(text,old_text,new_text,instance_num):用new_text替换文本串中的old_text。
Text:需要被替换字符的文本,或含有文本的单元格引用;
Old_text:需要被替换的部分文本;
New_text:用于替换old_text的文本。
Instance_num:指定用new_text来替换第几次出现的old_text。如果指定了instance_num,则只有指定位置上的old_text被替换,否则文字串中出现的所有old_text都被new_text替换。
备注: 如果需要替换字段值中的指定文本,则使用SUBSTITUTE函数;如果需要替换字段值中指定位置上的任意文本,则使用REPLACE函数。
示例:
SUBSTITUTE("data base","base","model")等于“data model”;
SUBSTITUTE("July 28, 2000","2","1",1)等于“July 18, 2000”;
SUBSTITUTE("July 28, 2000","2","1")等于“July 18, 1000”;
SUBSTITUTE("July 28, 2000","2","1",2)等于“July 28, 1000”。
8、MID
MID(text,start_num,num_chars):返回文本串中从指定位置开始的一定数目的字符,该数目由用户指定。
Text:包含要提取字符的文本串;
Start_num:文本中需要提取字符的起始位置。文本中第一个字符的start_num为1,依此类推;
Num_chars:返回字符的长度;
备注: 如果start_num大于文本长度,MID函数返回“”(空文本)。 
如果start_num小于文本长度,并且start_num加上num_chars大于文本长度,MID函数将从start_num指定的起始字符直至文本末的所有字符。
如果start_num小于1,MID函数返回错误信息*VALUE!。 
如果num_chars是负数,MID函数返回错误信息*VALUE!。
示例:
MID("Finemore software",10,8)返回“software”;
MID("Finemore software",30,5)返回“”(空文本);
MID("Finemore software",0,8)返回*VALUE!;
MID("Finemore software",5,-1)返回*VALUE!。
9、EXACT
EXACT(text1,text2):检测两组文本是否相同。如果完全相同,EXACT函数返回TRUE;否则,返回FALSE。EXACT函数可以区分大小写,但忽略格式的不同。同时也可以利用EXACT函数来检测输入文档的文字。
Text1:需要比较的第一组文本。
Text2:需要比较的第二组文本。
示例:
EXACT("Spreadsheet","Spreadsheet")等于TRUE。
EXACT("Spreadsheet","S preadsheet")等于FALSE。
EXACT("Spreadsheet","spreadsheet")等于FALSE。
10、TOINTEGER
TOINTEGER(text):将文本转换成Integer对象。
Text:需要转换的文本。
示例:
TOINTEGER("123")等于 new Integer(123)。
11、REPEAT
REPEAT(text,number_times):根据指定的次数重复显示文本。REPEAT函数可用来显示同一字符串,并对单元格进行填充。
Text:需要重复显示的文本或包含文本的单元格引用。
Number_times:指定文本重复的次数,且为正数。如果number_times为0,REPEAT函数将返回“”(空文本)。如果number_times不是整数,将被取整。REPEAT函数的最终结果通常不大于32767个字符。
备注:该函数可被用于在工作表中创建简单的直方图。
示例:
REPEAT("$",4)等于“$$$$";
如果单元格B10的内容为“你好”,REPEAT(B10,3)等于“你好你好你好”。
12、SPLIT
SPLIT(String1,String2 ):返回由String2分割String1组成的字符串数组。
String1:以双引号表示的字符串;
String2:以双引号表示的分隔符。例如逗号","。
备注: 如果只有一个参数,则返回一个错误。如果有多个参数,则只有前两个起作用。
示例:
SPLIT("hello,world,yes",",") = ["hello","world","yes"]。
SPLIT("this is very good"," ") = ["this","is","very","good"]。
13、UPPER
UPPER(text):将文本中所有的字符转化为大写。
Text:需要转化为大写字符的文本,或是包含文本的单元格引用。
示例:
UPPER("notes")等于“NOTES”;
如果单元格E5的值为“Examples”,则UPPER(E5)等于“EXAMPLES”。
14、RIGHT
RIGHT(text,num_chars):根据指定的字符数从右开始返回文本串中的最后一个或几个字符。
Text:包含需要提取字符的文本串或单元格引用;
Num_chars:指定RIGHT函数从文本串中提取的字符数。Num_chars不能小于0。
如果num_chars大于文本串长度,RIGHT函数将返回整个文本。如果不指定num_chars,则默认值为1。
示例:
RIGHT("It is interesting",6)等于“esting”;
RIGHT("Share Holder")等于“r”;
RIGHT("Huge sale",4)等于“sale”。
15、TODOUBLE
TODOUBLE(text):将文本转换成Double对象。
Text:需要转换的文本。
示例:
TODOUBLE("123.21")等于 new Double(123.21)。
16、INDEXOF
1)INDEXOF(str1,index):返回字符串str1在index位置上的字符。
备注: index是从0开始计数的。
示例:
INDEXOF("FineReport",0)等于'F';
INDEXOF("FineReport",2)等于'n';
INDEXOF("FineReport",9)等于't';
2)INDEXOF(array,index):返回数组在index位置上的元素。
备注:index是从1开始计数的。
示例:
String[] array = {"a","b","c"} INDEXOF(array,1)等于"a"。
17、FIND
FIND(find_text,within_text,start_num):从指定的索引(start_num)处开始,返回第一次出现的指定子字符串(find_text)在此字符串(within_text)中的索引。
Find_text:需要查找的文本或包含文本的单元格引用;
Within_text:包含需要查找文本的文本或单元格引用;
Start_num:指定进行查找字符的索引位置。
within_text里的索引从1开始。如果省略start_num,则假设值为1。备注:如果find_text不在within_text中,FIND函数返回值为0。如果start_num不大于0,FIND函数返回错误信息*VALUE!。如果大于within_text的长度,FIND函数返回值为0。如果find_text是空白文本,FIND函数将在搜索串中匹配第一个字符(即编号为start_num或1的字符)。
示例:
FIND("I","Information"),返回"I"在"Information"中的位置即返回值为1;
FIND("i","Information"),返回"i"在"Information"中的位置即返回值为9;
FIND("o","Information",2)等于4;
FIND("o","Information",12)等于0;
FIND("o","Information",-1)等于*VLAUE!。
18、REPLACE
1)REPLACE(text,textorreplace,replacetext):根据指定的字符串,用其他文本来代替原始文本中的内容。
text:需要被替换部分字符的文本或单元格引用;
textorreplace:指定的字符串或正则表达式;
replacetext:需要替换部分旧文本的文本。
示例:
REPLACE("abcd","a","re")等于"rebcd";
REPLACE("a**d","**d","rose")等于"arose";
2)REPLACE(old_text,start_num,num_chars,new_text):根据指定的字符数,用其他文本串来替换某个文本串中的部分内容。
Old_text:需要被替换部分字符的文本或单元格引用;
Start_num:需要用new_text来替换old_text中字符的起始位置;
Num_chars:需要用new_text来替换old_text中字符的个数;
New_text:需要替换部分旧文本的文本。
示例:
REPLACE("0123456789",5,4,"*")等于“0123*89”;
REPLACE("1980",3,2,"99")等于“1999”。
19、CONCATENATE
CONCATENATE(text1,text2,...):将数个字符串合并成一个字符串。
Text1,text2,...:需要合并成单个文本的文本项,可以是字符,数字或是单元格引用。
示例:
CONCATENATE("Average ","Price")等于“Average Price”;
CONCATENATE("1","2")等于12。
20、LOWER
LOWER(text):将所有的大写字母转化为小写字母。
Text:需要转化为小写字母的文本串。LOWER函数不转化文本串中非字母的字符。
示例:
LOWER("A.M.10:30")等于“a.m.10:30”;
LOWER("China")等于“china”。
21、LEN
LEN(args):返回文本串中的字符数或者数组的长度。需要注意的是:参数args为文本串时,空格也计为字符。参数args为数组时,直接返回数组长度。
示例:
LEN("Evermore software")等于17;
LEN(" ")等于1;
LEN(['a','b'])等于2。
22、CHAR
CHAR(number):根据指定数字返回对应的字符。CHAR函数可将计算机其他类型的数字代码转换为字符。Number:用于指定字符的数字,介于1~65535之间(包括1和65535)。
示例:
CHAR(88)等于"X";
CHAR(45)等于"-"。
23、CODE
CODE(text):计算文本串中第一个字符的数字代码。返回的代码对应于计算机使用的字符集。Text:需要计算第一个字符代码的文本或单元格引用。
示例:
CODE("S")等于83;
CODE("Spreadsheet")等于83。
24、PROPER
PROPER(text):将文本中的第一个字母和所有非字母字符后的第一个字母转化为大写,其他字母变为小写。Text:需要转化为文本的公式、由双引号引用的文本串或是单元格引用。
示例:
PROPER("Finemore Integrated Office")等于"Finemore Integrated Office";
PROPER("100 percent")等于"100 Percent";
PROPER("SpreaDSheEt")等于"Spreadsheet"。
25、REGEXP
(1)REGEXP(str, pattern):字符串str是否与正则表达式pattern相匹配。
示例:
REGEXP("aaaaac","a*c")等于true;
REGEXP("abc","a*c")等于false;
(2)REGEXP(str, pattern, intNumber):字符串str是否与具有给定模式 intNumber 的正则表达式pattern相匹配。
注:intNumber的模式如下所示 
CASE_INSENSITIVE = 0 ——启用不区分大小写的匹配。
标志来启用 Unicode感知的、不区分大小写的匹配。 默认情况下,不区分大小写的匹配假定仅匹配 US-ASCII字符集中的字符。可以通过指定 UNICODE_CASE
MULTILINE = 1 ——启用多行模式。
DOTALL = 2 ——启用 dotall模式。
在 dotall模式中,表达式可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行结束符。
UNICODE_CASE = 3——启用 Unicode感知的大小写折叠
指定此标志后,由CASE_INSENSITIVE标志启用时,不区分大小写的匹配将以符合 Unicode Standard的方式完成。
CANON_EQ = 4——启用规范等价。
指定此标志后,当且仅当其完整规范分解匹配时,两个字符才可视为匹配。
UNIX_LINES = 5——启用 Unix行模式。
在此模式中,.、^和 $的行为中仅识别 '\n'行结束符。
LITERAL = 6——启用模式的字面值解析。
指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的元字符或转义序列不具有任何特殊意, 标志 CASE_INSENSITIVE和 UNICODE_CASE在与此标志一起使用时将对匹配产生影,其他标志都变得多余了。
COMMENTS = 7——模式中允许空白和注释。
此模式将忽略空白和在结束行之前以 #开头的嵌入式注释。
示例:
REGEXP("Aaaaabbbbc","a*b*c", 3)等于true;
REGEXP("Aaaaabbbbc","a*b*c", 1)等于false。
26、STARTWITH
STARTWITH(str1,str2):判断字符串str1是否以str2开始。
注: str1和str2都是大小写敏感的。
示例:
STARTWITH("FineReport","Fine")等于true;
STARTWITH("FineReport","Report")等于false。
 
 
日期函数
1、描述
          FineBI版本        
        jar包版本          
5.1  
  2019.1.7
凡函数中以日期作为参数因子的,其中日期的形式都必须是yyyy/mm/dd或yyyy-MM-dd。而且必须用英文环境下双引号(" ")引用。
2、MONTH
MONTH(serial_number):返回日期中的月,月是介于1和12之间的一个数。
Serial_number:含有所求的月的日期。
备注: FineBI将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在1900年日期系统中,FineBI电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3, 将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。
示例:
MONTH("2000/1/1")等于1;
MONTH("2006/05/05")等于5;
MONTH("1997/04/20")等于4;
MONTH("2000-1-1","yyyy-MM-dd")等于1;
MONTH("2006-05-05","yyyy-MM-dd")等于5;
MONTH("1997-04-20","yyyy-MM-dd")等于4;
MONTH(35796)等于1。
3、DAYSOFYEAR
DAYSOFYEAR(year):返回某年包含的天数。
示例:
DAYSOFYEAR(2008)等于366,等价于:DAYSOFYEAR("2008-01-01")。
4、YEAR
YEAR(serial_number):返回日期中的年。Year是介于1900和9999之间的一个数。
Serial_number:含有所求的年的日期。
备注: FineBI将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在1900年日期系统中,FineBI电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。
示例:
YEAR("2000/1/1")等于2000;
YEAR("2006/05/05")等于2006;
YEAR("1997/04/20")等于1997;
YEAR("2000-1-1","yyyy-MM-dd")等于2000;
YEAR("2006-05-05","yyyy-MM-dd")等于2006;
YEAR("1997-04-20","yyyy-MM-dd")等于1997;
YEAR(35796)等于1998。
5、DATEINWEEK
DATEINWEEK(date, number):函数返回在某一个星期当中第几天的日期。
示例:
dateInWeek("2008-08-28", 2)等于2008-08-26;
dateInWeek("2008-08-28",-1)等于2008-08-31。如果最后一个参数为-1,返回该日期所在星期的最后一天。
6、MONTHDELTA
MONTHDELTA(date,delta):返回指定日期date后delta个月的日期。
示例:
MONTHDELTA("2008-08-08", 4)等于2008-12-08。
7、DATEDIF
DATEDIF(start_date,end_date,unit):返回两个指定日期间的天数、月数或年数。
Start_date:代表所指定时间段的初始日期。
End_date:代表所指定时间段的终止日期。
Unit:函数返回信息的类型。
若unit=“Y”,则DATEDIF返回指定时间段的年差数。
若unit=“M”,则DATEDIF返回指定时间段的月差数。
若unit=“D”,则DATEDIF返回指定时间段的日差数。
若unit=“MD”,则DATEDIF忽略年和月,返回指定时间段的日差数。
若unit=“YM”,则DATEDIF忽略年和日,返回指定时间段的月差数。
若unit=“YD”,则DATEDIF忽略年,返回指定时间段的日差数。
示例:
DATEDIF("2001/2/28","2004/3/20","Y")等于3,即在2001年2月28日与2004年3月20日之间有3个整年。
DATEDIF("2001/2/28","2004/3/20","M")等于36,即在2001年2月28日与2004年3月20日之间有36个整月。
DATEDIF("2001/2/28","2004/3/20","D")等于1116,即在2001年2月28日与2004年3月20日之间有1116个整天。
DATEDIF("2001/2/28","2004/3/20","MD")等于8,即忽略月和年后,2001年2月28日与2004年3月20日的差为8天。
DATEDIF("2001/1/28","2004/3/20","YM")等于2,即忽略日和年后,2001年1月28日与2004年3月20日的差为2个月。
DATEDIF("2001/2/28","2004/3/20","YD")等于21,即忽略年后,2001年2月28日与2004年3月20日的差为21天。
8、DATEDELTA
DATEDELTA(date, deltadays):返回一个日期date后deltadays的日期。deltaDays可以为正值,负值,零。
示例:
DATEDELTA("2008-08-08", -10)等于2008-07-29;
DATEDELTA("2008-08-08", 10)等于2008-08-18。
9、WEEKDATE
WEEKDATE(year,month,weekOfMonth,dayOfWeek):返回指定年月的指定周的周几的具体日期。
1)默认周开始于星期日时,此时系统中周的范围为星期日到星期六。
示例:
WEEKDATE(2009,10,2,1)返回的是2009年的10月的第二个周的第一天即星期天的日期,返回的是2009-10-04;
最后一个参数dayOfWeek为-1时,表示这个周的最后一天。
示例:
WEEKDATE(2009,12,1,-1)返回的是2009年的12月的第一个周的最后一天即星期六的日期,返回的是2009-12-05。
2)当设置周开始于星期一时,此时系统中周的范围为星期一到星期日。
10、DATEINMONTH
DATEINMONTH(date, number):函数返回在某一个月当中第几天的日期。
示例:
DATEINMONTH("2008-08-08", 20)等于2008-08-20;
DATEINMONTH("2008-08-08",-1)等于2008-08-31。
11、DAYS360
DAYS360(start_date,end_date,method):按照一年360天的算法(每个月以30天计,一年共计12个月),返回两日期间相差的天数,这在会计计算中将会用到的。如果财务系统是基于一年 12个月,每月 30天,可用此函数帮助计算支付款项。
Start_date和 end_date :是用于计算期间天数的起止日期。
Method:它指定了在计算中是采用欧洲方法还是美国方法。
Method定义:FALSE或忽略 美国方法 (NASD)。如果起始日期是一个月的 31号,则等于同月的 30号。如果终止日期是一个月的31号,并且起始日期早于 30号,则终止日期等于下一个月的 1号,否则,终止日期等于本月的 30号。
TRUE欧洲方法。无论是起始日期还是终止日期为一个月的 31号,都将等于本月的 30号。
备注:
FineBI将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在1900年日期系统中,FineB电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。
示例:
DAYS360("1998/1/30", "1998/2/1")等于 1。
12、TODATE
TODATE()函数可以将各种日期形式的参数转换为日期类型。
它有三种参数的形式:
1. 参数是一个日期型的参数,那么直接将这个参数返回。
示例:
TODATE(DATE(2007,12,12))返回2007年12月12日组成的日期。
2. 参数是以从1970年1月1日0时0分0秒开始的毫秒数,返回对应的时间。
示例:
TODATE("1023542354746")返回2002年6月8日。
3. 参数是日期格式的文本,那么返回这个文本对应的日期。
示例:
TODATE("2007/10/15")返回2007年10月5日组成的日期。
TODATE("2007-6-8")返回2007年6月8日组成的日期。
4. 有两个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式。
示例:
TODATE("1/15/07","MM/dd/yy")返回07年1月15日组成的日期。
注意:此处的格式中月份必须大写MM,年份小写:yy(不可以为yyyy)。天份小写:dd。
特别的,"yyyyMMdd"是用来解析形如"20081230"之类的日期格式的。比如TODATE("20110830","yyyyMMdd")返回11年08月30日组成的日期。
5. 有三个参数,第一个参数是一个日期格式的文本,第二个参数是用来解析日期的格式,第三个参数为解析日期的语言,如:zh(中文),en(英文)。
示例:
TODATE("星期三 1/15/07","EEE mm/dd/yy","zh")返回07年1月15日组成的日期,使用“zh(中文)”才能够正常解析“星期三”这个字符串。
13、DAY
DAY(serial_number):返回日期中的日。DAY是介于1和31之间的一个数。
Serial_number:含有所求的年的日期。
备注:FineBI将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在1900年日期系统中,FineBI电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。
示例:
DAY("2000/1/1")等于1;
DAY("2006/05/05")等于5;
DAY("1997/04/20")等于20;
DAY("2000-1-1","yyyy-MM-dd")等于1;
DAY("2006-05-05","yyyy-MM-dd")等于5;
DAY("1997-04-20","yyyy-MM-dd")等于20;
DAY(35796)等于1。
14、LUNAR
LUNAR(year,day,month): 返回当前日期对应的农历时间。year,month,day:分别对应年月日。
示例:
如果需要查询2011年7月21日对应的农历时间,则:
LUNAR(2011,7,21)结果将显示为:辛卯年六月廿一。
LUNAR(2001,7,21)结果显示:辛巳年六月初一 。本公式支持的时间段为1900-2100年。
15、MINUTE
MINUTE(serial_number):返回某一指定时间的分钟数,其值是介于0与59之间的一个整数。
Serial_number:包含所求分钟数的时间。
示例:
MINUTE("15:36:25")等于36;
MINUTE("15:36:25","HH:mm:ss")等于36。
16、DATESUBDATE
DATESUBDATE(date1,date2,op):返回两个日期之间的时间差。
op表示返回的时间单位:"s",以秒为单位;"m",以分钟为单位;"h",以小时为单位;"d",以天为单位;"w",以周为单位。
示例:
DATESUBDATE("2008-08-08", "2008-06-06","h")等于1512。
17、DAYSOFMONTH
DAYSOFMONTH(date):返回从1900年1月后某年某月包含的天数。
示例:
DAYSOFMONTH("1900-02-01")等于28;
DAYSOFMONTH("2008/04/04")等于30。
18、DATEINQUARTER
DATEINQUARTER(date, number):函数返回在某一个季度当中第几天的日期。
示例:
DATEINQUARTER("2009-05-05", 20)等于2009-04-20。
19、DAYVALUE
DAYVALUE(date):返回1900年至date日期所经历的天数。
示例:
DAYVALUE("2008/08/08")等于39668。
20、DATE
DATE(year,month,day):返回一个表示某一特定日期的系列数。
Year:代表年,可为一到四位数。
Month:代表月份。若1<=month<= 12,则函数把参数值作为月;若month>12,则函数从年的一月份开始往上累加。例如:DATE(2000,25,2)等于2002年1月2日的系列数。
Day:代表日。若日期小于等于某指定月的天数,则函数将此参数值作为日;若日期大于某指定月的天数,则函数从指定月份的第一天开始往上累加;若日期大于两个或多个月的总天数,则函数把减去两个月或多个月的余数加到第三或第四个月上,依此类推。如:DATE(2000,3,35)等于2000年4月4日的系列数。
备注:若需要处理公式中日期的一部分,如年或月等,则可用此公式。若年,月和日是函数而不是函数中的常量,则此公式最能体现其作用。
示例:
DATE(1978, 9, 19)等于1978-09-19;
DATE(1211, 12, 1)等于1211-12-01。
21、NOW
NOW():获取当前时间。
示例:
如果系统时间是2012年5月12日 15点18分38秒, 则NOW()等于2011-05-12 15:18:36。
22、HOUR
HOUR(serial_number):返回某一指定时间的小时数。函数指定HOUR为0(0:00)到23(23:00)之间的一个整数。
Serial_number:包含所求小时的时间。
示例:
HOUR("11:32:40")等于11;
HOUR("11:32:40","HH:mm:ss")等于11。
23、YEARDELTA
YEARDELTA(date, delta):返回指定日期后delta年的日期。
示例:
YEARDELTA("2008-10-10",10)等于2018-10-10。
24、DATEINYEAR
DATEINYEAR(date, number):函数返回在某一年当中第几天的日期。
示例:
DATEINYEAR(2008,100)等于2008-04-09,等价于DATEINYEAR("2008-08-08",100),也返回2008-04-09。
DATEINYEAR(2008,-1)等于2008-12-31,等价于DATEINYEAR("2008-08-08",-1),也返回2008-12-31。
25、DAYSOFQUARTER
DAYSOFQUARTER(date):返回从1900年1月后某年某季度的天数。
示例:
DAYSOFQUARTER("2009-02-01")等于90;
DAYSOFQUARTER("2009/05/05")等于91。
26、WEEK
WEEK(serial_num):返回一个代表一年中的第几周的数字。
1)默认周开始于星期日时,此时系统中周的范围为星期日到星期六。
Serial_num:表示输入的日期。
备注: FineBI将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在1900年日期系统中,FineBI电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。
示例:
WEEK("2010/1/1")等于52;
WEEK("2010/1/6")等于1;
WEEK(35796)等于1。
2010-01-01是星期五,那么2010-01-01就不能算在2010年的第一个星期里面,只算在2009年的最后一个星期里。
2010年的第一个星期的第一天应该是2010-01-03,因为2010-01-03是2010年的第一个星期日。
 
2)当设置周开始于星期一时,此时系统中周的范围为星期一到星期日。
2010年的第一个星期的第一天应该是2010-01-04,因为2010-01-04是2010年的第一个星期一。
27、WEEKDAY
WEEKDAY(Serial_number):获取日期并返回星期数。返回值为介于0到6之间的某一整数,分别代表星期中的某一天(从星期日到星期六)。
Serial_number:输入的日期。
备注: FineBI将日期保存为系列数,一个系列数代表一个与之匹配的日期,以方便用户对日期进行数值式计算。
在1900年日期系统中,FineBI电子表格将1900年1月1日保存为系列数2,将1900年1月2日保存为系列数3,将1900年1月3日保存为系列数4……依此类推。如在1900年日期系统,1998年1月1日存为系列数35796。
示例:
WEEKDAY("2005/9/10")等于6(星期六);
WEEKDAY("2005/9/11")等于0(星期日);
WEEKDAY(35796)等于4(星期四)。
28、TODAY
TODAY():是获取当前的日期。
示例:
如果系统日期是2005年9月10日,则TODAY()等于2005-9-10。
29、TIME
TIME(hour,minute,second):返回代表指定时间的小数。介于0:00:00(12:00:00 A.M.)与23:59:59(11:59:59 P.M.)之间的时间可返回0到0.99999999之间的对应数值。
Hour:介于0到23之间的数。
Minute:介于0到59之间的数。
Second:介于0到59之间的数。
示例:
TIME(14,40,0)等于2:40 PM;
TIME(19,43,24)等于7:43 PM。
30、SECOND
SECOND(serial_number):返回某一指定时间的秒数,其值是介于0与59之间的一个整数。
Serial_number:包含所求秒数的时间。
示例:
SECOND("15:36:25")等于25;
SECOND("15:36:25", "HH:mm:ss")等于25。

 

逻辑函数
1、IF
IF(boolean,number1/string1,number2/string2):判断函数,boolean为true时返回第二个参数,为false时返回第三个。
boolean:用于判断的布尔值,true或者false。
number1/string1:第一个参数,如果boolean为true,返回这个值。
number2/string2:第二个参数,如果boolean为false,返回这个值。
示例:
IF(true,2,8)等于2;
IF(false,"first","second")等于second;
IF(true,"first",7)等于first。
2、AND
AND(logical1, logical2,…):当所有参数的值为真时,返回TRUE;当任意参数的值为假时,返回FALSE。 Logical1,logical2,…:指1到30个需要检验TRUE或FALSE的条件值。
备注: 参数必须是逻辑值,或是含有逻辑值的数组或引用。 如果数组或引用中含有文本或空的单元格,则忽略其值。 如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。
示例:
AND(1+7=8,5+7=12)等于TRUE。
AND(1+7=8,5+7=11)等于FALSE。
如果单元格A1到A4的值分别为TRUE、TRUE、FLASE和TRUE,则AND(A1:A4)等于FALSE;
如果单元格A5的值在0-50之间,则AND(0<a5,a5<50)等于true。< span="">
3、SWITCH
SWITCH(表达式, 值1, 结果1, 值2, 结果2, ...):如果表达式的结果是值1,整个函数返回结果1;如果表达式的结果是值2,整个函数返回结果2;如果表达式的结果是值3,整个函数返回结果3 等等。SWITCH函数的详细应用示例可参考Switch函数
4、OR
OR(logical1, logical2,...):当所有参数的值为假时,返回FALSE;当任意参数的值为真时,返回TRUE。
Logical1,logical2,...:指1到30个需要检验TRUE或FALSE的条件值。
备注:参数必须是逻辑值,或是含有逻辑值的数组或引用。如果数组或引用中含有文本或空的单元格,则忽略其值。如果在指定的单元格区域中没有逻辑值,AND函数将返回错误信息*NAME?。
示例:
OR(1+7=9,5+7=11)等于FALSE;
OR(1+7=8,5+7=11)等于TRUE。
Switch函数
1、描述
当需要判断条件多的时候,用if函数需要对每种情况都进行判断的话会比较麻烦,需要写多个表达式。此时我们可以使用switch函数,只需要写一个表达式就可以对多种情况进行判断。下面简单的介绍一下switch函数的用法。
2、用法
SWITCH(表达式, 值1, 结果1, 值2, 结果2, ...):
如果表达式的结果是值1,整个函数返回结果1;
如果表达式的结果是值2,整个函数返回结果2;
如果表达式的结果是值3,整个函数返回结果3;
3、应用场景
如下图所示,汇总表中有两个字段,一个城市代号,一个销售额,地理相对来说较为熟悉的人知道皖A-皖E分别代表的城市,但是并非所有人都能看懂代号的意思,所以我们需要将城市代号转换成所有人都能看得懂的城市名称,那么该怎么做呢?

 

 

4、步骤
首先我们来看下数据表中最原始的数据,如下图所示,我们可以看到数据表中只有城市代号和销售金额两个字段,那么要想实现城市代号转换成城市名称,需要对应转换。

 

 

创建自助数据集,并添加城市、销售额字段。
4.1 新增列
在新建的自助数据集中选择新增列,然后编辑公式:SWITCH(​城市​,"皖A","合肥","皖B","芜湖","皖C","蚌埠","皖D","皖南","皖E","马鞍山") ,并且将新增列类型选择字符串类型“文本”,如下图所示:

 

 

注:公式中“城市”并非手动输入,而是在左侧字段中单击选择,切记。  
4.2 数据预览
编辑完公式点击确定按钮,在预览数据框可以看到数据效果如下图所示:

 

 

单击右上角的保存按钮,并进行数据更新以后即可在前端分析的时候使用该城市名字段。
注:if函数也同样能实现相同的功能,但是if函数只适用于转换比较少的时候,转换多的情况下需要层层嵌套,很容易弄错,switch函数最大的好处是逻辑结构很清晰,不容易出错。二者可以根据实际情况选择使用。  
 
 
其他函数
1、版本
          FineBI版本        
         jar包版本          
  5.1
  2019.1.7
2、ISNULL
ISNULL(object):判断对象中所有的值是否全部都是NULL或者为空字符串。
3、NVL
NVL(value1,value2,value3,...):在所有参数中返回第一个不是null的值。value1:可以为任意数,也可以为null;value2:可以为任意数,也可以为null;当字符串长度为0时, 返回也为null。
示例:
NVL(12,20)等于12;
NVL(null,12)等于12;
NVL(null,null)等于null;
NVL(20,null)等于20;
NVL(null,null,10)等于10。
函数典型应用(待更新)
1、如何对有分隔符的字段计数
在数据处理的过程中可能会存在如下的数据,需要统计出每一个项目参与的人数。

 

 

此时,通过简单的计数无法得出正确的结果,我们可以通过创建自助数据集>新增列输入公式函数来获取,如下图:

 

 

点击确认后,查看获取的新增列结果:
待更新
2、转换字段为日期类型
当在数据库中保存的日期相关的数据为文本/数值类型时,该如何将其在FineBI中转换为日期类型呢?可以使用FineBI的TODATE函数。如下图,在自助数据集>新增列中选择todate函数填入。

 

 

点击确认后,查看新增的时间列字段。

 

 

3、获取月份/日期时显示两位
在使用函数month()或者是day()的时候,如果月份或日期是一位数,则显示出来的也只有一位数。比如说1月9号,获取月份时显示的是1,而不是01,获取日期时,显示的是9,而不是09,如果需要获取到01或者是09,这个该如何通过公式实现呢?
月份公式:=right(concatenate('0',MONTH(today())),2)
日期公式:=right(concatenate('0',day(today())),2)
公式理解:通过concatenate将获取到的月份前面拼接一个0,比如说11月,则显示011,如果是2月,则显示02,然后通过right方法,获取右边的2位数字,比如说2月,截取2位数字,则为02,比如12月,截取右边的两位,则为12。

 

自定义函数
1、描述
FineBI已经提供了大量的自带函数,在正常情况下足够满足用户的模板制作需求,但是在一些特殊领域,可能需要一些特殊的函数,在这种情况下,FineBI提供了自定义函数机制,可以由用户根据业务需要自己来定义一些函数,但这些函数必须满足FineBI函数定义规则。
FineBI函数定义规则:Functionname(Para,Para,...),其中Functionname为函数名,Para为参数。
在FineBI中,每一个函数都被定义成一个类,这个类必须要实现Function这个接口,在运算的时候首先通过函数名反射取得这个类,然后调用它的run(Object[] agrs)方法。下面以SUM这个函数为例。
2、SUM函数原理
由程序可以看到,SUM类用来运算SUM函数,他继承了AbstractFunction类,而AbstractFunction实现了Function这个接口。
当函数运算的时候,先根据函数名取得运算该函数的类,如SUM(2,4,true)这个函数先根据函数名取得SUM这个类,然后调用SUM类的run(Object[] args)方法,args中存放的是SUM函数的参数,运算的时候可以从args中取得参数进行运算。如执行结果为SUM(2,4,true)=2+4+1=7。
SUM函数所使用代码:
  1. package com.fr.report.script;    
  2.     
  3. import com.fr.general.FArray;    
  4.     
  5. import com.fr.script.AbstractFunction;    
  6.     
  7. public class CSUM extends AbstractFunction {    
  8.     public Object run(Object[] args) {    
  9.         double result = 0;    
  10.         for (int i = 0; i < args.length; i++) {    
  11.             if (args[i] == null) {    
  12.                 continue;    
  13.             }    
  14.             result += parseObject(args[i]);    
  15.         }    
  16.         return result;    
  17.     }    
  18.     private double parseObject(Object obj) {    
  19.         if (obj instanceof Number) {    
  20.             return ((Number) obj).doubleValue();    
  21.         } else if (obj instanceof Boolean) {    
  22.             return ((Boolean) obj).booleanValue() ? 1 : 0;    
  23.         } else if (obj instanceof FArray) {    
  24.             FArray array = (FArray) obj;    
  25.             double sum = 0;    
  26.             for (int i = 0; i < array.length(); i++) {    
  27.                 sum += parseObject(array.elementAt(i));    
  28.             }    
  29.             return sum;    
  30.         } else if (obj != null) {    
  31.             try {    
  32.                 return Double.parseDouble(obj.toString());    
  33.             } catch (NumberFormatException exp) {    
  34.                 return 0;    
  35.             }    
  36.         }    
  37.         return 0;    
  38.     }    
  39. }    
下面以一个简单的自定义函数例子来说明使用自定义函数。我们定义一个函数StringCat,他的作用是把所有的参数以字符串的形式连接起来。
StringCat函数使用规则为StringCat(Para,Para,Para…….);
其中Para为该函数的参数,个数不限。
由概述可知AbstractFunction实现了Function这个接口,因此StringCat可以直接继承AbstractFunction类,完整代码如下:
  1. package com.fr.function;    
  2.     
  3. import com.fr.script.AbstractFunction;    
  4.     
  5. public class StringCat extends AbstractFunction {    
  6.     public Object run(Object[] args) {    
  7.         String result = "";    
  8.         Object para;    
  9.         for (int i = 0; i < args.length; i++) {    
  10.             para = args[i];    
  11.             result += para.toString();    
  12.         }    
  13.         return result;    
  14.     }    
  15. }    
说明: 使用函数StringCat(Para,Para,Para…..)时,根据函数名取得运算该函数的类StringCat,并将参数传入类中的args对象数组中,执行该类的run函数。 而在run函数中即实现了将传入的参数以字符串的形式连接起来。并返回最终形成的字符串。
3、实现步骤
3.1 编译自定义函数
将编译后的StringCat.class放到FineBI的安装目录WEB-INF下面的classes目录下,因为StringCat.java属于包com.fr.function,所以StringCat.class需要放到%FineBI%\webapps\webroot\WEB-INF\classes\com\fr\function目录下。如下图:
注:若WEB-INF下没有对应目录则新建即可。  

 

 

3.2 注册自定义函数
生成该函数的类后需要在设计器中进行注册,才可以使用该函数。参考设计器远程连接方法及步骤使用设计器远程连接FineBI工程,打开服务器>函数管理器,选择刚刚定义好了StringCat类,如下图:

 

 

函数名称可以自定义,如这边定义为StringCat;
同时可以添加该函数的使用说明,如上图所示的描述。
3.3 使用自定义函数
注册好自定义函数后,在FineBI中便可直接使用了,使用方法与内置的函数是相同的。
比如我们在添加计算指标中,其他函数下面可以看到之前自定义的函数Stringcat,点击该函数可添加到公式中使用,如下图:

 

 

根据函数自定义用法编辑公式使用即可。
注:在BI中使用自定义公式的时候,需要对公式中的字段进行类型转换。因为自定义函数在获取参数时,默认处理为sting类型,对于其他类型的字段就需要使用类型转换函数进行转换。  
比如我们使用判断是否为节假日的自定义函数IsHoliday,在函数使用时直接添加字段IsHoliday(注册时间),会提示公式不合法,如下图:

 

 

需要在注册时间字段前加上字段类型转换函数todate,将其转换为时间字段,该公式即合法,如下图:

 

posted @ 2022-07-18 09:49  倾晴雨轩  阅读(11639)  评论(0编辑  收藏  举报