Java 在JasperReports中使用ArrayList作为主要数据源-仅打印第一个元素

Java 在JasperReports中使用ArrayList作为主要数据源-仅打印第一个元素,java,arraylist,jasper-reports,Java,Arraylist,Jasper Reports,在JasperReports中将ArrayList用作主要数据源时遇到问题 我的程序是一个简单的Java程序,我有一个非常简单的报告。在我的ArrayList中有两个数据对象,我用JRBeanCollectionDataSource包装它们,并通过JasperFillManager将其传递给JRPrint。生成了我的报告,但只生成了第一个数组项 我基本上是在跟踪,然后将另一项添加到ArrayList。但只有一张打印出来 代码段: ArrayList listOfReports=new Array

在JasperReports中将ArrayList用作主要数据源时遇到问题

我的程序是一个简单的Java程序,我有一个非常简单的报告。在我的ArrayList中有两个数据对象,我用JRBeanCollectionDataSource包装它们,并通过JasperFillManager将其传递给JRPrint。生成了我的报告,但只生成了第一个数组项

我基本上是在跟踪,然后将另一项添加到ArrayList。但只有一张打印出来

代码段:

ArrayList listOfReports=new ArrayList();
ProtoReport protoReport1=新的ProtoReport();
ProtoReport protoReport2=新的ProtoReport();
//简单字段和文本
protoReport1.setTitle(“示例事实说明书”);
原始报告2.setTitle(“第二份情况说明书”);
//将所有报告添加到列表中
添加(protoReport1);
添加(protoReport2);
//并将ArrayList包装在JRBeanCollectionDataSource中
JRBeanCollectionDataSource beanBurritoWrap=新的JRBeanCollectionDataSource(报告列表);
//构建jasper报告
贾斯佩雷波特;
茉莉花;
HashMap HashMap=新的HashMap();
创建布尔报告;
试一试{
jasperReport=JasperCompileManager.compileReport(jrmmllocation);
jasperPrint=JasperFillManager.fillReport(jasperReport、hashMap、beanBurritoWrap);
jaspeexportmanager.exportReportToPdfFile(jasperPrint,outputFileName);
reportCreated=true;
}捕获(JRE异常){
e、 printStackTrace();
reportCreated=false;
}
//生成状态报告
System.out.println(“Jasper报告构建:”+reportCreated);
ProtoReport类基本上只是报表字段、表和图表数据的容器
例如:

package org.reportprotojava.protosheet;

import java.util.ArrayList;

public class ProtoReport {

private String outputFileName;
private String title;
private String logoLocation;
private String paragraphText;
private ArrayList<String> tableData;
private String picLocation;
private int[][] graphData;  //TODO decide how to store chart data
private ChartData chartData;
private String path;

//default constructor
public ProtoReport() {

    // Initialize object fields
    outputFileName = "PrototypeReport";
    title = "Prototype Report";
    paragraphText = "Default text";

    tableData = new ArrayList<String>();
    chartData = new ChartData();

    //set path to working directory
    path = System.getProperty("user.dir");

    //default to assumed report location 
    //(ie same folder as .jrxml and .jasper files)
    logoLocation = path + "\\reports";
    picLocation = path + "\\reports";
}
但我不认为这与这个问题有任何关系(如果不是这样,请纠正我)

这是我的.jrxml文件(忽略图表内容,我现在正在处理这个问题,但它正逐渐成为另一个问题的素材;-))

我在谷歌上搜索了一下,发现大多数情况下这是由图像文件位置相关的问题引起的,所以我用以下代码修改了代码:

//Locations

    //Absolute
    protoReport1.setLogoLocation("C:\\Users\\eljaydub\\workspace\\ReportProtoJava\\reports\\logo.gif");
    protoReport1.setPicLocation("C:\\Users\\eljaydub\\workspace\\ReportProtoJava\\reports\\portfolio.jpg");

    //Relative
//      protoReport1.setLogoLocation(protoReport1.getPath() + "\\reports\\logo.gif");
//      protoReport1.setPicLocation(protoReport1.getPath() + "\\reports\\portfolio.jpg");
并且尝试了相对路径和绝对路径,但得到了相同的错误。这些是相关的还是我应该为这个错误创建一个新的帖子

编辑

解决了!AlexK的建议确实解决了第一个问题,然后又揭示了第二个问题:当报告转到下一个数组元素时,protoReport2,它发现此对象的图像链接是由默认构造函数提供的,它只猜测图像文件的可能名称和位置。然后引发异常,因为两个图像的图像属性onErrorType都设置为Error。我只需在iReports中将属性更改为Icon,生成的报告不会出现进一步的问题,我得到了我所期望的结果:两个数组元素打印在不同的页面上,第二个使用默认构造函数值。 谢谢你的帮助

您应该使用细节栏来显示数据源中的数据。标题栏不是遍历数据源的正确选择

您应该将文本字段(带
)和图像(带
)放入详细信息栏


有关带区的其他信息,请参见:

  • 标题栏-这是报告的第一部分。它在报告填写过程中仅生成一次,表示生成文档的开始
  • 详细信息栏-对于数据源中的每条记录,引擎将尝试生成此部分。详图部分可以由多个标注栏组成

本文有助于理解如何使用JavaBean数据源



jasperreports.sourceforge.net网站上的另一篇有用的文章-这篇是。

