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

1. 概述

Smartbi提供服务端宏功能,服务端宏表示宏的事件在服务端(应用服务器)进行处理,所以可以实现客户端宏不能实现的效果(如报表导出生效等)。在Smartbi中,只为【多维分析】【电子表格】【透视分析】提供了服务端处理的事件(服务端宏创建方式可见:报表宏创建方式)。

服务端宏底层原理和自定义计划任务脚本一样的,都是使用了 Rhino 工具包,语法遵循Javascript 语法规范,能够引用 Java 类并创建 Java 对象来使用,详细的语法说明见自定义计划任务

注意:服务端宏因为在服务器上运行,对浏览器端展现和导出报表都是生效的,如下图。

2. 服务端宏事件

ServerSide服务端模块

spreadsheetReport(电子表格报表对象)

spreadsheetReport:电子表格报表对象。

对应事件

对应事件说明

onBeforeOutput

· 事件原型:function main(spreadsheetReport) {}

· 事件说明:在电子表格生成输出的html之前触发,实现此事件可以改写电子表格输出结果。

· 参数说明: 

o spreadsheetReport:电子表格对象

· 参考示例:电子表格服务端宏示例

INSIGHT(透视分析报表对象)

INSIGHT:透视分析报表对象。

对应事件

对应事件说明

beforeBuildHTML

· 事件原型:function main(insightCellList) {}

· 事件说明:在透视分析生成输出的html之前触发,实现此事件可以改写透视分析的数据输出结果

· 参数说明: 

o insightCellList:透视分析表格对象

· 参考示例:透视分析删除特定行

olapTable(多维分析表格对象)

olapTable:多维分析报表表格对象。

对应事件

对应事件说明

onRenderTable

· 事件原型:function main(olapTable) {}

· 事件说明:在打开多维分析报表初始化完成后或多维分析报表数据刷新后触发,可以使用多维分析的跳转规则生成一个看示例效果

· 参数说明: 

o olapTable:多维分析表格对象

olapQuery(多维分析报表对象)

olapQuery:多维分析报表对象。

对应事件

对应事件说明

onWarning

· 事件原型:function main(reportResult) {}

· 事件说明:在多维分析报表加载告警信息时触发。可以设置一个多维分析告警,然后查看对应的宏示例(多维告警会生成这个事件的宏)

· 参数说明: 

o reportResult:多维分析表格对象

3. 服务端宏对象

对于初学者,主要根据“帮助”栏提供的API使用宏对象。

以电子表格服务端宏为例:

  • HO_Application下的为全局对象,可直接在服务端宏中使用
  • logger对象用于打印日志,方便调试,其对应HO_Logger
  • spreadsheetReport对象为电子表格服务端宏对象,其对应HO_SpreadsheetReport
  • HO_SpreadsheetReport的sheets属性对HO_Spreadsheet数组
  • HO_Spreadsheet的getCell()方法可以获取HO_SpreadsheetReportCell

4. 服务端宏调试

  • 在宏脚本中使用"logger"对象打印日志信息。
  • 打开宏控制台观察日志。入口:系统运维 -> 调试工具集(在更多工具中)-> 宏控制台
  • 执行报表后,在宏控制台观察日志

5. 服务端宏示例

    示例需求:添加报表水印,需对导出生效。

    需求是添加水印并对导出生效,因为要对导出生效,所以选择服务端宏,在服务端处理时就给报表添加水印,具体代码如下:

报表水印
//类型:ServerSide		对象:spreadsheetReport		事件:onBeforeOutput
var Color = Packages.java.awt.Color;
var Font = Packages.java.awt.Font;
var Graphics = Packages.java.awt.Graphics;
var BufferedImage = Packages.java.awt.image.BufferedImage;
var BufferedOutputStream = Packages.java.io.BufferedOutputStream;
var FileOutputStream = Packages.java.io.FileOutputStream;
var JPEGCodec = Packages.com.sun.image.codec.jpeg.JPEGCodec;
var JPEGImageEncoder = Packages.com.sun.image.codec.jpeg.JPEGImageEncoder;
var ImageIO = Packages.javax.imageio.ImageIO;
var ByteArrayOutputStream = Packages.java.io.ByteArrayOutputStream;
var Graphics2D = Packages.java.awt.Graphics2D;

function main(spreadsheetReport) {
    var str = "报表水印"; //设置水印文字内容
    var sheetName = "Sheet1"; //Sheet页名称
    var fontFamily = "华文彩云"; //水印字体
    var imageWidth = 600; // 图片的宽度    
    var imageHeight = 1000; // 图片的高度   
    var fontWidth = 150; //文字宽度
    var workbook = spreadsheetReport.workbook;
    var worksheet = workbook.getWorksheets().get(sheetName);
    var type = spreadsheetReport.outputType;

    logger.info("outputType=" + type);

    if (type == "PRINT" || type == "EXCEL2007" || type == "HTML" || type == "PDF" || type == "refresh") { //打印时
        var image = graphicsGeneration(str, imageWidth, imageHeight, fontFamily, fontWidth);
        worksheet.setBackgroundImage(image);
    } else {
        worksheet.setBackgroundImage(null);
    }
}

function graphicsGeneration(drawStr, imageWidth, imageHeight, fontFamily, fontWidth) {

    var yblank = 80; //设置纵向文字间隔

    var fontSize = 15; //水印文字大小

    var color = new Color(0xFF7F24, false); //设置水印文字颜色,第一个参数为16位RGB颜色值

    var angle = 315; //设置水印倾斜角度

    var image = new BufferedImage(imageWidth, imageHeight,
        BufferedImage.TYPE_INT_RGB);
    var graphics = image.getGraphics();
    graphics.setColor(Color.white);
    graphics.fillRect(0, 0, imageWidth, imageHeight);
    graphics.setColor(color);
    graphics.setFont(new Font(fontFamily, fontSize, fontSize));
    var g2d = graphics;
    var transWidth = imageWidth + 400;
    g2d.translate(-transWidth, imageHeight);
    g2d.rotate(angle * Math.PI / 180); //设置水印倾斜角度
    var x = 15;
    var y = yblank;
    for (var k = 0; k < 30; k++) {
        for (var j = 0; j < 12; j++) {
            graphics.drawString(drawStr, x, y);
            x += fontWidth;
        }
        x = 15;
        y += yblank;
    }
    var out = new ByteArrayOutputStream();
    var flag = ImageIO.write(image, "jpg", out);
    var b = out.toByteArray();
    return b;
}

    执行效果如下,对报表展现和导出Excel均生效:

    


    更多服务端宏示例详见:服务端宏示例

6. 视频教学

    视频教学点击下载:服务端宏基础服务端宏实战

    视频配套资源下载:服务端宏示例


  • 无标签