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

1.示例场景

       我们可以通过计划任务中的自定义功能,写代码实现修改导出文件的名称。分别为导出到服务器时修改名称和以邮件发送时修改名称。


2.导出到服务器时

2.1说明

       下面以产品自带的仪表分析资源为例,演示如何修改导出资源的。


2.2操作操作

       1、在“系统运维 > 计划任务 > 任务 ”创建刷新报表数据任务,“任务类型”选择 定制

       

       2、在“”自定义设置“”中添加如下的java代码。实现计划任务导出文件有两种写法。一种是通过调用计划任务组件实现,一种是调用 SDK 实现,两个方法二选一即可。

       (1)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 + '"。');
}

       (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,此示例资源为示例脚本的简单版本。

3.以邮件方式导出时

3.1说明

       此示例效果是修改导出的原名为电子表格的报表名称,并以邮件的形式发送,如下图所示:

注:示例脚本仅供参考。

       

3.2操作步骤

       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、在左边资源树上的“系统运维 > 计划任务 > 计划”中新建一个计划,设置待执行任务为刚刚创建的任务,并设置计划运行的周期,如下图:

       

       5、可参考示例资源 migrate(修改导出文件的名称_邮件发送).xml,此示例资源为示例脚本的简单版本。

4.注意事项

       1、临时目录配置:tmpPath ,这个路径请配置为系统的临时目录,方便以后删除。

       

       2、使用邮件发送时需要实现配置“系统选项 > 公共设置”中的邮件设置,如下图:

       

       3、报表ID获取,参数ID获取有两种方法

       方法一:通过“报表导出”任务类型,然后在“查看运行脚本”中找到该参数的ID 

               方法二:这种方法只适用于有数据集的报表,通过数据集那里的输出参数查看参数的ID