示例说明
在固定式的电子表格中,有许多的行数据,当拥有不同角色的用户登录时,能够查看的行数据是不相同的。
比如,电子表格报表有很多的行数据,设计如下:
- 当"质量管理角色"用户登陆查看报表时,只展现的相对应内容:
- 当"人力角色"用户登录查看报表时,只展现的相对应内容:
实现步骤
- 打开电子表格设计器,在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
borderColor | #BBBBBB |
---|---|
bgColor | #F0F0F0 |
borderWidth | 1 |
borderStyle | solid |