将基本类型对象列表作为子报表的数据源传递

Per*_*los 18 java jasper-reports

我需要借助master report的参数将一个dataSource传递给我的子报表List<String>.我不知道dataSource是什么类型是正确的以及如何在子报表中获取值.

我的主报告中的片段:

<parameter name="seznamPriloh" class="java.util.List" isForPrompting="false"/>
....
<subreport>
    <reportElement x="0" y="56" width="555" height="76"/>
    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{seznamPriloh})]]></dataSourceExpression>
            <subreportExpression><![CDATA[cz.alis.keong.jasjdr.reporting.ReportCompiler.compile("R79_SeznamPriloh")]]></subreportExpression>
</subreport>
Run Code Online (Sandbox Code Playgroud)

我的子报告中的代码段:

<detail>
    <band height="23">
        <textField>
            <reportElement x="56" y="3" width="100" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[$F{}]]></textFieldExpression>
        </textField>
    </band>
</detail>
Run Code Online (Sandbox Code Playgroud)

请告诉我如何通过主报告的java.util.List<String>类型参数将数据源传递到子报告.

编辑次数:08.14 14:20将标签添加到Java

编辑:08.14 15:30涉及如何打印iReport中另一个列表中包含的字符串列表?适用于4.5.0和List<String>

Die*_*nia 27

您必须指定在子报表中使用的字段.你正在传递$F{},当你传递一个List<String>你应该放置的数据源时$F{_THIS}.当然,你必须添加一个具有该名称的字段,只有你可以使用该表达式$F{somefield}.

  • 我很愚蠢,没有意识到该错误意味着什么,那只是子报表组件的错误设置(子报表的详细信息大于该组件的组件)。因此,定义字段_THIS适用于4.5.0 (2认同)

Ale*_*x K 7

您可以使用此数据源表达式将java.util.List(通过参数)传递给子报表:

<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{seznamPriloh})]]></dataSourceExpression>
Run Code Online (Sandbox Code Playgroud)

工作样本,主报告:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
    <parameter name="listParam" class="java.util.List"/>
    <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
        <defaultValueExpression><![CDATA["<subreport_dir>"]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[SELECT id, street, city FROM address]]>
    </queryString>
    <field name="ID" class="java.lang.Integer"/>
    <field name="STREET" class="java.lang.String"/>
    <field name="CITY" class="java.lang.String"/>
    <detail>
        <band height="57" splitType="Stretch">
            <frame>
                <reportElement x="0" y="0" width="539" height="57"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <subreport>
                    <reportElement x="0" y="32" width="523" height="17"/>
                    <subreportParameter name="cityParam">
                        <subreportParameterExpression><![CDATA[$F{CITY}]]></subreportParameterExpression>
                    </subreportParameter>
                    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{listParam})]]></dataSourceExpression>
                    <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subreport_list_as_param.jasper"]]></subreportExpression>
                </subreport>
                <textField>
                    <reportElement x="300" y="0" width="208" height="20"/>
                    <box leftPadding="10"/>
                    <textElement>
                        <font isBold="true"/>
                    </textElement>
                    <textFieldExpression><![CDATA["City: " + $F{CITY}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="100" y="0" width="200" height="20"/>
                    <box leftPadding="10"/>
                    <textElement>
                        <font isBold="true"/>
                    </textElement>
                    <textFieldExpression><![CDATA["Street: " + $F{STREET}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="0" y="0" width="100" height="20"/>
                    <box leftPadding="10"/>
                    <textElement>
                        <font isBold="true"/>
                    </textElement>
                    <textFieldExpression><![CDATA["Id: " + $F{ID}]]></textFieldExpression>
                </textField>
            </frame>
        </band>
    </detail>
</jasperReport>
Run Code Online (Sandbox Code Playgroud)

子报告:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
    <parameter name="cityParam" class="java.lang.String"/>
    <field name="id" class="java.lang.Integer"/>
    <field name="station" class="java.lang.String"/>
    <field name="city" class="java.lang.String"/>
    <filterExpression><![CDATA[$F{city}.equals($P{cityParam})]]></filterExpression>
    <title>
        <band height="39">
            <textField>
                <reportElement x="220" y="14" width="161" height="20"/>
                <box leftPadding="10"/>
                <textElement>
                    <font isBold="true" isItalic="true"/>
                </textElement>
                <textFieldExpression><![CDATA["City param: " + $P{cityParam}]]></textFieldExpression>
            </textField>
        </band>
    </title>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="20"/>
                <box leftPadding="10"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="100" y="0" width="100" height="20"/>
                <box leftPadding="10"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{station}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
    <noData>
        <band height="50">
            <textField>
                <reportElement x="220" y="17" width="161" height="20"/>
                <box leftPadding="10"/>
                <textElement>
                    <font isBold="true" isItalic="true"/>
                </textElement>
                <textFieldExpression><![CDATA["No data for city param: " + $P{cityParam}]]></textFieldExpression>
            </textField>
        </band>
    </noData>
</jasperReport>
Run Code Online (Sandbox Code Playgroud)

传递 List的Java代码:

Map<String, Object> params = new HashMap<String, Object>();

List<TestBean> beansList = new ArrayList<TestBean>();

// The TestBean class constructor is: 
//public TestBean(String city, Integer id, String station)
TestBean bean = new TestBean("Dallas", 10, "Central park st.");
beansList.add(bean);

bean = new TestBean("Dallas", 11, "Railway st.");
beansList.add(bean);

bean = new TestBean("Dallas", 12, "Market st.");
beansList.add(bean);

bean = new TestBean("Lyon", 20, "Airport st.");
beansList.add(bean);

params.put("listParam", beansList);

JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, getDemoHsqldbConnection());

JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
Run Code Online (Sandbox Code Playgroud)

结果将是(生成的PDF文件的视图):

生成PDF格式的结果


您可以查看net.sf.jasperreports.engine.JRDataSource的实现.最适合您的情况是:JRBeanCollectionDataSourceJRBeanArrayDataSource.如您所见,它们都是基于Bean的.

我想你可以很容易地将你转换List<String>List<StringBean>.

或者您可以实现自己的JRDataSource.


tes*_*ser 7

是的有效.它完全没有明确记录,但它适用于jasperreport 4.5.1.

您必须在名为"_THIS"的子报表中声明一个字段,并使用您要显示的基本类型键入.在这种情况下,一个字符串.

子报表

<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="testSubReport" pageWidth="555" pageHeight="802" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" isSummaryWithPageHeaderAndFooter="true" whenResourceMissingType="Empty">

    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="_THIS" class="java.lang.String"/>
    <pageHeader>
  ...
Run Code Online (Sandbox Code Playgroud)

然后在要显示String值的子子报表中,只需使用$ F {_THIS}.

<detail>
    <band height="25">
        <textField isStretchWithOverflow="true">
            <reportElement x="37" y="5" width="503" height="15">
            </reportElement>
            <textFieldExpression><![CDATA[$F{_THIS}]]></textFieldExpression>
        </textField>
    </band>
</detail>
Run Code Online (Sandbox Code Playgroud)

主要报告

父报告将List作为datasourceExpression提供

<subreport>
    <reportElement positionType="Float" x="0" y="4" width="554" height="1"/>
    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{bean}.getListeOfStringsMethode())]]></dataSourceExpression>
    <subreportExpression><![CDATA[$P{subreportPrimitiveTypeList}]]></subreportExpression>
</subreport>
Run Code Online (Sandbox Code Playgroud)

我在这里汲取灵感