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

1、简介

项目上往往对报表展现存在特殊需求,如隐藏报表中的某列。 系统提供以下方式解决:用Java开发一个"报表扩展类"来完成,其原理类似Java web开发中的filter,在报表展现时,会执行相应的扩展类。系统提供接口类 ISDKHTMLGeneratorEx 供实现此类扩展开发。

文档目录:

需实现的接口方法说明如下:

  • accept:用于判断该过滤器是否生效。例如我们可能只针对某个报表才激活该过滤器,可以通过reportName或者reportId去判断。
  • doHtmlGeneratorBeforeExtend:在报表展现之前,修改报表样式。


2、示例说明

下面将以"如何隐藏报表字段"的例子来演示如何用java开发一个修改报表样式的例子。

 

3、操作步骤

1、打开服务器部署文件smartbi.war,解压后将smartbi.war\WEB-INF\lib\目录下的 smartbi-FreeQuery.jar、 smartbi-Common.jar包加入到插件包项目的classpath中去。
2、撰写报表过滤器类FilterFieldsAndData.java,实现接口ISDKHTMLGeneratorEx。

package bof.ext.sample9_10;
  
import java.util.List;
import smartbi.freequery.client.simplereport.ClientReportService;
import smartbi.freequery.client.simplereport.ClientReportView;
import smartbi.freequery.extension.ISDKGridData;
import smartbi.freequery.extension.ISDKHTMLGeneratorEx;
import smartbi.freequery.querydata.CellData;
import smartbi.freequery.report.ReportField;
import smartbi.freequery.report.SimpleReportBO;
  
public class FilterFieldsAndData implements ISDKHTMLGeneratorEx {
    public void doHtmlGeneratorBeforeExtend(ClientReportView view, ISDKGridData gridData) {
        SimpleReportBO simpleReportBO = ClientReportService.getInstance().getReportObject(view.getClientId());
        List<ReportField> allFields = simpleReportBO.getAllFields();
        int colIndex = -1;
        for (int i = 0; i < allFields.size(); i++) {
            ReportField field = allFields.get(i);
            String alias = field.getAlias();
            if (alias.equals("产品名称")) { // 当字段名为产品名称时,将其从字段列表中剔除
                simpleReportBO.removeReportFieldById(field.getId());
                colIndex = i;
            }
        }
        if (colIndex < 0) {
            return;
        }
        List<ReportField> fieldList = view.getReportBean().getFields();
        fieldList.remove(colIndex);
        view.getReportBean().setFields(fieldList);
        List<String> headers = gridData.getStringHeaders();
        headers.remove(colIndex);
        for (List<CellData> cellData : gridData.getData()) {// 将隐藏字段对应的数据也剔除
            cellData.remove(colIndex);
        }
    }
  
    public boolean accept(String dataSourceId, String bizViewId, String reportId, String reportName) {
    	if (reportName.equalsIgnoreCase("报表数据过滤器分析"))
            return true;
        else
            return false;
    }
}


3、修改Smartbi服务器配置文件smartbi-config.xml,在<freequery></ freequery >节点间加入以下代码: 

<htmlGenerator-extend-chain>
	<extend>bof.ext.sample9_10.FilterFieldsAndData</extend>
</htmlGenerator-extend-chain>
    • 注:在< htmlGenerator-extend-chain >中可以包括多个< extend >。

4、重启Smartbi服务,刷新这张报表就会执行以上代码,效果如图:

改变前:

改变后:

示例工程源码

Sample9_10.rar

  • 无标签