文档首页 / 脚本示例

脚本示例

报表表达式实用示例:日期处理、数字格式化、空值处理、集合操作、条件显示、单元格引用等

日期范围查询

// 获取本月第一天和最后一天(字符串)
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 支持在表达式中直接引用其他单元格名称(如 A1B2),引擎会自动根据父子扩展关系定位正确的数据行。

// 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);
联系我们

请填写您的信息,我们将在 1 个工作日内与您联系。