您的示例中的protoReport1和protoReport2是什么?您能发布您的jrxml文件吗?编辑完成后,如果还有什么我应该发布的,请告诉我,并原谅我愚蠢的新手遗漏。谢谢你看@eljaydub我刚刚在关于使用JavaBean数据源的帖子中添加了一个链接,好吧,这让一切变得更加清楚,JavaBean链接特别有用。非常感谢。我已经将所有字段、图表和表格移到了Detail 1波段,因为我希望每个字段、图表和表格都分别为LisoReports ArrayList中的每个元素生成,但现在我在进行编译时遇到了一个错误(以前没有)。我已经用更多的细节更新了我的帖子。这两个问题相关吗?不,这是关于图像元素的另一个问题。你应该检查图片的路径。这是另一篇文章。这对你会有帮助的好的,明白了!你对第一个问题的解决方案奏效了,这暴露了第二个问题;这与onErrorType图像属性有关。我将编辑我的文章上面的细节。谢谢你的帮助!
<?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="ReportPrototype.jrxml" pageWidth="595" pageHeight="842" columnWidth="495" leftMargin="57" rightMargin="43" topMargin="43" bottomMargin="43" uuid="10825c57-f953-4166-bf03-8ecabe8a8f47">
<property name="ireport.zoom" value="1.0"/>
<property name="ireport.x" value="0"/>
<property name="ireport.y" value="128"/>
<subDataset name="ChartData" uuid="ebdb66fc-82b2-489c-8187-731eed51dd7a">
    <field name="xAxis" class="java.util.List"/>
    <field name="yAxis" class="java.util.List"/>
</subDataset>
<queryString language="SQL">
    <![CDATA[]]>
</queryString>
<field name="title" class="java.lang.String"/>
<field name="logoLocation" class="java.lang.String"/>
<field name="picLocation" class="java.lang.String"/>
<field name="chartData" class="java.lang.Object"/>
<field name="xAxis" class="java.util.List"/>
<field name="yAxis" class="java.util.List"/>
<title>
    <band height="115" splitType="Stretch">
        <textField isStretchWithOverflow="true" pattern="">
            <reportElement uuid="519c6bb5-72f9-4c25-8e91-47865ae0c9df" mode="Opaque" x="0" y="70" width="495" height="45" forecolor="#000099"/>
            <textElement>
                <font size="26"/>
            </textElement>
            <textFieldExpression><![CDATA[$F{title}]]></textFieldExpression>
        </textField>
        <image>
            <reportElement uuid="f989f871-32ea-4f13-ae3f-3f487cde76dd" x="295" y="0" width="200" height="42"/>
            <imageExpression><![CDATA[$F{logoLocation}]]></imageExpression>
        </image>
    </band>
</title>
<pageHeader>
    <band height="45" splitType="Stretch">
        <staticText>
            <reportElement uuid="34054fe4-f5c8-4154-b11e-558ad49c9bed" x="195" y="14" width="100" height="20"/>
            <textElement/>
            <text><![CDATA[Static text]]></text>
        </staticText>
    </band>
</pageHeader>
<columnHeader>
    <band height="105" splitType="Stretch">
        <image>
            <reportElement uuid="3759a707-32a4-49ef-a9c6-b0ad7136f738" x="242" y="0" width="253" height="105"/>
            <imageExpression><![CDATA[$F{picLocation}]]></imageExpression>
        </image>
    </band>
</columnHeader>
<detail>
    <band height="184" splitType="Stretch">
        <xyLineChart>
            <chart>
                <reportElement uuid="3b739a73-6612-42b0-bdf9-46f5d9a9899d" x="0" y="0" width="495" height="184"/>
                <chartTitle/>
                <chartSubtitle/>
                <chartLegend/>
            </chart>
            <xyDataset>
                <dataset>
                    <datasetRun subDataset="ChartData" uuid="d84314f7-4580-4b2b-a190-b0bbe4ea63df">
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JRBeanCollectionDataSource($F{chartData})]]></dataSourceExpression>
                    </datasetRun>
                </dataset>
            </xyDataset>
            <linePlot>
                <plot/>
            </linePlot>
        </xyLineChart>
    </band>
</detail>
<columnFooter>
    <band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
    <band height="45" splitType="Stretch"/>
</pageFooter>
<lastPageFooter>
    <band height="45" splitType="Stretch"/>
</lastPageFooter>
<summary>
    <band height="45" splitType="Stretch"/>
</summary>
net.sf.jasperreports.engine.JRException: Byte data not found at : C:\Users\eljaydub\workspace\ReportProtoJava\reports
at net.sf.jasperreports.repo.RepositoryUtil.getBytesFromLocation(RepositoryUtil.java:324)
at net.sf.jasperreports.engine.RenderableUtil.getRenderable(RenderableUtil.java:121)
at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:505)
at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:442)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:257)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:457)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2037)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:771)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportContent(JRVerticalFiller.java:301)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:148)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:841)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969)
at org.reportprotojava.protosheet.Program.main(Program.java:130)
//Locations

    //Absolute
    protoReport1.setLogoLocation("C:\\Users\\eljaydub\\workspace\\ReportProtoJava\\reports\\logo.gif");
    protoReport1.setPicLocation("C:\\Users\\eljaydub\\workspace\\ReportProtoJava\\reports\\portfolio.jpg");

    //Relative
//      protoReport1.setLogoLocation(protoReport1.getPath() + "\\reports\\logo.gif");
//      protoReport1.setPicLocation(protoReport1.getPath() + "\\reports\\portfolio.jpg");