我在使用ArrayList作为JasperReports中的主数据源时遇到了问题.
我的程序是一个简单的Java程序,我有一个非常简单的报告.我在ArrayList中有两个数据对象,我用JRBeanCollectionDataSource包装它们,并通过JasperFillManager将它传递给JRPrint.生成了我的报告,但只生成了第一个数组项.
我基本上遵循this tutorial,然后将另一个项添加到ArrayList.但只有一个打印出来.
代码段:
ArrayList listOfReports = new ArrayList();
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 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 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();
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文件(忽略图表的东西,我现在正在努力,但它正在形成另一个问题的材料;-))
有没有人知道我做错了什么?
编辑
好的我已经根据AlexK的建议进行了一些更改,将我的所有字段,图表和表格移动到Detail 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时,它发现该对象的图像链接是我的默认构造函数提供的,只猜测可能的图像文件的名称和位置.然后抛出异常,因为两个图像的imageType属性onErrorType都设置为Error.我只需要在iReports中将属性更改为Icon,生成的报告没有进一步的问题,我得到了我的预期:两个数组元素打印在不同的页面上,第二个使用默认的构造函数值.
谢谢您的帮助!