应用场景
我们可以通过计划任务中的自定义功能,写代码实现修改导出文件的名称。下面以产品自带的仪表分析资源【演示柱图(并列分析)】为例,演示如何修改导出资源的。可以下载导出文件,导入到系统中使用:migrate.xml
实现操作
在计划任务中添加刷新报表数据的任务,操作入口【定制】->【计划任务】-> 【任务】新建任务,如下图:
任务类型选择"定制",在【自定义设置】中添加刷新报表的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} }); }
再新建计划,实现定时导出报表。