页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

一、概述

1、电子表格宏简介

电子表格常用于制作自动化报表,在电子表格上配置的样式无法满足需求,或希望对报表进行特殊的调整时,比如调整展现样式,增加功能按钮等,都可以使用电子表格宏对报表进行处理。

2、操作入口

  • 资源树入口

    • Image Modified

  • excel入口

    • 需发布资源之后才能进行设置

    • Image Modified

  • 宏代码库

    • 路径:运维设置->全局资源定义->宏代码库

    • 能批量设置应用宏代码的报表,但是需要宏代码有较强的兼容性

    • Image Modified

二、电子表格宏模块

1、类型

  • 客户端宏

    • 客户端宏可以修改报表的展现效果,因为代码是在客户端浏览器端上运行,且仅在页面展示时生效,导出时不生效,所以称为客户端宏

  • 服务端宏

    • 服务端宏表示宏的事件在服务端(应用服务器)进行处理,所以可以实现客户端宏不能实现的效果,如报表导出生效等。

2、对象

  • 客户端宏

    • spreadsheetReport:电子表格对象

    • chart:图形对象

  • 服务端宏

    • spreadsheetReport:电子表格对象

3、宏事件

  • 客户端宏

spreadsheetReport:电子表格对象,提供8个宏事件

事件解释main函数参数
onRender每次刷新后spreadsheetReport:电子表格报表对象
onRenderReport()打开报表后spreadsheetReport:电子表格报表对象
onParamValueChanged修改参数值后spreadsheetReport:电子表格报表对象param:当前改变的参数对象
onLinkClick点击链接时spreadsheetReport:电子表格报表对象ruleName:跳转规则名称params: 报表参数
onChartClick点击图表时spreadsheetReport:电子表格报表对象spreadsheetReportChart:被点击图形名称,对象结构
onWriteBackInsertedRow插入行后spreadsheetReport:电子表格报表对象editingCellPosition:当前编辑单元格,对象结构{row:, column:}
onWriteBackCellValueChanged修改单元格值后spreadsheetReport:电子表格报表对象editingCellPosition:当前编辑单元格,对象结构{row:, column:}oldValue:修改前的值newValue:修改后的值newDisplayValue:修改后的显示值
onWriteBackSavedData保存回写数据后spreadsheetReport:电子表格报表对象succeeded:逻辑值,回写是否成功

chart:图形对象

事件解释
beforeRenderer图形渲染之前执行
afterRenderer图形渲染之后执行
pointClick点击图形对象时触发
  • 服务端宏

    • 不管选择什么宏事件main函数中仅有spreadsheetReport电子表格对象作为参数

事件解释适用场景
onBeforeOutput在输出结果前常用输出表格之前改写电子表格输出结果
onAfterGetGridData在获取数据后常用于获取数据之后对数据进行调整


三、电子表格宏示例

1、客户端宏

(1)需求场景

在电子表格数据查询时,为了限制查询的数据量通常会添加参数来限制数据查询,默认情况下参数切换时就会自动刷新数据,当查询较慢时也会影响体验,所以使用时会设置为手动刷新,当选择完所有的参数时再手动点击刷新。但是在集成到其他系统的场景时会将原本资源的工具栏隐藏,此时就希望能在参数面板上有一个刷新按钮,选择完参数之后进行刷新。

(2)html和css知识补充

在浏览器上展示的网页实际上是由html标签、css样式表、JS代码组成的。

  • htlm:浏览器上展示的内容需要html标签来承载,可以理解为网页的内容骨架

  • css样式表:样式表顾名思义是给html标签添加样式,如颜色、字体、显示位置等

  • JS代码:可以动态控制html和css,同时也可以处理于浏览器与用户交互的功能。

(3)代码示例
  • 宏模块

类型对象事件
ClientSide(客户端宏)spreadsheetReportonRenderReport(打开报表后)
  • 示例代码

