示例说明
对电子表格报表进行回写时,经常会遇到如下这些需求。点击工具栏上的“添加行”按钮时,要求新插入行的某些单元格能自动赋值,比如让“序号”列值自增;或者“日期”字段自动插入当前系统时间;或者“信息录入人”字段自动插入当前登录用户名等。类似上述需求,皆可以参照如下方法进行设置。
本示例中,实现插入一行时,自动为序号赋值。
注:该方法适用于只插入一行数据的情况。
如需插入多行,可以网络搜索js代码生成UUID的方法,向单元格中插入UUID,即可保证插入数据不重复。
版本及客户端说明
1.smartbi版本:最新版本
2.客户端:PC
3.浏览器:IE11、谷歌浏览器(Chrome)、火狐浏览器(Firefox)
设置方法
1.创建回写电子表格
在电子表格设计器中(Microsoft Office Excel),创建回写电子表格报表,填报属性和回写规则可自由定义。
2.进入宏界面
在浏览器中,选中电子表格,右键选择 编辑宏 进入报表宏界面。
3.新建客户端宏
在报表宏界面新建客户端模块。在弹出的新建模块对话框中,选择对象为spreadSheetReport、事件为onWriteBackInsertedRow、并把下面宏代码复制到代码编辑区域,根据实际情况修改
宏类型
类型 | 对象 | 事件 |
---|---|---|
ClientSide | spreadsheetReport | onWriteBackInsertedRow |
宏代码
function main(spreadsheetReport, editingCellPosition) { var row = editingCellPosition.row;//行 var col = editingCellPosition.column;//列 //执行sql,获取序号 var newIdValue = getSqlResult(); //为新增的一行序号单元格赋值 //判断当前编辑的是否是"序号"所在的列,从0开始,所以B列的列序号是1 if (col == 1) { //这里填写的是点击插入单元格所在列 //以下col+0中的0填写的是自动赋值单元格所在列 spreadsheetReport.spreadsheetReportWriteBack.setWriteBackCellData(row + 1, col + 0, newIdValue, newIdValue); //此方法必须保证该单元格设置了填报属性 //如果填报属性设置了绑定参数,同时参数勾选了使用显示值,则在调用该方法时,需要多传递一个参数type,值为"PARAM_DISPLAY" //没有勾选使用显示值,则不用传递 spreadsheetReport.spreadsheetReportWriteBack.setWriteBackCellData(row + 1, col + 0, newIdValue, newIdValue, "PARAM_DISPLAY"); } } /** * 执行SQL语句,获取结果集 */ function getSqlResult() { var util = jsloader.resolve("freequery.common.util"); var ret = util.remoteInvoke("DataSourceService", "execute", ["DS.writeback", "select max(id) + 1 as t from user", 1000, true, false]); if (ret.succeeded && ret.result) { var data = ret.result.data; return data[0][0].value; } }
若是生成的uuid,不希望来源于数据库,可以通过Java方式获取到,如下:
function main(spreadsheetReport, editingCellPosition) { var row = editingCellPosition.row; //行 var col = editingCellPosition.column; //列 //执行sql,获取序号 var newIdValue = getUuid(); //为新增的一行序号单元格赋值 //判断当前编辑的是否是"序号"所在的列,从0开始,所以B列的列序号是1 if (col == 1) { spreadsheetReport.spreadsheetReportWriteBack.setWriteBackCellData(row + 1, col + 0, newIdValue, newIdValue); } } /** * 执行SQL语句,获取结果集 */ function getUuid() { var s = []; var hexDigits = "0123456789abcdef"; for (var i = 0; i < 36; i++) { s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); } s[14] = "4"; s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); s[8] = s[13] = s[18] = s[23] = "-"; var uuid = s.join(""); return uuid; }
关键对象总结
将数据值插入到到指定位置的回写单元格中:
setWriteBackCellData(row, column, value, displayValue);根据事件参数,获取到当前在编辑单元格的位置:editingCellPosition: {row, column}。
- 通过 SQL 语句获取插入值,请参考:宏代码中如何执行SQL语句。
资源下载
报表资源:添加新行自动为单元格赋值.xml
表sql:writeback.sql