示例说明
在固定式的电子表格中,有许多的行数据,当拥有不同角色的用户登录时,能够查看的行数据是不相同的。
比如,电子表格报表有很多的行数据,设计如下:
- 当"质量管理角色"用户登陆查看报表时,只展现的相对应内容:
- 当"人力角色"用户登录查看报表时,只展现的相对应内容:
实现步骤
- 打开电子表格设计器,在sheet1中实现报表,注:报表为固定式报表,并且存在行头,行头数据不由数据字段扩展得到。如图中C2至C12单元格。
- 切换到sheet,在A1单元格中填入角色1的名称,如"质量管理角色",并依次填入该角色可以查看的行的行头数据,如质量管理角色可以查看"检验报告编号"行、"产品名称"行、"产品型号"行和"检验类型"行。
- 切换到sheet3上,在A1单元格中填入角色2的名称,如"人力角色",并依次填入该角色可以查看的行的行头数据,如人力角色可以查看"检验报表编号"行、"主程序校验码"行、"主程序生成日期"行、"操作系统"行和"其他软件版本信息"行。
- 将sheet2和sheet3隐藏,并发布该电子表格报表。
- 在浏览器的资源定制节点下,选中电子表格,右键选择 编辑宏 进入报表宏界面。
- 在报表宏界面新建 服务端模块,在弹出的新建模块对话框中,选择对象为spreadsheetReport、对象为onRenderReport、事件为onBeforeOutput,把下面宏代码复制到代码编辑区域,并根据实际情况修改相应的宏代码。
宏对象
类型 | 对象 | 事件 |
---|---|---|
ServerSide | spreadsheetReport | onBeforeOutput |
宏代码
function main(spreadsheetReport) { spreadsheetReport.cacheable = false; //获取工作sheet var workbook = spreadsheetReport.workbook; var worksheet1 = workbook.getWorksheets().get(0); var src_cells1 = worksheet1.getCells(); var src_rows1 = src_cells1.rows.count; if (worksheet1 != null) { //获取当前用户 var user = spreadsheetReport.remoteInvoke("UserService", "getCurrentUser", "[]"); //通过名称获取角色 var role = spreadsheetReport.remoteInvoke("UserService", "getRoleByName", "[质量管理角色]"); var role2 = spreadsheetReport.remoteInvoke("UserService", "getRoleByName", "[人力角色]"); var usObj = eval('(' + user + ')'); var roObj = eval('(' + role + ')'); var roObj2 = eval('(' + role2 + ')'); var userId = usObj.result.id; var roleId = roObj.result.id; var roleId2 = roObj2.result.id; //通过用户ID和角色ID判断是否有这个角色 var flag = spreadsheetReport.remoteInvoke("UserService", "hasRoleByUserId", "[" + userId + "," + roleId + "]"); var flag2 = spreadsheetReport.remoteInvoke("UserService", "hasRoleByUserId", "[" + userId + "," + roleId2 + "]"); var f = eval('(' + flag + ')'); var f2 = eval('(' + flag2 + ')'); var f_obj = f.result; var f_obj2 = f2.result; //若用户拥有角色"质量管理角色" if (f_obj) { var worksheet2 = workbook.getWorksheets().get(1); //获取sheet2,从0开始计数 var src_cells2 = worksheet2.getCells(); var src_rows2 = src_cells2.rows.count; var role_value = src_cells2.get("A" + 1).getValue(); //获取A1单元格的值 //判断sheet2中A1单元格是否是"质量管理角色",并通过sheet2中该角色拥有的行,在sheet1中删除该角色没有权限的行 if (role_value == "质量管理角色") { var rows = {}; var columnIndex = 0; //该角色显示的行 for (var j = 1; j <= src_rows2; j++) { var v = src_cells2.get(j, columnIndex).getValue(); //从sheet2中A列的第二行开始,获取该角色拥有的行 if (v) { rows[v] = true; } } for (var i = src_rows1 - 1; i >= 2; i--) { //根据sheet2中A列角色拥有的行,设置sheet1中哪些行应该存在 var value = src_cells1.get(i, 2).getValue(); if (!rows[value]) { src_cells1.deleteRow(i); } } } } //判断sheet3中A1单元格是否是"人力角色",并通过sheet3中该角色拥有的行,在sheet1中删除该角色没有权限的行 if (f_obj2) { var worksheet3 = workbook.getWorksheets().get(2); var src_cells3 = worksheet3.getCells(); var src_rows3 = src_cells3.rows.count; var role_value3 = src_cells3.get("A" + 1).getValue(); if (role_value3 == "人力角色") { var rows = {}; var columnIndex = 0; //该角色显示的行 for (var j = 1; j <= src_rows3; j++) { var v = src_cells3.get(j, columnIndex).getValue(); if (v) { rows[v] = true; } } for (var i = src_rows1 - 1; i >= 2; i--) { var value = src_cells1.get(i, 2).getValue(); if (!rows[value]) { src_cells1.deleteRow(i); } } } } } }
资源下载
报表资源:migrate.xml