0

我正在尝试将重复网格数据导出到 Excel。为此,我提供了一个通过单击运行“MyCustomActivity”活动的按钮。该按钮以相同的布局放置在网格上方。还值得指出的是,我正在使用一篇文章作为配置指南。根据指南,我的“MyCustomActivity”活动包含两个步骤:

  1. 方法:Property-Set,方法参数:Param.exportmode = "excel"
  2. 方法:调用 pzRDExportWrapper。我传递了当前参数(第一步只有一个)。

但是在我遇到问题后,我通过 Call Rule-Obj-Report-Definition.pzRDExportWrapper 更改了第二步

但是正如您已经了解的那样,该解决方案不起作用。我检查了日志文件并发现了有趣的错误:

2017-04-11 21:08:27,992 [ WebContainer : 4] [OpenPortal] [ ] [ MyFW:01.01.02] (ctionWrapper._baseclass.Action) 错误 as1|172.22.254.110 bar - 活动“MyCustomActivity”无法执行;未能找到适用于“COM-FW-MyFW-Work”的名为“PZRESOLVECOPYFILTERS”的“RULE-OBJ-ACTIVITY”。规则库中有 3 个具有此名称的规则,但没有一个匹配此请求。规则库中定义的名为 'PZRESOLVECOPYFILTERS' 的 3 条规则是:2017-04-11 21:08:42,807 [ WebContainer : 4] [TABTHREAD1] [ ] [ MyFW:01.01.02] (fileSetup.Code_Security.Action) ERROR as1| 172.22.254.110 bar - 外部身份验证失败:

如果有人有任何建议并分享一些,我将不胜感激。谢谢你。

4

1 回答 1

1

我想提供将检索到的作品导出到 CSV 文件的功能。该功能应具有选择要检索的字段的功能,所有结果都应为乌克兰语,并且能够使用任何 SearchFilter 页面和报告定义规则。

在用户门户中,我有两个部分:第一个部分包含文本字段和一个搜索按钮,一个包含重复网格以显示结果的部分。文本字段用于过滤结果,它们使用页面 Org-Div-Work-SearchFilter。

我为csv制作了一个自定义解析器。我创建了两个活动并编写了一些 Java 代码。我应该提到我从 pzPDExportWrapper 中获取了一些代码。

这些活动是:

  • ExportToCSV - 从用户那里获取参数,获取数据,调用 ConvertResultsToCSV;
  • ConvertResultsToCSV - 将检索到的数据转换为 .CSV 文件。

ExportToCSV 活动
的配置:页面和类选项卡:
在此处输入图像描述

  • ReportDefinition 是某个报告定义的对象。
  • SearchFilter 是一个页面,其值由用户输入。
  • ReportDefinitionResults 是检索到的要导出的作品的列表。
  • ReportDefinitionResults.pxResults 表示某种作品的类型。

    参数选项卡:
    在此处输入图像描述

  • FileName 是生成文件的名称

  • ColumnsNames 以逗号分隔的列名称。如果参数为空,则导出 CSVProperties。
  • CSVProperties 是在以逗号分隔的电子表格中显示的道具。
  • SearchPageName 是用于过滤结果的页面名称。
  • ReportDefinitionName 是用于检索结果的 RD 名称。
  • ReportDefinitionClass 是一个使用的报表定义类。

    步骤选项卡:
    在此处输入图像描述

让我们看一下步骤:
1. 从具有填充字段的参数中获取具有名称的 SearchFilte 页面:
在此处输入图像描述 2. 如果 SearchFilter 不为空,则调用数据转换以将 SearchFilter 的属性转换为参数属性: 数据转换的片段: 3 . 获取报表定义的对象 4. 设置报表定义的参数 5. 调用报表定义并将结果保存到 ReportDefinitionResults: 6. 调用 ConvertResultsToCSV 活动: 7. 删除结果页面:
在此处输入图像描述

在此处输入图像描述
在此处输入图像描述
在此处输入图像描述
在此处输入图像描述
在此处输入图像描述
在此处输入图像描述

ConvertResultsToCSV 活动的概述。 如果 ConvertResultsToCSV 活动的参数选项卡:
在此处输入图像描述

在此处输入图像描述

  • CSVProperties 是要检索和导出的属性。
  • ColumnsNames 是要显示的列的名称。
  • PageListProperty 要在主页面中读取的属性的名称
  • FileName 生成文件的名称。可以为空。
  • AppendTimeStampToFileName - 如果为真,则为文件生成时间。
  • CSVString 生成的要保存到文件的 CSV 字符串。
  • FileName 文件的名称。
  • listSeperator 始终是用于分隔字段的分号。

    让我们浏览一下活动中的所有步骤:

    1. 从用户设置中获取本地化(注释): 理论上它能够支持多种语言的本地化。
      在此处输入图像描述
    2. 始终设置“uk”(乌克兰语)本地化。
      在此处输入图像描述
    3. 根据本地化获取分隔符。在乌克兰语、英语和俄语中,它始终是一个分号。需要检查其他语言。
      在此处输入图像描述

    4. 该步骤包含形成 CSV 字符串的 Java 代码:

StringBuffer csvContent = new StringBuffer(); // a content of buffer
String pageListProp = tools.getParamValue("PageListProperty");
ClipboardProperty resultsProp = myStepPage.getProperty(pageListProp);

