Коллекция JasperReports как источник данных? - PullRequest
2 голосов
/ 16 июня 2011

Я пытаюсь выяснить, как использовать коллекцию строк в качестве источника данных в JasperReports.

Я думаю, что нашел решение, но не могу заставить его работать, кто-нибудь может мне помочь?

  1. установить в качестве источника данных специальный источник данных JREmptyDatasource ($ F {my_collection} .size ())Это создаст пустой набор данных с тем же размером записей, что и коллекция.

  2. Передайте $ F {my_collection} в качестве параметра в поднабор данных (используя запуск набора данных из Списка).

  3. Чтобы напечатать текущий элемент коллекции:

$ P {my_collection_param} .get ($ V {REPORT_COUNT})

<?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="report1" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="0"/>
<subDataset name="dataset1">
    <parameter name="my_collection_param" class="java.util.Collection" isForPrompting="false">
        <defaultValueExpression><![CDATA[$P{my_collection}]]></defaultValueExpression>
    </parameter>
</subDataset>
<parameter name="my_collection" class="java.util.Collection">
    <defaultValueExpression><![CDATA["anna"]]></defaultValueExpression>
</parameter>
<field name="my_collection" class="java.util.Collection">
    <fieldDescription><![CDATA[]]></fieldDescription>
</field>
<background>
    <band splitType="Stretch"/>
</background>
<title>
    <band height="79" splitType="Stretch"/>
</title>
<pageHeader>
    <band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
    <band height="61" splitType="Stretch"/>
</columnHeader>
<detail>
    <band height="125" splitType="Stretch">
        <componentElement>
            <reportElement x="51" y="30" width="400" height="50"/>
            <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="Vertical">
                <datasetRun subDataset="dataset1">
                    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource($F{my_collection}.size())]]></dataSourceExpression>
                </datasetRun>
                <jr:listContents height="50" width="0">
                    <textField>
                        <reportElement x="159" y="24" width="100" height="20"/>
                        <textElement/>
                        <textFieldExpression class="java.lang.String"><![CDATA[$P{my_collection_param}.get( $V{REPORT_COUNT} )]]></textFieldExpression>
                    </textField>
                </jr:listContents>
            </jr:list>
        </componentElement>
    </band>
</detail>
<columnFooter>
    <band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
    <band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
    <band height="42" splitType="Stretch"/>
</summary>

1 Ответ

2 голосов
/ 24 января 2012

Полагаю, ваш хак с использованием JREmptyDataSource хорош по определению, если он работает.

Но вы поймете, что все намного проще, если вы воспользуетесь этим:

new net.sf.jasperreports.engine.data.JRMapCollectionDataSource($P{my_collection_param})
...