当前位置: 首页 > 知识库问答 >
问题:

主报表不显示Jaspersoft StudioJavaBeans的基本子报表

公瑞
2023-03-14

我在Jaspersoft Studio中使用JavaBeans生成基本报告(主/子报告)时遇到问题。

我创建了TestMainReport.jrxml和TestSubreport.jrxml.

TestMainReport。jrxml包含两个静态文本字段,在标题栏中标记为“标题”,在摘要栏中标记为“摘要”。

TestSubreport。jrxml包含两个静态文本字段,标题中的“子报告标题”和摘要栏中的“子报告摘要”。

我已经为它们分配了JavaBean数据适配器,但没有使用(尽管JavaBean字段正在主报告中映射。我只是碰巧没有在子报告中映射它们,因为它们没有被使用)。

已将子报表元素添加到摘要栏中的主报表中。

当我尝试生成每一个报告时,这两个报告都是单独生成的。但是,子报表静态文本不会出现在主报表中。

我期望子报告的静态文本会出现在主报告中。

我做错了什么?

TestMainReport.jrxml

<?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="TestMainReport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="0d969cfb-66d2-442f-b7a4-5a9e1a40c3ae">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Customer Info Data Adapter"/>
    <field name="birthday" class="java.time.LocalDate">
        <fieldDescription><![CDATA[birthday]]></fieldDescription>
    </field>
    <field name="observacao" class="java.lang.String">
        <fieldDescription><![CDATA[observacao]]></fieldDescription>
    </field>
    <field name="orderNumber" class="java.lang.Integer">
        <fieldDescription><![CDATA[orderNumber]]></fieldDescription>
    </field>
    <field name="phone" class="java.lang.String">
        <fieldDescription><![CDATA[phone]]></fieldDescription>
    </field>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
    <field name="email" class="java.lang.String">
        <fieldDescription><![CDATA[email]]></fieldDescription>
    </field>
    <title>
        <band height="79" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30" uuid="db07ac65-15f6-4190-b1db-9d445456f306"/>
                <text><![CDATA[A Title]]></text>
            </staticText>
        </band>
    </title>
    <summary>
        <band height="215" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30" uuid="08c03e87-2b15-4eb1-b404-b7dce6dfb890"/>
                <text><![CDATA[A Summary]]></text>
            </staticText>
            <subreport>
                <reportElement x="0" y="30" width="560" height="150" uuid="c292246e-1ffa-4f08-a783-a0b05b28be76"/>
                <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                <subreportExpression><![CDATA["TestSubreport.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </summary>
</jasperReport>

测试ubreport.jrxml

<?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="TestSubreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="d5dd9821-786d-4312-81c9-fd77f1abfb8a">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Customer Addresses Data Adapter"/>
    <title>
        <band height="79" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30" uuid="4c9fdc83-4039-4eed-b593-448898853071"/>
                <text><![CDATA[Subreport Title]]></text>
            </staticText>
        </band>
    </title>
    <summary>
        <band height="42" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30" uuid="4bb9ba45-548a-4e87-a543-472b0f960487"/>
                <text><![CDATA[Subreport Summary]]></text>
            </staticText>
        </band>
    </summary>
</jasperReport>

CustomerInfoDataSource.java

package testdatasource;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class CustomerInfoDataSource {

    public static Collection<CustomerInfo> getCustomerInfo() {
        List<CustomerInfo> info = new ArrayList<>();
        info.add(new CustomerInfo(1, "Mario", "mario@mario.com.br", LocalDate.now(), "14 912345678", "Observação Mario"));
        return info;
    }
}

客户信息。Java语言

package testdatasource;

import java.time.LocalDate;

public class CustomerInfo {

    private final int orderNumber;
    private final String name;
    private final String email;
    private final LocalDate birthday;
    private final String phone;
    private final String observacao;

    public CustomerInfo(int orderNumber, String name, String email, LocalDate birthday, String phone, String observacao) {
        this.orderNumber = orderNumber;
        this.name = name;
        this.email = email;
        this.birthday = birthday;
        this.phone = phone;
        this.observacao = observacao;
    }

    public int getOrderNumber() {
        return orderNumber;
    }

    public String getName() {
        return name;
    }

    public String getEmail() {
        return email;
    }

    public LocalDate getBirthday() {
        return birthday;
    }

    public String getPhone() {
        return phone;
    }

    public String getObservacao() {
        return observacao;
    }
}

CustomerAddressDataSource。Java语言

package testdatasource;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class CustomerAddressDataSource {

    public static Collection<CustomerAddress> getCustomerAddresses() {
        List<CustomerAddress> addresses = new ArrayList<>();
        addresses.add(new CustomerAddress("Casa 1", "Rua Tal", "123", null, "Jardim Márcia", "Agudos", "17400-000", "Perto da caixa d'água"));
        addresses.add(new CustomerAddress("Casa 2", "Rua Tal", "456", null, "Jardim Márcia", "Agudos", "17400-000", "Perto da caixa d'água"));
        return addresses;
    }
}

CustomerAddress。Java语言

package testdatasource;

public class CustomerAddress {

    private final String title;
    private final String street;
    private final String number;
    private final String complement;
    private final String bairro;
    private final String city;
    private final String cep;
    private final String referencePoint;

    public CustomerAddress(String title, String street, String number, String complement, String bairro, String city,
            String cep, String referencePoint) {
        this.title = title;
        this.street = street;
        this.number = number;
        this.complement = complement;
        this.bairro = bairro;
        this.city = city;
        this.cep = cep;
        this.referencePoint = referencePoint;
    }

    public String getTitle() {
        return title;
    }

    public String getStreet() {
        return street;
    }

    public String getNumber() {
        return number;
    }

    public String getComplement() {
        return complement;
    }

    public String getBairro() {
        return bairro;
    }

    public String getCity() {
        return city;
    }

    public String getCep() {
        return cep;
    }

    public String getReferencePoint() {
        return referencePoint;
    }
}

TestMainReport的输出。jrxml:

TestSubreport.jrxml输出:

共有1个答案

叶光华
2023-03-14

您没有为子报表指定数据源。相反,您设置了connectionExpression(

您应该为子报表指定数据源。可以这样声明子报表元素:

<subreport>
    <reportElement x="0" y="30" width="560" height="150"/>
    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(testdatasource.CustomerAddressDataSource.getCustomerAddresses())]]></dataSourceExpression>
    <subreportExpression><![CDATA["TestSubreport.jasper"]]></subreportExpression>
</subreport>

在这种情况下,CustomerAddressDataSource类将用于填充子报告。

您可以将子报告的数据适配器导出到文件并将其保存到与模板相同的文件夹中(如果您不想指定数据适配器文件的路径)。

您可以借助JSS(Jaspersoft Studio)的上下文菜单导出数据适配器定义:

在您的情况下,它将是CustomerAddressSDataAdapter。包含以下内容的xml:

<?xml version="1.0" encoding="UTF-8" ?>
<beanDataAdapter class="net.sf.jasperreports.data.bean.BeanDataAdapterImpl"><name>Customer Addresses Data Adapter</name><factoryClass>testdatasource.CustomerAddressDataSource</factoryClass><methodName>getCustomerAddresses</methodName><useFieldDescription>false</useFieldDescription><classpath>C:\somepath\library_with_beans.jar</classpath></beanDataAdapter>

您应该借助net.sf.jasperreports.data.adapter属性在子报告中指定此适配器。借助此属性,您应该使用数据适配器定义(描述)指定文件名,它可以是带有路径的名称。在我的例子中,它将是:CustomerAddressetDataAdapter.xml

子报表模板将为:

<?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="TestSubreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="net.sf.jasperreports.data.adapter" value="CustomerAddressesDataAdapter.xml"/>
    <title>
        <band height="79" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30"/>
                <text><![CDATA[Subreport Title]]></text>
            </staticText>
        </band>
    </title>
    <summary>
        <band height="42" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30"/>
                <text><![CDATA[Subreport Summary]]></text>
            </staticText>
        </band>
    </summary>
</jasperReport>

在主报告中,包含子报告的部分将是:

<subreport>
    <reportElement x="0" y="30" width="560" height="150"/>
    <subreportExpression><![CDATA["TestSubreport.jasper"]]></subreportExpression>
</subreport>

-与前一种情况一样,您不需要指定连接。

对于第一个解决方案,JSS的输出结果为:

>

  • Excel数据适配器示例

    JSONQL数据源示例

    Excel数据适配器示例

    在报表和数据集中使用数据适配器

    数据适配器

  •  类似资料:
    • 我想用subreport创建一个简单的Jasper报表,但我无法使其工作。 选择提供一个结果(数据库是Oracle),但是子报表在从生成的repport中不可见。但报告的结尾是一个全新的空页。 你能告诉我这个例子有什么问题吗?我尝试了很多东西(子报表中的默认值,当No Data=所有节时,子报表标题中的No detaily设置,以及很多东西,我不记得了),但没有任何帮助。

    • 嗯,我有一个主报告和一个子报告,在主报告中我有两个细节带。在第一个细节区,我放置了“主数据源”(来自fillReport),在第二个细节区,我放置了子报告(来自param的数据源)。 解决方案 经过大量的研究,我发现我对“主报告”和“子报告”的概念是错误的。当我们有一个“主报表”(与主数据源相关联)时,正确的做法是所有“子报表”都直接与此相关联。因此,我创建了3个子报告,并像“param”一样传递

    • 有时会出现以下错误: 需要对子报告进行哪些必要的更改以最小化相同? 有时,当数据溢出时,它不显示子报表,而是在< code>iReport中显示剩余的数据。 属性设置如下: 子报表属性: 子报表中的文本字段: 请建议一些东西..

    • 我正在尝试使用 iReport 设计器(两者都具有空数据源)从主报告(report1.jrxml)创建一个子报告(report1_subreport3.jrxml)。主报表详细信息带包含静态文本(“主报表”),子报表元素和子报表在其相应的详细信息带中包含静态文本(“子报表”) 但单击主报表的预览选项卡仅显示静态文本“主报表”,而不显示子报表(“子报表”)的静态文本。 我还浏览了http://com

    • 我已经创建了一个Jasper报告,我正试图将报告集成到主报告中。我可以按原样填充子报表中的数据,但如果我将其集成到主报表中,我就不能呈现我在子报表中呈现的数据。事实上,我在集成子报表的地方得到了空白。

    • 这是我的主报告, 我的子报表 我的bean工厂类,bean被填充,但主报表类字段显示,但子报表列表不显示,请帮助,我已经长出了几缕白发,试图解决这个问题