脚本示例
报表表达式实用示例:日期处理、数字格式化、空值处理、集合操作、条件显示、单元格引用等
日期范围查询
// 获取本月第一天和最后一天(字符串)
var start = monthStart(now(), "yyyy-MM-dd");
var end = monthEnd(now(), "yyyy-MM-dd");
start + " ~ " + end
// => "2024-03-01 ~ 2024-03-31"
数字格式化
// 货币格式
formatNumber(1234567.89, "#,##0.00") + " 元"
// => "1,234,567.89 元"
// 百分比
percent(0.8756, 2)
// => "87.56%"
// 保留两位小数
round(3.14159265, 2)
// => 3.14
空值处理
// 为空时显示占位符
ifEmpty(value, "—")
// 链式判空
user?.department?.name ?: "未分配"
// 多字段拼接(跳过空值)
joinIfNotEmpty(" / ", dept, team, group)
集合操作
// 数据集字段求和
var data = dataset("orders", "amount");
sum(...data)
// 过滤并格式化
var names = dataset("employees")
.filter(r => r.status == "在职")
.map(r => r.name)
.join("、");
names
条件显示
// 三元运算符
score >= 60 ? "✓ 合格" : "✗ 不合格"
// 复杂条件
if (value == null || value == 0) {
return "—";
}
return formatNumber(value, "#,##0") + " 件";
序号生成
// 全局序号(简单行号)
seq()
// 带前缀的序号(补零到 4 位)
"NO." + concat("0000", seq()).right(4)
// => "NO.0001", "NO.0002", ...
使用报表参数
// 参数以 $参数名 形式访问
formatDate($startDate::date('yyyy-MM-dd'), "yyyy年MM月dd日") +
" 至 " +
formatDate($endDate::date('yyyy-MM-dd'), "yyyy年MM月dd日")
// 空值保护
$dept == null ? "全部部门" : $dept
单元格值加工($$value)
// $$value:当前单元格原始值的二次处理
$$value == null ? "—" : formatNumber($$value, "#,##0.00") + " 元"
// $$record:利用当前行其他字段
$$record.type == "退款" ? "-" + $$value : $$value
单元格引用与聚合
Sight Report 支持在表达式中直接引用其他单元格名称(如 A1、B2),引擎会自动根据父子扩展关系定位正确的数据行。
// B2 是数据扩展列,在其父格 A2 中汇总
sum(B2) // B2 所有扩展行之和
avg(B2) // 平均值
// 引用区域
sum(B2:B10)
// 通过 & 获取扩展序号(行号)
&A1 // => 1, 2, 3 ...
// 全局/分组自增序号
seq() // => 1, 2, 3 ...
seq("group") // 分组内序号
读取自定义配置
// 访问管理员在「脚本配置」中定义的键值对
$$config.companyName + " - 销售报表"
// 带默认值保护
ifEmpty($$config.reportTitle, "业务汇总")
日期差值计算
// 计算工龄(年)
var years = betweenYears(toDate($hireDate, "yyyy-MM-dd"), now());
years + " 年"
// 计算账期(天)
var days = betweenDays(toDate($startDate, "yyyy-MM-dd"), now());
days + " 天"
人民币大写
numberToRMB(123456.78)
// => "壹拾贰万叁仟肆佰伍拾陆圆柒角捌分"
当前页/总页数
page() + " / " + pageCount()
进阶示例
编码 → 名称映射
var map = {"1": "待付款", "2": "已付款", "3": "已发货"};
map[$$value::string] ?: "未知"
季度账期
"Q" + quarter(now()) + "(" +
formatDate(quarterStart(now()), "MM-dd") + " ~ " +
formatDate(quarterEnd(now()), "MM-dd") + ")"
环比(引用上一行)
var prev = cellOffset("C2", -1, 0);
isNull(prev) || prev == 0 ? "—" : percent((C2 - prev) / prev, 1)
金额大写(中文)
toChineseAmount($$value) // 123.45 → "壹佰贰拾叁元肆角伍分"
更多实战
集合分组汇总
// 各部门金额合计
dataset("sales").group(r => r.dept, g => g.map(x => x.amount).sum())
去重 / 排序取名
// 不重复客户,顿号连接
dataset("orders").map(r => r.customer).distinct().join("、")
// 金额从高到低的客户名
dataset("orders").sort((a,b) => b.amount - a.amount).map(r => r.customer)
字符串处理(脱敏 / 补零 / 截断)
// 手机号脱敏
var p = $$value::string;
length(p) == 11 ? left(p, 3) + "****" + right(p, 4) : p
// 编号补零到 6 位
"NO." + right(concat("000000", $$value), 6)
// 超长截断加省略号
var s = $$value::string;
length(s) > 10 ? left(s, 10) + "…" : s
健壮的多步脚本(空值 / 类型安全)
var v = $$value;
if (isNull(v)) return "—";
var n = v::double(0); // 转数字,失败取 0
return n < 0 ? "亏损 " + numberToRMB(abs(n))
: numberToRMB(n);