代码块
languagejs
function main(spreadsheetReport) {
    // 获取电子表格参数面板
    var paramTable = spreadsheetReport.paramPanelObj.layoutTable;
​
    var lastCell;
    // 在参数同一行添加按钮
    for (i = 0; i < paramTable.rows.length; i++) {
        cell = paramTable.rows[i].insertCell(-1);
        if (i == paramTable.rows.length - 1)
            lastCell = cell;
    }
    
    if(!lastCell) {
        return;
    }
    
    if (!spreadsheetReport._newBtn) { // 不重复添加按钮
        // 创建按钮标签
        var input = document.createElement("INPUT");
        input.type = "button";
        input.value = "查询";
        input.title = "查询";
        input.style.width = "100px";
        input.style.height = "25px";
        var newBtn = lastCell.appendChild(input);
        spreadsheetReport.addListener(input, "click", doNewButtonClick,
            spreadsheetReport);
        spreadsheetReport._newBtn = newBtn;
    }
​
    // 新添加按钮Click事件处理函数
    function doNewButtonClick(e) {
        spreadsheetReport.doRefresh();
    }
}


  • 关键对象方法

    • 获取电子表格参数面板的dom元素:spreadsheetReport.paramPanelObj.layoutTable

    • 给某行参数后面新增一个单元格值:paramTable.rows[i].insertCell(-1)

    • 创建一个空按钮:document.createElement("INPUT")

    • 在新增的单元格里写入按钮的标签:lastCell.appendChild(input);

    • 给按钮添加点击事件:spreadsheetReport.addListener(input, "click", doNewButtonClick,spreadsheetReport);

    • 刷新电子表格:spreadsheetReport.doRefresh();

  • 参考示例

2、服务端宏

(1)需求场景

在电子表格开发过程中,通常会存在表格内某些字段的数据比较敏感,希望能限制用户只允许查看不允许导出,用来保护报表中的敏感数据不会被导出后随意传播。

(2)代码示例
  • 宏模块

类型对象事件
ServerSide(服务端宏)spreadsheetReportonBeforeOutput(在输出结果前)
  • 示例代码

代码块
languagejs
function main(spreadsheetReport) {
    //获取当前sheet,从0开始计数
    var sheet = spreadsheetReport.workbook.getWorksheets().get(0);
​
    var type = spreadsheetReport.outputType; //导出类型
    logger.info(type)
    if (type != "refresh") {
        sheet.cells.deleteColumn(3);
        sheet.cells.deleteColumn(3);
    }
}


  • 关键对象方法

    • 获取电子表格分组表sheet页:spreadsheetReport.workbook.getWorksheets().get(0)

    • 获取电子表格当前输出类型:spreadsheetReport.outputType

    • 删除整列数据:sheet.cells.deleteColumn(4)

  • 参考示例

四、电子表格宏接口

1、概述

  • 客户端宏

    • 客户端宏运行在浏览器的客户端,宏代码是用JavaScript来进行编写的,所以提供的接口也是JavaScript的接口。编写客户端宏时需要遵循JavaScript的语法规范

  • 服务端宏

    • 服务端宏使用了Rhino工具包,让产品的Java代码中可以运行写好的JavaScript程序,同时在JavaScript程序中也可以调用到Java类,其编写时也需要遵循JavaScript的语法规范。

2、客户端宏接口

接口文档:https://wiki.smartbi.com.cn//api/macroapi/

类名描述
application提供应用程序和当前会话的相关信息和功能访问接口,同时作为宏执行环境的顶层对象
chart图形渲染对象
chartView客户端图形浏览对象
event当前的事件对象
param参数对象
pointECharts图形点击对象
simpleReport即席查询对象
simpleReportContext即席查询的上下文对象
simpleReportGrid即席查询的表格对象
spreadsheetReport电子表格对象
spreadsheetReportChart电子表格Excel图形对象
spreadsheetReportChartPoint电子表格Excel图形数据点对象
spreadsheetReportCommand电子表格命令对象
spreadsheetReportWriteBack电子表格回写对象

包含关系图:

Image Modified

五、视频教学

宏代码简介:https://my.smartbi.com.cn/edu/course-133