行表达式

1 行表达式的作用

在加工/整理/计算数据、或生成数据图时,可以使用表达式来构造数据值:以JavaScript代码实现计算逻辑、以数据列名为参数。

2 编辑行表达式

  1. 若脚本为空,则返回空字符串。

  2. 脚本可以包含Nashorn可以解析的任何合法元素(ECMAScript 5.1)。

  3. 脚本应当最终是一个数值。

  4. 脚本可以包含以下占位符:(占位符相当于脚本的变量名)

    #{表行号}
    #{数据行号}
    #{<列名>}
    #{<列名>-<统计名>}

  5. 界面提供按钮列出所有合法的占位符、以方便粘贴。

  6. 悬停或点击按钮"示例",可以粘贴示例代码。

  7. 悬停或点击按钮"历史",可以粘贴历史代码。

  8. 点击按钮"脚本"以从树“JavaScript”中复制代码。

  9. 点击按钮"选择"以从树“行表达式”中复制代码。

  10. 点击按钮"保存"以把当前表达式写入树“行表达式”中。

3 计算行表达式

在MyBox计算表达式时:

  1. 占位符被内部变量替换,然后内部变量被映射为每行中列的实际数据值。

  2. 统计值是用所有数据来计算的。

  3. 当处理所有数据时,若脚本包含"#{表行号}"则它会失败。

4 行表达式的示例

行表达式 含义
#{数据行号} 整个数据的行号
#{表行号} 当前页的行号
Math.abs(#{数字列1}) + Math.PI * Math.sqrt(#{数字列2}) 数学计算
#{数字列1} - #{数字列2-均值} "数字列1"的值与"数字列2"的平均值之间的差值
if ( #{字符串列} != null ) 
    #{字符串列}.length
else
    -1
"字符串列"值的长度
if ( #{字符串列} != null ) 
    #{字符串列}.replace(/hello/ig,'Hello')
else
    null
把"字符串列"的值中所有"hello"(忽略大小写)替换"Hello"
if ( #{字符串列} != null ) 
    #{字符串列}.toLowerCase()
else
    null
"字符串列"值的小写
if ( #{字符串列} != null ) 
    #{字符串列}.split(',')
else
    null
把"字符串列"的值按逗号分隔
function formatDate(date) {
     var y = date.getFullYear();
     var m = date.getMonth() + 1;
     m = m < 10 ? ('0' + m) : m;
     var d = date.getDate();
     d = d < 10 ? ('0' + d) : d;
     var h =date.getHours();
     h = h < 10 ? ('0' + h) : h;
     var M =date.getMinutes();
     M = M < 10 ? ('0' + M) : M;
     var s =date.getSeconds();
     s = s < 10 ? ('0' + s) : s;
     return y + '-' + m + '-' + d + ' ' + h + ':' + M + ':' + s;
}
if (#{时间列} != null)
   formatDate(new Date(#{时间列}));
else
   null;
格式化"时间列"的值
if ( #{时间列} != null ) 
    new Date(#{时间列}).getFullYear()
else
    null
"时间列"值的年份

行过滤

1 行过滤的作用

“行过滤"是特殊的"行表达式”,用来作为过滤数据行的条件:

  1. 当脚本为空时,表示不过滤,所有行都通过。

  2. 脚本应当最终是一个布尔值(“true"或"false”)。
    用户可以选择当值为true或false时通过行。

  3. 若脚本值既不是true也不是false, 如脚本错误的情形,则此行不通过。

2 编辑行过滤

可以设置取用数据的最多行数。

3 行过滤的示例

行过滤 含义
#{数据行号} % 2 == 0 数据行号为偶数
#{表行号} % 2 == 1 当前页的奇数行
!isNaN(#{某列} - 1) "某列"的值是数字
#{数字列} > 7 "数字列"的值大于7
#{数字列1} - #{数字列2} < 100 "数字列1"与"数字列2"的值差小于100
#{数字列1} < #{数字列2-均值} "数字列1"的值小于"数字列2"的平均值
#{字符串列} == '' "字符串列"的值为empty
#{字符串列} != null "字符串列"的值不为null
if ( #{字符串列} != null ) 
    #{字符串列}.length > 9
else
    undefined
"字符串列"值的长度大于9
if ( #{字符串列} != null ) 
    #{字符串列}.search(/Hello/ig) >= 0
else
    undefined
"字符串列"的值包含字符串"Hello"(忽略大小写)
if ( #{字符串列} != null ) 
    #{字符串列}.startsWith('Hello')
else
    undefined
"字符串列"的值以"Hello"开头
if ( #{字符串列} != null ) 
    var array = [ 'A', 'B', 'C']; array.includes(#{字符串列})
else
    undefined
"字符串列"的值为’A’或’B’或’C’
if ( #{时间列} != null ) 
    #{时间列}.startsWith('2016-05-19 09')
else
    undefined
"时间列"值的月份是'2016-05-19 09'
if ( #{时间列} != null ) 
    new Date(#{时间列}).getTime() > new Date('2016/05/19 09:23:12').getTime()
else
    undefined
"时间列"的值晚于’2016/05/19 09:23:12’
if ( #{时间列} != null ) 
    new Date(#{时间列}).getDay() == 0
else
    undefined
"时间列"的值是星期日