如何在Jasper中引用XML数据源中的集合字段?

如何在Jasper中引用XML数据源中的集合字段?,xml,xpath,collections,jasper-reports,Xml,Xpath,Collections,Jasper Reports,我被要求用Jasper中的XML数据源修改一个模板,以使用Java程序中的动态列。因此,我收集了PDF中应显示在列表中的所有列,然后将这些列作为表的列打印在PDF中。由于我是Jasper的初学者,并且在子报表中遇到了列表为空的问题,因此我认为首先在主报表中显示列表的一个元素,然后从主报表开始继续可能会更容易 然而,即使在主报告中,列表似乎也总是空的,我尝试了各种不同的方法来打印列表的内容。我首先检查了列表的实际内容是否不为null,并且可以在生成的XML中进行验证。然后在Jasper中,我尝试在

我被要求用Jasper中的XML数据源修改一个模板,以使用Java程序中的动态列。因此,我收集了PDF中应显示在列表中的所有列,然后将这些列作为表的列打印在PDF中。由于我是Jasper的初学者,并且在子报表中遇到了列表为空的问题,因此我认为首先在主报表中显示列表的一个元素,然后从主报表开始继续可能会更容易

然而,即使在主报告中,列表似乎也总是空的,我尝试了各种不同的方法来打印列表的内容。我首先检查了列表的实际内容是否不为null,并且可以在生成的XML中进行验证。然后在Jasper中,我尝试在主报告中创建一个列表字段,指向java程序中的变量(对于其他变量,例如字符串,这很好)。将字段设置为仅访问列表中的一个字段,或打印出整个列表都会导致生成的PDF中打印空值

因此,在Jasper中将XML作为数据源处理时,我似乎一定误解了如何引用/访问列表

以下是列表在XML中的外观:

<kunde>102591</kunde>
<company>Sony</company>
<currentDate>16.02.2019</currentDate>
<columns>
    <string>id</string>
    <string>type</string>
    <string>name</string>
    <string>area</string>
    <string>salary</string>
</columns>
102591
索尼
16.02.2019
身份证件
类型
名称
地区
薪水
我在主报告中添加了如下字段:

非集合(例如字符串)可以正常工作:


例如,我是否需要以与普通字符串字段不同的方式引用集合字段?如果有人能解释这里的问题所在,我们将不胜感激。

Jasper reports不会自动将您的节点转换为
java.util.List
,因为它不知道如何执行此操作

相反,您可以使用例如创建另一个数据源,然后使用此数据源迭代值/集合

注意:创建动态列并不简单,您可能需要使用交叉表。在本例中,我将仅展示如何在
jr:list
上使用水平打印顺序以列标题方式输出字段值,这将回答如何引用集合字段的问题

例子 xml

<records>
    <record>
        <kunde>102591</kunde>
        <company>Sony</company>
        <currentDate>16.02.2019</currentDate>
        <columns>
            <string>id</string>
            <string>type</string>
            <string>name</string>
            <string>area</string>
            <string>salary</string>
        </columns>
    </record>   
