【问题标题】:Report design not valid. Field not found Jasper Reports报告设计无效。未找到字段 Jasper 报告
【发布时间】:2015-06-20 09:48:43
【问题描述】:

我正在尝试使用JRBeanCollectionDataSource 创建一个基本的碧玉报告。在那里,我在 javabean 中有一个对象列表。

public class Course {

    private int id;
    private List<Student> students;
}

学生对象的样子

public class Student {

    private String name;
    private int id;
}

我想在我的报告中打印学生信息。这就是我的 jrxml 的样子

 <subDataset name="dataset1" uuid="09015d96-ad5a-4fed-aa9e-19d25e02e205">
 <field name="students" class="java.util.List">
  <fieldDescription><![CDATA[students]]></fieldDescription>
 </field>
</subDataset>

<field name="id" class="java.lang.Integer"/>
<field name="students" class="java.util.List"/>
<field name="name" class="java.lang.String"/>

<componentElement>
                <reportElement x="200" y="0" width="400" height="20"/>
                <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.data.JRBeanCollectionDataSource($F{students})]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="20" width="400">
                        <textField>
                            <reportElement x="0" y="0" width="100" height="20"/>
                            <box leftPadding="10">
                                <topPen lineWidth="1.0"/>
                                <leftPen lineWidth="1.0"/>
                                <bottomPen lineWidth="1.0"/>
                                <rightPen lineWidth="1.0"/>
                            </box>
                            <textElement/>
                            <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
                        </textField>

                    </jr:listContents>
                </jr:list>
            </componentElement>

但是当我运行这个时,我得到了

net.sf.jasperreports.engine.design.JRValidationException: Report design not valid : 
     1. Field not found : name
Report design not valid : 
     1. Field not found : name

我是 jasper 报告的初学者,谁能告诉我我在这里做错了什么。谢谢

【问题讨论】:

标签: java jasper-reports


【解决方案1】:

您必须在使用之前定义字段。

在您的jrxml 中,您在子数据集中定义了三个字段studentsidstudents。但是您尚未定义 name 并在您的 jrxml 中使用它,这就是您收到此异常的原因。

尝试定义name,喜欢

<field name="name" class="java.lang.String"/>

【讨论】:

  • 感谢您的回复。我在 jrxml 中定义了 name 属性。仍然得到同样的错误:(
  • 感谢您的建议!仅出于完整性考虑:在 iReport 中,您还需要添加字段 - 您将在报告检查器中找到它们。
【解决方案2】:

尝试使用子报表。我在本地数据库中启动了您的示例,没有任何问题。

这是我的学生对象列表:

private List<Student> getList(){
    List<Student> students = new ArrayList<Student>();
    Connection con = ....; //Retrieve your connection the way you want
    ResultSet rs = con.createStatement().executeQuery("select name, id from students order by id");
    while (rs.next()){
        students.add(new Student(rs.getString(1), rs.getInt(2)));
    }
    con.close();
    return students;
}

这就是我从 Java 程序传递 JRBeanCollectionDataSource 对象的方式:

Map<String, Object> params = new HashMap<String, Object>();
params.put("SUBREPORT_DATASOURCE", new JRBeanCollectionDataSource(getList()));

String jasperPath = "....."; //where you have your compiled jasper report file
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperPath, params, new JREmptyDataSource(1));

这是xlm主报告“reportStudent.jrxml”:

    <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="reportStudent" 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"/>
    <parameter name="SUBREPORT_DATASOURCE" class="net.sf.jasperreports.engine.JRDataSource" isForPrompting="false">
        <defaultValueExpression><![CDATA[]]></defaultValueExpression>
    </parameter>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="125" splitType="Stretch">
            <subreport>
                <reportElement x="0" y="0" width="555" height="125"/>
                <dataSourceExpression><![CDATA[$P{SUBREPORT_DATASOURCE}]]></dataSourceExpression>
                <subreportExpression><![CDATA["./reportStudent_subreport1.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

这是子报告“reportStudent_subreport1.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="reportStudent_subreport1" language="groovy" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <property name="ireport.zoom" value="1.771561000000001"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <field name="id" class="java.lang.String"/>
    <field name="name" class="java.lang.String"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <columnHeader>
        <band height="20" splitType="Stretch">
            <staticText>
                <reportElement x="66" y="0" width="100" height="20"/>
                <textElement/>
                <text><![CDATA[id]]></text>
            </staticText>
            <staticText>
                <reportElement x="212" y="0" width="100" height="20"/>
                <textElement/>
                <text><![CDATA[name]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="66" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="212" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

这仅适用于一份学生名单。您可以在主报告中进行迭代,并在详细信息带中打印您的课程 ID 和学生子报告,只需稍作更改。希望它有助于开始。

【讨论】:

  • 是否可以在不使用子报表的情况下做到这一点?
  • 您可以在详细信息部分插入表格或交叉表并打印您的学生列表。您必须配置必要的参数才能将它们发送到该表/交叉表。认为在您的 JRBeanCollectionDataSource 中的一个对象(在您的情况下是一个课程)中,会打印详细信息带
【解决方案3】:

找出问题所在。 name 属性应该在subdataset 中定义。不然就不行了

<subDataset name="dataset1" uuid="09015d96-ad5a-4fed-aa9e-19d25e02e205">
     <field name="name" class="java.lang.String"/>
</subDataset>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多