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

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

柳玄裳
2023-03-14

我在使用ArrayList作为JasperReport中的主要数据源时遇到了问题。

我的程序是一个简单的Java程序,我有一个非常简单的报告。我的ArrayList中有两个数据对象,我用JRBeanGrou

我基本上是按照这个教程,然后添加另一个项目到数组列表。但是只有一个打印出来。

代码片段:

ArrayList<ProtoReport> listOfReports = new ArrayList<ProtoReport>();

ProtoReport protoReport1 = new ProtoReport();
ProtoReport protoReport2 = new ProtoReport();

//Simple Fields and text
protoReport1.setTitle("Example Fact Sheet");
protoReport2.setTitle("2nd Fact Sheet");

//add all reports to the list
listOfReports.add(protoReport1);
listOfReports.add(protoReport2);

//and wrap the ArrayList in a JRBeanCollectionDataSource
JRBeanCollectionDataSource beanBurritoWrap = new JRBeanCollectionDataSource(listOfReports);

//build the jasper report
JasperReport jasperReport;
JasperPrint jasperPrint;
HashMap<String, Object> hashMap = new HashMap<>();
boolean reportCreated;

try {
    jasperReport = JasperCompileManager.compileReport(jrxmlLocation);
    jasperPrint = JasperFillManager.fillReport(jasperReport, hashMap, beanBurritoWrap);
    JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
    reportCreated = true;
} catch (JRException e) {
    e.printStackTrace();
    reportCreated = false;
}

//Report on build status
System.out.println("Jasper Report built: " + 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";
}

加上一个参数化的构造函数,然后是getter和setter等

编译没有问题,第一份报告导出为pdf也没有问题。我得到的唯一警告是:

log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
log4j:WARN Please initialize the log4j system properly.

但我不认为这与这个问题有任何关系(如果这不是真的,请纠正我)。

这是我的. 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="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>

有人知道我做错了什么吗?

编辑

好的,我根据AlexK的建议做了一些更改,将我所有的字段、图表和表格移动到详细信息1带,但是现在当我去编译时,我得到了以下错误:

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");

并尝试了相对路径和绝对路径,但得到相同的错误。这些是否相关,或者我应该为此错误创建一个新帖子?

编辑

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

共有1个答案

袁晋鹏
2023-03-14

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

你应该把文本字段(与

更多关于乐队的信息从JasperReport终极指南:

  • 标题带 - 这是报告的第一部分。它在报表填充过程中仅生成一次,表示结果文档的开头。
  • 详细信息范围 - 对于数据源中的每条记录,引擎会尝试生成此部分。细节部分可以由多个波段组成。

这篇关于使用JavaBean数据源的文章可以帮助了解如何使用JavaBean数据源。

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

 类似资料:
  • 问题内容: 我如何在arraylist“列表”中打印元素“ e”? 问题答案: 您是要打印整个列表还是要遍历列表的每个元素?两种打印您的类有意义的东西的方法都需要重写该类的方法(如其他答案所述)以返回有效结果。 此代码的输出是:

  • 我想获取ArrayList的每个元素并使用它来创建一个字符串: 包含与ArrayList和、、中的元素一样多的单词 将为每个单词打印ArrayList中的int值 为了更清楚,我想打印一个字符串,如下所示: 不幸的是,我只从ArrayList中获取最后一个整数的值,但“元素”字数是正确的,所以我的实际结果字符串如下所示: ArrayList只有4个元素: 要生成此错误字符串,我使用以下代码: 那么

  • 问题内容: 我已经开发了用于报告目的的Web应用程序。为此,我必须使用Applet在客户端查看报告。我通常可以在applet中看到报表,但是当涉及到打印时(当我单击Viewer中的“打印”按钮时),它将引发一个异常,该异常可以在Java Console中看到。我浏览了很多有关此问题的内容,并做了网上专家建议的一切。我将用作网站服务器时,在文件中添加了授予权限。此外,还向我的applet添加了授予权

  • 问题内容: 我需要通过jasperreport打印整个地图 例: 应该选择什么数据源? 包含哪些报告来源? PS:我不想直接获得像$ P {key11}这样的值 问题答案: 我会尝试这样的 在碧玉报告中,您的字段将是 注意:我如何使用Bean 和创建数据源 如果您只想实现a 并使用,则将不会对值进行排序。

  • 应该选择什么数据源? containts报告来源应该是什么? PS:我不想直接获得像$P{key11}这样的值

  • 问题内容: 谁能帮助解释为什么JNDI应该是公开数据库/ jms等服务的首选方式? 我遇到的所有帖子都谈到了不必加载特定的驱动程序管理器,从连接池中受益等优点,但是可以通过在属性文件中指定驱动程序管理器并使用反射来轻松实现。 连接池也可以通过将正确的实现方式通过spring或其他方式连接到应用Bean中来实现。 那么,为什么使用JNDI会更好呢? 问题答案: 当您必须在不同环境之间移动应用程序时,