</records>
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Blank_A4_1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isFloatColumnFooter="true" uuid="b98a8766-0e9e-4ae0-9d7c-509e658cd367">
    <subDataset name="customer" uuid="1b55ccc5-c764-45cf-b5c6-b2dea09c1e32">
        <queryString language="XPath">
            <![CDATA[/records/record/columns/string]]>
        </queryString>
        <field name="string" class="java.lang.String">
            <fieldDescription><![CDATA[child::text()]]></fieldDescription>
        </field>
    </subDataset>
    <queryString language="XPath">
        <![CDATA[/records/record]]>
    </queryString>
    <field name="kunde" class="java.lang.String">
        <fieldDescription><![CDATA[kunde]]></fieldDescription>
    </field>
    <field name="company" class="java.lang.String">
        <fieldDescription><![CDATA[company]]></fieldDescription>
    </field>
    <field name="currentDate" class="java.lang.String">
        <fieldDescription><![CDATA[currentDate]]></fieldDescription>
    </field>
    <columnHeader>
        <band height="32" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30" uuid="4b8856ca-e4f4-4e50-9882-c8c1f9f2fe9c"/>
                <text><![CDATA[kunde]]></text>
            </staticText>
            <staticText>
                <reportElement x="100" y="0" width="100" height="30" uuid="8b6f2e55-f3fe-4461-89bd-4e3ba1b5b06b"/>
                <text><![CDATA[company]]></text>
            </staticText>
            <staticText>
                <reportElement x="200" y="0" width="100" height="30" uuid="6320c458-dad4-46e8-a229-bbec8902ad73"/>
                <text><![CDATA[currentDate]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="134" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="30" uuid="bde9ccfc-384e-48c7-aafa-3375b4a5d160"/>
                <textFieldExpression><![CDATA[$F{kunde}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="100" y="0" width="100" height="30" uuid="43d2ce05-e723-4701-96f0-fbdd13768500"/>
                <textFieldExpression><![CDATA[$F{company}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="200" y="0" width="100" height="30" uuid="298f066d-ce3a-491e-954c-b9d590fabb8f"/>
                <textFieldExpression><![CDATA[$F{currentDate}]]></textFieldExpression>
            </textField>
            <componentElement>
                <reportElement x="0" y="43" width="550" height="30" uuid="bfaa5273-3cd6-4538-b95b-fcd356a24423"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Horizontal">
                    <datasetRun subDataset="customer" uuid="3cfd00e4-8793-456e-806f-4ba30e10e6b3">
                        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/record/columns/string")]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="30" width="80">
                        <textField>
                            <reportElement x="0" y="0" width="80" height="30" uuid="bc599749-6639-41d8-abdb-58df6b54f82e"/>
                            <textFieldExpression><![CDATA[$F{string}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>

102591
索尼
16.02.2019
身份证件
类型
名称
地区
薪水
jrxml

<records>
    <record>
        <kunde>102591</kunde>
        <company>Sony</company>
        <currentDate>16.02.2019</currentDate>
        <columns>
            <string>id</string>
            <string>type</string>
            <string>name</string>
            <string>area</string>
            <string>salary</string>
        </columns>
    </record>   
</records>
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Blank_A4_1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isFloatColumnFooter="true" uuid="b98a8766-0e9e-4ae0-9d7c-509e658cd367">
    <subDataset name="customer" uuid="1b55ccc5-c764-45cf-b5c6-b2dea09c1e32">
        <queryString language="XPath">
            <![CDATA[/records/record/columns/string]]>
        </queryString>
        <field name="string" class="java.lang.String">
            <fieldDescription><![CDATA[child::text()]]></fieldDescription>
        </field>
    </subDataset>
    <queryString language="XPath">
        <![CDATA[/records/record]]>
    </queryString>
    <field name="kunde" class="java.lang.String">
        <fieldDescription><![CDATA[kunde]]></fieldDescription>
    </field>
    <field name="company" class="java.lang.String">
        <fieldDescription><![CDATA[company]]></fieldDescription>
    </field>
    <field name="currentDate" class="java.lang.String">
        <fieldDescription><![CDATA[currentDate]]></fieldDescription>
    </field>
    <columnHeader>
        <band height="32" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30" uuid="4b8856ca-e4f4-4e50-9882-c8c1f9f2fe9c"/>
                <text><![CDATA[kunde]]></text>
            </staticText>
            <staticText>
                <reportElement x="100" y="0" width="100" height="30" uuid="8b6f2e55-f3fe-4461-89bd-4e3ba1b5b06b"/>
                <text><![CDATA[company]]></text>
            </staticText>
            <staticText>
                <reportElement x="200" y="0" width="100" height="30" uuid="6320c458-dad4-46e8-a229-bbec8902ad73"/>
                <text><![CDATA[currentDate]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="134" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="30" uuid="bde9ccfc-384e-48c7-aafa-3375b4a5d160"/>
                <textFieldExpression><![CDATA[$F{kunde}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="100" y="0" width="100" height="30" uuid="43d2ce05-e723-4701-96f0-fbdd13768500"/>
                <textFieldExpression><![CDATA[$F{company}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="200" y="0" width="100" height="30" uuid="298f066d-ce3a-491e-954c-b9d590fabb8f"/>
                <textFieldExpression><![CDATA[$F{currentDate}]]></textFieldExpression>
            </textField>
            <componentElement>
                <reportElement x="0" y="43" width="550" height="30" uuid="bfaa5273-3cd6-4538-b95b-fcd356a24423"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Horizontal">
                    <datasetRun subDataset="customer" uuid="3cfd00e4-8793-456e-806f-4ba30e10e6b3">
                        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("/record/columns/string")]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="30" width="80">
                        <textField>
                            <reportElement x="0" y="0" width="80" height="30" uuid="bc599749-6639-41d8-abdb-58df6b54f82e"/>
                            <textFieldExpression><![CDATA[$F{string}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>

输出


您可以这样引用,它不会自动转换为java.util.List,但您可以在columns标记上创建subdatsource。另外,请注意,在jasper报告中创建动态列非常简单,您需要使用crosstabHi Petter,您能详细介绍一下您在这里的意思吗?我已经尝试在Java类中创建一个子数据源,指向我的列表,但是问题仍然存在。一旦我可以打印出我的列列表的内容,我将继续使用交叉表,但现在我仍然要打印这个列表。有什么想法吗?我该如何准确地创建这个子数据源呢?谢谢你的帮助。好的,我给了你一个关于如何参考这个收藏的答案。Tack såmycket Petter!这真的帮了我大忙。@Jssson Svensk?,varsågood:),玩得开心!我在马德里的一份工作报告中写道:)这是一个信息交叉表,是一个信息交叉表。。。他说:“我是西班牙人,我是意大利人,我一直在飞。”。交叉表有点困难,特别是在您的情况下,因为您需要以某种方式组织数据源。最好是使用java进行所有开发(同时解析xml),创建一个JRBeanCollectionDatasource,您可以对其进行排序和设置以生成交叉表,然后将其传递给jasper reports。@Jssson checkout以了解如何组织数据以使交叉表工作。