1.示例场景
我们可以通过计划任务中的自定义功能,写代码实现修改导出文件的名称。下面以产品自带的仪表分析资源【演示柱图(并列分析)】为例,演示如何修改导出资源的。可以下载导出文件,导入到系统中使用: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、在左边资源树上的【系统运维】->【计划任务】->【计划】中新建一个计划,设置待执行任务为刚刚创建的任务,并设置计划运行的周期,如下图:
