页面树结构
转至元数据结尾
转至元数据起始

提示:本文档的示例代码仅适用于本文档中的示例报表/场景。若实际报表/场景与示例代码无法完全适配(如报表使用冻结,或多个宏代码冲突等),需根据实际需求开发代码。

示例说明

在固定式的电子表格中,有许多的行数据,当拥有不同角色的用户登录时,能够查看的行数据是不相同的。

比如,电子表格报表有很多的行数据,设计如下:

  • 当"质量管理角色"用户登陆查看报表时,只展现的相对应内容:

  • 当"人力角色"用户登录查看报表时,只展现的相对应内容:

实现步骤

  1. 打开电子表格设计器,在sheet1中实现报表,注:报表为固定式报表,并且存在行头,行头数据不由数据字段扩展得到。如图中C2至C12单元格。


  2. 切换到sheet,在A1单元格中填入角色1的名称,如"质量管理角色",并依次填入该角色可以查看的行的行头数据,如质量管理角色可以查看"检验报告编号"行、"产品名称"行、"产品型号"行和"检验类型"行。


  3. 切换到sheet3上,在A1单元格中填入角色2的名称,如"人力角色",并依次填入该角色可以查看的行的行头数据,如人力角色可以查看"检验报表编号"行、"主程序校验码"行、"主程序生成日期"行、"操作系统"行和"其他软件版本信息"行。


  4. 将sheet2和sheet3隐藏,并发布该电子表格报表。
  5. 在浏览器的资源定制节点下,选中电子表格,右键选择 编辑宏 进入报表宏界面
  6. 在报表宏界面新建 服务端模块,在弹出的新建模块对话框中,选择对象为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