2.导出到服务器时
2.1说明
下面以产品自带的仪表分析资源为例,演示如何修改导出资源的。

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