1. 描述
在对数据进行填报的时候,经常会需要使用 JavaScript 对一些功能进行二次开发,比如说设置填报单元格是否可以编辑,给单元格控件进行赋值等等。
和 参数面板 类似,首先需要获取 填报预览 下的控件或者单元格,才能对其进行各种方法操作。
不同于参数界面 JavaScript 的是:填报页面下有一个特殊性,既有单元格又有控件,通过控件来输入数据,编辑数据,控件编辑结束之后,会自动将值传递给控件所在的单元格,所以 JavaScript 获取的时候即可获取到单元格也可以获取到控件,获取单元格只能取值和赋值。
2. 单元格
2.1 获取单元格的值
获取填报页面的单元格的值,有以下几种方法:
contentPane.getCellValue(sheet号,列号,行号); //sheet号行号列号是从0开始
contentPane.curLGP.getCellValue(列号,行号);
contentPane.curLGP.getCellValue(单元格);
contentPane.curLGP._get$TDCell(col,row).text()//获取单元格显示值
contentPane.curLGP._get$TDCell(单元格).text()
由于单元格可以设置形态来改变其显示值,故 JavaScript 获取单元格有获取实际值和显示值的区分。
注:使用 contentPane.curLGP.getCellValue(列号,行号)获取值时不能使用 contentPane.curLGP.getCellValue(列号,“A1”)这种形式,可先将 A1 单元格值赋给一个变量再用变量替换。
2.2 给单元格赋值
赋值的方式也分为赋显示值和赋实际值,如下:
contentPane.setCellValue(sheet号,列号,行号,值); //sheet号行号列号是从0开始
contentPane.curLGP.setCellValue(列号,行号,值);//给单元格赋显示值,非实际值,不能提交入库
contentPane.curLGP.setCellValue(单元格,null,值);//给单元格赋显示值,非实际值,不能提交入库
contentPane.setCellValue(列号,行号,值);//给单元格赋实际值,可以提交入库
contentPane.setCellValue(单元格,null,值);//给单元格赋实际值,可以提交入库
2.3 获取当前单元格行列号
上述给取单元格的值和赋值均是确切知道单元格行列号的,那么,如果单元格行列号是动态的,比如说,修改当前编辑行的单元格的值,那么怎么才能定位到该单元格呢?其 JavaScript 代码如下:
contentPane.curLGP.getTDRow(contentPane.curLGP.currentTDCell)//获取行号
contentPane.curLGP.getTDCol(contentPane.curLGP.currentTDCell)//获取列号<br>
2.4 单元格行列号和单元格的转换
1)行列号转换为单元格
能够获取到一个行号 row 和一个列号 col,希望得到该行列号对应的单元格,JavaScript 代码如下:
FR.columnRow2CellStr({col:1, row:0});//该公式的返回值为B
2)单元格转换行列号
知道具体的单元格,希望得到定位该单元格的行列号,JavaScript 代码如下:
FR.cellStr2ColumnRow('B1');
3. 控件
获取填报页面的控件,首先要获取到当前的填报页面对象
3.1 获取填报页面控件
1)直接在FR模板中获取填报控件
首先获取到填报页面对象,直接在 FR 模板中使用 JavaScript,其填报页面对象直接使用 contentPane 即可获取到,那么获取控件的 JavaScript 为:
contentPane.getWidgetByName("widgetname");//根据控件名
contentPane.getWidgetByCell("Cell");//根据控件名所在位置
填报控件是与单元格绑定的,如果单元格可扩展,那么控件也可以扩展,故为扩展出多个同名的填报控件,类似这种获取多个同名控件的 JavaScript 方法为:
contentPane.getWidgetsByName("widgetname")
注:使用 contentPane.getWidgetsByName 的时候,返回的是数组。
2)在 Web 集成页面中获取 FR 填报控件
在 Web 页面中获取 FineReport 填报报表对象的 JavaScript 为:
document.getElementById('reportFrame').contentWindow.contentPane
那么其获取控件的 JavaScript 为:
document.getElementById('reportFrame').contentWindow.contentPane.getWidgetByName('widgetname')
获取多个同名控件的 JavaScript 代码为:
document.getElementById('reportFrame').contentWindow.contentPane.getWidgetsByName('widgetname')
注:其中 reportFrame 是 Web 页面中嵌入 FineReport 报表的 iframe
3.2 填报控件方法列表
获取到控件之后,需要对该控件进行再操作,可以获取其控件值,赋值,设置是否可见等等方法,如下列表:
方法名 | 方法 | 说明 |
取实际值 | Widget.getValue() | 获取控件实际值 |
取显示值 | Widget.getText() | 获取控件的显示值 |
赋实际值 | Widget.setValue() | 给参数控件赋值,不建议给填报控件赋实际值 |
赋显示值 | Widget.setText() | 给参数控件赋显示值 |
可见 | Widget.visible() | 设置控件可见 |
不可见 | Widget.invisible() | 设置控件不可见 |
是否可见 | Widget.isVisible(boolean) | 返回控件是否可见,返回 true 可见,false 不可见 |
设置可见 | Widget.setVisible(boolean) | 设置控件是否可见,参数为 true 可见,false 不可见 |
设置可用 | Widget.setEnable(boolean) | 设置控件是否可用,参数为 true 可用,false 不可用 |
是否可用 | Widget.isEnabled() | 返回控件是否可用,返回 true 可用,false 不可用 |
调用控件事件 | Widget.fireEvent(“事件名称”) | 设置控件触发指定名字的事件 |
其中 Widget 为获取到的控件
注:如果用 setValue()给下拉树赋值,需要添加一个 false 参数,即 setValue(value,false);value为需要赋给下拉树的值
提醒:填报页面上最后显示填报入库的值都是单元格的值,通过填报控件编辑数据,当编辑结束之后,控件会自动将值传递给当前单元格,故,如果通过 JavaScript 代码给控件赋值,只有被赋值的控件处于被编辑的状态时,最后才能在单元格中显示出来,如果控件处于非编辑状态,使用控件赋值,是不起作用的,所以,强烈建议用户在获取填报单元格的值或赋值的时候尽量使用 getCellValue 和 setCellValue
4. 示例链接
获取填报预览单元格应用请查看 获取填报预览单元格
给填报单元格赋值请查看 填报控件(单元格)赋值、给扩展单元格置数、给文本框赋多个值
JavaScript代码对填报数据进行校验请查看 JS 校验