// fill the properties names list
java.util.List<String> propertiesNames = new java.util.LinkedList<String>(); // names of properties which values display in csv
String csvProps = tools.getParamValue("CSVProperties");
propertiesNames = java.util.Arrays.asList(csvProps.split(","));

// get user's colums names
java.util.List<String> columnsNames = new java.util.LinkedList<String>();
String CSVDisplayProps = tools.getParamValue("ColumnsNames");
if (!CSVDisplayProps.isEmpty()) {
  columnsNames = java.util.Arrays.asList(CSVDisplayProps.split(","));
} else {
  columnsNames.addAll(propertiesNames);
}

// add columns to csv file
Iterator columnsIter = columnsNames.iterator();
while (columnsIter.hasNext()) {
  csvContent.append(columnsIter.next().toString());
  if (columnsIter.hasNext()){
    csvContent.append(listSeperator); // listSeperator - local variable
  }
}
csvContent.append("\r");

for (int i = 1; i <= resultsProp.size(); i++) { 
  ClipboardPage propPage = resultsProp.getPageValue(i); 
  Iterator iterator = propertiesNames.iterator(); 
  int propTypeIndex = 0;
  while (iterator.hasNext()) {
    ClipboardProperty clipProp = propPage.getIfPresent((iterator.next()).toString());

    String propValue = "";
    if(clipProp != null && !clipProp.isEmpty()) {
      char propType = clipProp.getType();
      propValue = clipProp.getStringValue();

      if (propType == ImmutablePropertyInfo.TYPE_DATE) {
        DateTimeUtils dtu = ThreadContainer.get().getDateTimeUtils();
        long mills = dtu.parseDateString(propValue);
        java.util.Date date = new Date(mills);
        String sdate = dtu.formatDateTimeStamp(date);
        propValue = dtu.formatDateTime(sdate, "dd.MM.yyyy", "", "");
      } 
      else if (propType == ImmutablePropertyInfo.TYPE_DATETIME) {
        DateTimeUtils dtu = ThreadContainer.get().getDateTimeUtils();
        propValue = dtu.formatDateTime(propValue, "dd.MM.yyyy HH:mm", "", "");
      } 
      else if ((propType == ImmutablePropertyInfo.TYPE_DECIMAL)) {
        propValue = PRNumberFormat.format(localeCode,PRNumberFormat.DEFAULT_DECIMAL, false, null,  new BigDecimal(propValue));
      } 
      else if (propType == ImmutablePropertyInfo.TYPE_DOUBLE) {
        propValue = PRNumberFormat.format(localeCode,PRNumberFormat.DEFAULT_DECIMAL, false, null,  Double.parseDouble(propValue));
      } 
      else if (propType == ImmutablePropertyInfo.TYPE_TEXT) {
        propValue = clipProp.getLocalizedText();
      } 
      else if (propType == ImmutablePropertyInfo.TYPE_INTEGER) {
        Integer intPropValue = Integer.parseInt(propValue);
        if (intPropValue < 0) {
          propValue = new String();
        }

      }
    }
    if(propValue.contains(listSeperator)){
      csvContent.append("\""+propValue+"\"");
    } else {
      csvContent.append(propValue);
    }
    if(iterator.hasNext()){
      csvContent.append(listSeperator);
    }
    propTypeIndex++;
  }
  csvContent.append("\r");
}

CSVString = csvContent.toString();

5. 此步骤在服务器的目录树中形成并保存文件

char sep = PRFile.separatorChar;
String exportPath= tools.getProperty("pxProcess.pxServiceExportPath").getStringValue();
DateTimeUtils dtu = ThreadContainer.get().getDateTimeUtils();

String fileNameParam = tools.getParamValue("FileName");
if(fileNameParam.equals("")){
    fileNameParam = "RecordsToCSV";
}

//append a time stamp
Boolean appendTimeStamp = tools.getParamAsBoolean(ImmutablePropertyInfo.TYPE_TRUEFALSE,"AppendTimeStampToFileName");
FileName += fileNameParam;
if(appendTimeStamp) {
  FileName += "_";
  String currentDateTime = dtu.getCurrentTimeStamp();
  currentDateTime = dtu.formatDateTime(currentDateTime, "HH-mm-ss_dd.MM.yyyy", "", "");
  FileName += currentDateTime;
}

//append a file format
FileName += ".csv";

String strSQLfullPath = exportPath + sep + FileName;
PRFile f = new PRFile(strSQLfullPath);

PROutputStream stream = null;
PRWriter out = null;
try {
 // Create file 
 stream = new PROutputStream(f);
 out = new PRWriter(stream, "UTF-8");

 // Bug with Excel reading a file starting with 'ID' as SYLK file. If CSV starts with ID, prepend an empty space.
 if(CSVString.startsWith("ID")){
    CSVString=" "+CSVString;
 }
 out.write(CSVString);
} catch (Exception e) {
 oLog.error("Error writing csv file: " + e.getMessage());
} finally {
  try {
    // Close the output stream
    out.close();
  } catch (Exception e) {
    oLog.error("Error of closing a file stream: " + e.getMessage());
  }
}

  1. 最后一步调用@baseclass.DownloadFile 下载文件:
    在此处输入图像描述

最后,我们可以在某个部分或其他地方发布一个按钮,并像这样设置一个操作选项卡: 它在“刷新部分”操作中也可以正常工作。
在此处输入图像描述

一个可能的结果可能是
在此处输入图像描述

谢谢阅读。

于 2017-09-19T15:29:17.077 回答