报告设计无效。未找到字段 Jasper Reports
Report design not valid. Field not found Jasper Reports
我正在尝试使用 JRBeanCollectionDataSource
创建一个基本的 jasper 报告。在那里我有一个 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 报告的初学者,任何人都可以告诉我我在这里做错了什么。谢谢
尝试使用子报表。我在我的本地数据库中启动了您的示例,没有任何问题。
这是我的学生对象列表:
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 和学生子报告,只需稍作更改。希望对您有所帮助。
您必须在使用前定义字段。
在您的 jrxml
中,您在子数据集中定义了三个字段 students
,id
和 students
。但是您还没有定义 name
并在 jrxml
中使用它,这就是您收到此异常的原因。
尝试定义 name
,如
<field name="name" class="java.lang.String"/>
发现问题。 name 属性应在 subdataset
内定义。不然不行
<subDataset name="dataset1" uuid="09015d96-ad5a-4fed-aa9e-19d25e02e205">
<field name="name" class="java.lang.String"/>
</subDataset>
我正在尝试使用 JRBeanCollectionDataSource
创建一个基本的 jasper 报告。在那里我有一个 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 报告的初学者,任何人都可以告诉我我在这里做错了什么。谢谢
尝试使用子报表。我在我的本地数据库中启动了您的示例,没有任何问题。
这是我的学生对象列表:
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 和学生子报告,只需稍作更改。希望对您有所帮助。
您必须在使用前定义字段。
在您的 jrxml
中,您在子数据集中定义了三个字段 students
,id
和 students
。但是您还没有定义 name
并在 jrxml
中使用它,这就是您收到此异常的原因。
尝试定义 name
,如
<field name="name" class="java.lang.String"/>
发现问题。 name 属性应在 subdataset
内定义。不然不行
<subDataset name="dataset1" uuid="09015d96-ad5a-4fed-aa9e-19d25e02e205">
<field name="name" class="java.lang.String"/>
</subDataset>