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

正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史

版本 1 下一个 »

应用场景

我们可以通过计划任务中的自定义功能,写代码实现修改导出文件的名称。下面以产品自带的仪表分析资源【演示柱图(并列分析)】为例,演示如何修改导出资源的。可以下载导出文件,导入到系统中使用:migrate.xml

实现操作

  1. 在计划任务中添加刷新报表数据的任务,操作入口计划任务】-> 【任务】新建任务,如下图:

  2. 任务类型选择"定制",在【自定义设置】中添加刷新报表的java代码,新建任务名称为"定时刷新报表"。实现计划任务导出文件有两种写法。一种是通过调用计划任务组件实现,一种是调用 SDK 实现,两个方法二选一即可。

    SDK 写法:

    SDK书写方式
    // 导入将会使用的java类与java包
    importClass(java.io.File);
    importClass(java.io.FileOutputStream);
    importClass(java.text.SimpleDateFormat);
    importClass(java.util.regex.Pattern);
    importPackage(Packages.smartbi.sdk.service.catalog);
    importPackage(Packages.smartbi.sdk.service.graphicreport);
     
    // 从资源目录树读取报表信息
    var reportId = 'I2c949e121d27be5d011d27c3babd0017';
    var catalogService = new CatalogService(connector);
    var reportElem = catalogService.getCatalogElementById(reportId);
    var reportAlias = reportElem.getAlias();
    // 打开仪表分析
    var tempReportService = new GraphicReportService(connector);
    var tempReport = tempReportService.openGraphicReport(reportId);
    // 生成导出的目标路径
    var currDateStr = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    var targetDir = 'c:/task_demo/' + reportAlias + '_' + currDateStr + '/';
    new File(targetDir).mkdirs();
    // 获取参数信息
    var paramList = tempReport.getParameters();
    var nameIdMap = {};
    for ( var i = 0; i < paramList.size(); i++) {
     var param = paramList.get(i);
     var name = param.getName();
     var id = param.getId();
     nameIdMap[name] = id;
    } 
    // 为使用固定值的参数设置参数值 
    var fixedParamValues = [{
     id : nameIdMap['销售区域'],
     value : '中国',
     displayValue : '中国'
    } ];
    for ( var i = 0; i < fixedParamValues.length; i++) {
     var param = fixedParamValues[i];
     tempReport.setParamValue(param.id, param.value, param.displayValue);
    }
    // 枚举指定的参数的备选值,并执行导出 
    var regex = '\\\\|\\/|:|\\*|\\?|\"|<|>|\\|';
    var timeParamId = nameIdMap['销售时间'];
    var timeParamValues = tempReport.getParamStandbyValue(timeParamId);
    var enumParamId = nameIdMap['产品类别'];
    var enumParamValues = tempReport.getParamStandbyValue(enumParamId);
    var c = 0;
    for ( var j = 0; j < timeParamValues.size(); j++) {
     var tvalues = timeParamValues.get(j);
     var tvalue = tvalues.getValue();
     var tdisplayValue = tvalues.getName();
     tempReport.setParamValue(timeParamId, tvalue,tdisplayValue);
    for ( var i = 0; i < enumParamValues.size(); i++) {
     var evalues = enumParamValues.get(i);
     var evalue = evalues.getValue();
     var edisplayValue = evalues.getName();
     tempReport.setParamValue(enumParamId, evalue,edisplayValue);
     // 指定导出文件名称。
     var newReportName =reportAlias+ Pattern.compile(regex).matcher(edisplayValue).replaceAll('_')+'_'+Pattern.compile(regex).matcher(tdisplayValue).replaceAll('_');
     var fileName = targetDir + newReportName + '.jpeg';
     var tempFile = new File(fileName);
     var outputStream = new FileOutputStream(tempFile);
     tempReport.doExport('JPEG', outputStream);
     outputStream.close();
     ++c;
    }
    }
    // 生成前端的提示信息 
    var total = enumParamValues.size()* timeParamValues.size();
    if (c > 0 && c == total) {
     context.put('message', '报表导出成功,已发送至路径"' + targetDir + '"。');
    }

    计划任务组件书写方式,这种方式的任务脚本,实际可以用任务配置界面先配置导出灵活分析到指定目录,然后点击【查看运行脚本】,基于产品生成的再去改造:

    计划任务组件书写方式
    // 导入将会使用的java类与java包
    importClass(java.lang.System);
    importClass(java.text.SimpleDateFormat);
     
    //初始化参数设置:枚举"销售时间",固定"产品类别"和"销售区域"参数值。
    var reportParamSetting = [
        {id:"OutputParameter.I2c90905413dd56e40113dd6a106c0073.销售时间",
    value:"$枚举值$",displayValue:"$枚举值$"},
        {id:"OutputParameter.I2c90905413dd56e40113dd6a106c0073.销售区域",
    value:"中国",displayValue:"中国"},
        {id:"OutputParameter.I2c90905413dd56e40113dd6a106c0073.产品类别",
    value:"$枚举值$",displayValue:"$枚举值$"}
    ];
    //打开报表资源。
    var tempResourceHandle = execute('openResource', {
      connector: connector,
      reportId: "I2c949e121d27be5d011d27c3babd0017"
    }).resourceHandle;
    //设置报表参数。
    var enumerateParamValuesOutput = execute('enumerateParamValues', {
      resourceHandle: tempResourceHandle,
      byEveryParam: true,
      paramsSetting: reportParamSetting
    });
    // 生成导出的目标路径:报表别名 + 当前日期
    var currDateStr = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    var targetDir = '演示柱图(并列分析)_' + currDateStr + '/';
    //以JPEG格式导出报表资源。
    var exportReportOutput = execute('exportResource', {
      connector: connector,
      resourceHandle: tempResourceHandle,
      paramSettingIterator: enumerateParamValuesOutput.getParamValues(),
      exportSetting: {"delimiter":"",  "pathId":"",  "userDefinedFolderName": targetDir },
      taskName: taskName,
      exportType: "JPEG"
    });
    //输出文件到目标路径。
    var outputFile = exportReportOutput.folder;
    var subfiles = outputFile.listFiles();
    for (var i= 0;i<subfiles.length;i++) {
        var oldName = subfiles[i].getName();
        var lastIndex = oldName.lastIndexOf("_");
        var subfix = oldName.substring(oldName.lastIndexOf("."));
        var newName = oldName.substring(0,lastIndex)+subfix;
        System.out.println(newName);
        var sendToFileOutput = execute('sendToFile', {
        file: subfiles[i],
        sendSetting: {path: 'C:/task_demo/',filename: newName}
    });
    }
  3. 再新建计划,实现定时导出报表。

 

  • 无标签