1

我有一个非常简单的 XML 数据源,其结构如下:

<datasource>
    <row>
        <column>Some text 1</column>
        <column>Some text 2</column>
        <column>Some text 3</column>
    </row>
    <row>
        <column>Some text 4</column>
        <column>Some text 5</column>
        <column>Some text 6</column>
    </row>
    <row>
        <column>Some text 7</column>
        <column>Some text 8</column>
        <column>Some text 9</column>
    </row>
</datasource>

我想创建一个非常简单的 XLS 报告,格式如下:

-------------------------------------------
| Some text 1 | Some text 2 | Some text 3 |
-------------------------------------------
| Some text 4 | Some text 5 | Some text 6 |
-------------------------------------------
| Some text 7 | Some text 8 | Some text 9 |
-------------------------------------------

我使用 XPath 查询创建了一个报告:

/datasource

和两个领域:

$F{row}
$F{column}

用表达式:

row
row/column

分别。

我已将交叉表元素添加到详细信息带,并尝试使用上面为行和列分组选项定义的字段的不同变体对其进行配置。但是我能得到的最好的结果是第一列的值(即上面例子中的“Some text 1”值)。

我的问题:

  1. 如何配置交叉表元素以遍历数据源中的每个行元素并将列值推送到正确的单元格中,如上面的示例所示?
  2. 交叉表元素是最适合此类任务的元素吗?
4

1 回答 1

2

好的,所以我已经弄清楚了,我真的无法将任何一个来源作为这些东西的一个很好的参考点。Jasper 的文档和社区贡献大部分是稀疏和过时的。我跑题了。这是我为使其适用于 iReport 4.5.0 和 Jasper 4.5.0 所做的工作:

  1. 在 iReport 中创建一个空白 A4 报告。
  2. 使用 XPath 语法编辑文档查询以选择所有“行”元素(即 /datasource/row)
  3. 现在,通过右键单击 Report Inspector 视图中的文档属性(即与 .jrmxl 文件同名的属性)并选择添加数据集来创建一个子数据集。
  4. 在向导中选择“从连接或数据源创建新数据集”
  5. 选择与您的主报告相同的 XML 数据源,如果您有要传递的字段或组,请在随后的相应向导窗口中选择它们。但主要是选择您的数据源。
  6. 现在您需要编辑查询以在列元素上进行选择。在此之前,为了让生活更轻松,我编辑了我的 XML 数据源以在每个行元素中包含一个“计数”属性。如果愿意,您可以创建自己的递增计数,但对我来说,编辑数据源文档是最简单的。
    1. 所以接下来我要做的是在我的主报告中创建一个名为“rowCount”的字段,并给它一个描述表达式“@count”,以便它存储每个行元素的计数属性值。
    2. 之后,我在我的子数据集中设置了一个同名的参数。
    3. 然后我将我的子数据集查询配置为读取 "/datasource/row[@count="$P{rowCount}"]/column" 以便为每一行选择所有列元素。
    4. 接下来,我在子数据集中创建了一个名为 columnValue 的字段,其描述表达式为:“text()”,用于存储来自每个列元素的文本。
  7. 配置子数据集后,我将一个交叉表对象拖到我的详细信息带中,这会提示显示交叉表向导。
    1. 在向导中,我选择了子数据集作为其数据源,并选择了与主报表相同的连接。
    2. 对于 Row 和 Column 组值,我分别选择了 $P{rowCount} 和 $V{COLUMN_COUNT}。
    3. 最重要的是,我将“数据”部分配置为指向我的 columnValue 字段并将度量选择为“无”,而不是计数或任何其他计算。最后单击完成以创建对象。
  8. 下一步是右键单击报告检查器中的交叉表对象,然后选择“交叉表数据”,这会打开一个数据配置窗口。在这里我:
    1. 选中“数据已预先排序”
    2. 在底部的“数据集运行”部分中,在“连接/数据源 exp”选项卡中,我选择了“使用连接表达式”,其值为 $P{REPORT_CONNECTION}
    3. 在“参数”选项卡中,我添加了:
      • XML_DATA_DOCMENT
      • REPORT_CONTEXT
      • XML_DATE_PATTERN
      • XML_NUMBER_PATTERN
      • XML_LOCALE
      • XML_TIME_ZONE
      • 行数
    4. 我将“Parameters Map exp”留空。
  9. 从这一点开始要做的最后几件事是破解 XML 以删除行和列组标记,这需要从“crostab”JRXML 元素(包括以下所有子元素)中删除以下元素:
    • 交叉表行标题
    • crosstabTotalRowHeader
    • 交叉表列标题
    • 交叉表总列标题
  10. 最后,使用 java.lang.Integer.parseInt 包装您的 $P{rowCount} 行组存储桶表达式,以便它可以将 rowCount 处理为整数。

就是这样了。对我来说,这就是我需要解决的交叉表/XML 数据源/子数据集难题!

于 2012-03-04T20:21:03.667 回答