下面以产品自带的仪表分析资源【演示柱图(并列分析)】为例,演示如何修改导出资源的。可以下载导出文件,导入到系统中使用:migrate.xml
1、在【系统运维】-》【计划任务】-》【任务】创建刷新报表数据任务,【任务类型】选择:“定制”
2、在【自定义设置】中添加如下的java代码。实现计划任务导出文件有两种写法。一种是通过调用计划任务组件实现,一种是调用 SDK 实现,两个方法二选一即可。
(1)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 + '"。'); } |
(2)计划任务组件书写方式,这种方式的任务脚本,实际可以用任务配置界面先配置导出灵活分析到指定目录,然后点击【查看运行脚本】,基于产品生成的再去改造:
// 导入将会使用的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、在左边资源树上的【系统运维】->【计划任务】->【计划】中新建一个计划,设置待执行任务为刚刚创建的任务,并设置计划运行的周期,如下图:
4、可参考示例资源 migrate(修改导出文件的名称_导出到服务器_SDK).xml 和 migrate(修改导出文件的名称_导出到服务器_计划任务组件).xml。
此示例效果是在导出的附件文件名上添加当前日期和一个固定值,如下图所示:
注:示例脚本仅供参考。
1、在原始报表上添加一个日期参数,用于导出的时候可以获取到。
2、在【系统运维】-》【计划任务】-》【任务】创建任务,【任务类型】选择:“定制”
3、将以下脚本代码复制到自定义设置中
importPackage(Packages.smartbi.email.module); importPackage(Packages.java.io); //报表ID var reportID = 'I4028818a015d62bd62bd9475015d97c4ee9b40d9'; //报表参数设置:日期参数 默认值是今天 var reportParamSetting = [ {id:"OutputParameter.I4028818a015d62bd62bd9475015d97c4d00040d5.开始日期2",value:getNowFormatDate(),displayValue:getNowFormatDate()} ]; //收件人邮箱,多个时,用英文分号隔开(;) var mailList = "zhangxueqiong@smartbi.com.cn;zhangmeiting@smartbi.com.cn"; //邮件的内容 var mailText = "这是一个系统自动发送的邮件,所含附件是您订阅的报表"; //报表名称的固定值 var seperatorFix = "_V01"; //服务器临时文件目录 var tmpPath = "c:/"; //获取当前日期:YYYY-MM-DD function getNowFormatDate() { var date = new Date(); var seperator1 = ""; var month = date.getMonth() + 1; var strDate = date.getDate(); if (month >= 1 && month <= 9) { month = "0" + month; } if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } //YYYY-MM-DD var currentdate_date = date.getFullYear() + seperator1 + month + seperator1 + strDate; return currentdate_date; }var openReportOutput = execute('openResource', { connector: connector, reportId: reportID }); var enumerateParamValuesOutput = execute('enumerateParamValues', { resourceHandle: openReportOutput.resourceHandle, byEveryParam: false, paramsSetting: reportParamSetting }); var exportReportOutput = execute('exportResource', { connector: connector, resourceHandle: openReportOutput.resourceHandle, paramSettingIterator: enumerateParamValuesOutput.getParamValues(), exportSetting: {"delimiter":"","pathId":"","fileNameSufParams":true}, taskName: taskName, exportType: "EXCEL2007" }); openReportOutput.resourceHandle.close(); var outputFile = exportReportOutput.file; //文件重命名 var fileName = outputFile.getName(); var index = fileName.lastIndexOf("."); var newName = fileName.substring(0, index)+seperatorFix+"."+fileName.substring(index+1);//新建一个重命名的文件 var destFile = new File(tmpPath+newName); //文件若存在,则删掉 if(destFile.exists()){ destFile.delete(); } var flag = outputFile.renameTo(destFile); outputFile = destFile; var sendToMailOutput = execute('sendToMail', { connector: connector, taskName: taskName, paramValueMap: null, files: [outputFile], sendSetting: {"mailList":mailList,"doZip":false,"title":"%TASKNAME_%DATE%TIME","text":mailText,"picInMail":false} }); |
4、在左边资源树上的【系统运维】->【计划任务】->【计划】中新建一个计划,设置待执行任务为刚刚创建的任务,并设置计划运行的周期,如下图:
1、临时目录配置:tmpPath ,这个路径请配置为系统的临时目录,方便以后删除。
2、报表ID获取,参数ID获取,有两种方法
方法一:通过【报表导出】任务类型,然后在【查看运行脚本】中找到该参数的ID
方法二:这种方法只适用于有数据集的报表,通过数据集那里的输出参数查看参数的ID