finereport内置js如何实现数据查询,有哪些常用方法
- 云服务器
- 2026-07-24
- 5
全局对象 FR
FineReport 内置了一个全局的 FR 对象,封装了常用的系统级方法,可在任意 Web 端事件中直接调用。
| 方法 | 说明 | 示例 |
|---|---|---|
| FR.Msg.alert(title, msg) | 弹出提示框 | FR.Msg.alert(“提示”, “保存成功”) |
| FR.Msg.confirm(title, msg, callback) | 弹出确认框,回调中处理确认逻辑 | FR.Msg.confirm(“警告”, “确认删除?”, function(v){}) |
| FR.Msg.toast(msg) | 右下角轻提示 | FR.Msg.toast(“加载完成”) |
| FR.remoteEvaluate(formula) | 远程调用服务器端公式并返回结果 | FR.remoteEvaluate(“=sum(A1:A10)”) |
| FR.location | 获取或设置当前页面 URL | FR.location = “/webroot/decision” |
contentPane 对象
contentPane 是报表内容面板的核心对象,几乎覆盖了报表交互开发的所有场景,可在「Web 端事件」「单元格 Web 属性事件」「参数面板事件」中使用。
数据读写
| 方法 | 说明 | 示例 |
|---|---|---|
| contentPane.getCellValue(cell) | 获取单元格值 | contentPane.getCellValue(“A1”) |
| contentPane.setCellValue(cell, value) | 设置单元格值 | contentPane.setCellValue(“A1”, 100) |
| contentPane.getCellValue(col, row) | 按行列号获取值 | contentPane.getCellValue(0, 0) |
| contentPane.setCellValue(col, row, value) | 按行列号设置值 | contentPane.setCellValue(0, 0, “abc”) |
控件操作
| 方法 | 说明 | 示例 |
|---|---|---|
| contentPane.getWidgetByName(name) | 按名称获取控件对象 | contentPane.getWidgetByName(“combo”) |
| widget.getValue() | 获取控件值 | var v = widget.getValue() |
| widget.setValue(val) | 设置控件值 | widget.setValue(“北京”) |
| widget.setVisible(true/false) | 设置控件可见性 | widget.setVisible(false) |
| widget.setEnable(true/false) | 设置控件是否可用 | widget.setEnable(false) |
报表操作
| 方法 | 说明 |
|---|---|
| contentPane.gotoFirstPage() | 跳转首页 |
| contentPane.gotoLastPage() | 跳转末页 |
| contentPane.gotoPage(n) | 跳转第 n 页 |
| contentPane.printPreview() | 打印预览 |
| contentPane.exportReport() | 导出报表 |
| contentPane.refresh() | 刷新报表 |
| contentPane.parameterCommit() | 提交参数查询 |
事件绑定
通过 contentPane.on(eventName, callback) 可以绑定以下常用事件:
| 事件名 | 触发时机 |
|---|---|
| afterload | 报表加载完成后触发 |
| cellselect | 选中单元格时触发 |
| cellclick | 点击单元格时触发 |
| beforeprint | 打印前触发 |
| afterprint | 打印后触发 |
示例:
contentPane.on("cellselect", function() { var col = contentPane.curCell.getColumn(); var row = contentPane.curCell.getRow(); var val = contentPane.getCellValue(col, row); FR.Msg.toast("选中单元格值:" + val); });
this 对象
在控件事件或单元格事件中,this 指向当前控件或当前对象本身。
| 属性/方法 | 说明 | 适用场景 |
|---|---|---|
| this.options.form | 获取当前表单对象 | 决策报表(frm)中 |
| this.getValue() | 获取当前控件值 | 控件事件中 |
| this.setValue(val) |
设置当前控件值
| 控件事件中 |
| this.setVisible(b) | 设置当前控件可见性 | 控件事件中 |
| this.options.location | 获取当前单元格位置信息 | 单元格事件中 |
| 方法 | 说明 | 示例 |
|---|---|---|
| this.options.form.getWidgetByName(name) | 获取参数面板控件 | this.options.form.getWidgetByName(“city”) |
| contentPane.parameterEl | 获取参数面板元素对象 | contentPane.parameterEl.getWidgetByName(“city”) |
| _g().parameterCommit() | 触发参数查询(全局写法) | _g().parameterCommit() |
决策报表(frm)专用
决策报表中使用 _g() 获取报表全局对象,常用方法如下:
| 方法 | 说明 |
|---|---|
| _g().getWidgetByName(name) | 获取 body 中的控件 |
| _g().getWidgetByCell(name) | 获取单元格中的控件 |
| _g().parameterCommit() | 提交参数 |
| _g().loadParameter() | 加载参数面板 |
常用场景示例
根据下拉框值动态控制控件可见性
var region = this.getValue(); var cityWidget = this.options.form.getWidgetByName("city"); if (region == "华东") { cityWidget.setVisible(true); } else { cityWidget.setVisible(false); }
点击单元格弹出确认框并跳转
contentPane.on("cellclick", function() { var cellVal = contentPane.getCellValue(contentPane.curCell); FR.Msg.confirm("提示", "确认查看 " + cellVal + " 详情?", function(isConfirm) { if (isConfirm) { FR.location = "/webroot/decision/url/report?name=" + cellVal; } }); });

报表加载后自动填充单元格
contentPane.on("afterload", function() { var today = new Date().toLocaleDateString(); contentPane.setCellValue("A1", today); });
注意事项
- FR.remoteEvaluate 调用公式时需以 开头,且服务器端需开启「公式服务」。
- contentPane 仅在 CPT 报表中可用,决策报表(frm)中应使用 _g()。
- 控件事件中 this 指向控件本身,单元格事件中 this 指向单元格对象,需注意区分。
- 使用 setCellValue 修改值后,若需触发计算,需手动调用 contentPane.refresh() 或相关重算方法。
- 内置 JS 方法区分大小写,如 getCellValue 不可写成 getcellvalue。
相关问题与解答
在 FineReport 决策报表(frm)中如何获取 body 上的控件并设置其值?
在决策报表中,使用 _g().getWidgetByName("控件名") 获取 body 上的控件,然后调用 setValue() 方法设置值,示例代码如下:
var widget = _g().getWidgetByName("title_label"); widget.setValue("2024年度销售报表");
如果是在参数面板的控件事件中,也可以使用 this.options.form.getWidgetByName("控件名") 来获取参数面板上的控件。
FR.remoteEvaluate 调用数据集函数时返回值为空,可能的原因有哪些?
可能的原因包括:
- 公式未以 开头,正确写法应为 FR.remoteEvaluate("=ds1.select(字段名)")。
- 服务器端未开启公式服务,需在「服务器 → 服务器配置 → 公式配置」中检查。
- 数据集名称或字段名称拼写错误,需与模板数据集定义一致。
- 调用的公式中使用了不可用的函数或存在权限限制,建议在服务器端日志中查看具体报错信息。
- 如果在分页预览或数据分析模式下,部分公式可能不可用,需确认调用场景是否支持。

