连接主报表和子报表 - 将对象列表传递到子报表 [英] Connect master report and subreport - passing list of objects to subreport
本文介绍了连接主报表和子报表 - 将对象列表传递到子报表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在使用 iReport 4.5.1 ,我遇到了连接主报告和子报告的问题。
I'm using the iReport 4.5.1 and I've faced a problem with connecting master report and subreport.
我有两个对象:
- 帐户 (accountID,date,listOfParagraphs) - 所有字段都在主报表中定义;
- 段落(account,paragraphNo,someObject) - 在子报表中定义的所有字段( stavke.jrxml )。
- Account (accountID, date, listOfParagraphs) - all fields are defined in master report;
- Paragraph (account, paragraphNo, someObject) - all fields defined in subreport(stavke.jrxml).
listOfParagraphs 定义为 java.util.List<段落>
(对象列表)我想将其传递给子报告。
The listOfParagraphs is defined as java.util.List<Paragraph>
(List of objects) and I want to pass it to subreport.
我在主报告中定义了这个子报告的属性:
I've defined this subreport's properties in master report:
- 子报告表达式: stavke.jasper
- 表达式类: java.lang.String
- 连接类型:使用数据源表达式
- 数据源表达:
- Subreport expression: stavke.jasper
- Expression class: java.lang.String
- Connection type: Use a datasource expression
- Datasource expression:
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfParagraphs})
我收到此错误:
net.sf.jasperreports.engine.JRException: Error loading object from file : stavke.jasper
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:101)
at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:253)
at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateReport(JRFillSubreport.java:301)
.....
我为此努力了,但我无法解决。
I've tried so hard about this, but i can't solve it.
有人可以帮助我吗?
@Vyccus(已编辑)
@Vyccus (edited)
我改变了路径:
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["C:\\Documents and Settings\\D\\My Documents\\NetBeansProjects\\Project\\subreport\\"]]></defaultValueExpression>
</parameter>
和
<subreport>
<reportElement x="0" y="42" width="555" height="100"/>
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{ls})]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "stavke.jasper"]]></subreportExpression>
</subreport>
现在我明白了:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.lang.Class.isAssignableFrom(Native Method)
at net.sf.jasperreports.engine.fill.JRFillTextField.getFormat(JRFillTextField.java:706)
at net.sf.jasperreports.engine.fill.JRFillTextField.evaluateText(JRFillTextField.java:394)
at net.sf.jasperreports.engine.fill.JRFillTextField.evaluate(JRFillTextField.java:368)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:258)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:499)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2036)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:760)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:270)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:864)
at net.sf.jasperreports.engine.fill.JRFillSubreport.fillSubreport(JRFillSubreport.java:613)
at net.sf.jasperreports.engine.fill.JRSubreportRunnable.run(JRSubreportRunnable.java:59)
at net.sf.jasperreports.engine.fill.JRThreadSubreportRunner.run(JRThreadSubreportRunner.java:205)
at java.lang.Thread.run(Thread.java:662)
推荐答案
Java代码:
Map<String, Object> parameters = new HashMap<String, Object>();
//if you want this to be compiled in runtime
JasperReport jasperReport = JasperCompileManager.compileReport(your JRXMLReport path file here);
JasperReport subReport = JasperCompileManager.compileReport(your JRXMLSubReport path file here);
//you can notice that there're a lot of overloaded mathods to compile it, you can choose
//what is better in your case
//if you want to use the complied file *.jasper
JasperReport jasperReport = (JasperReport)JRLoader.loadObject(new File("filenameReport.jasper"));
JasperReport subReport = (JasperReport)JRLoader.loadObject(new File("filenameSubReport.jasper"));
//Then you add your subReport in your parameter Map
parameters.put("SUBREPORT_JASPER_FILE", subReport);
JasperFillManager.fillReport(jasperReport, parameters,
new JRBeanCollectionDataSource(yourList));
JRXML:
<parameter name="SUBREPORT_JASPER_FILE" class="java.lang.Object"/> // you can also create this using the option in your iReport
<subreport>
<reportElement uuid="c62c7896-f37a-4e76-a4cb-70e2545947da" style="Style" x="279" y="0" width="296" height="15"/>
<dataSourceExpression>
<![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{yourSubList})]]>
</dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_JASPER_FILE}]]></subreportExpression>
</subreport>
我认为你将完成你想要做的事情
I think that way you'll accomplish what you're trying to do
这篇关于连接主报表和子报表 - 将对象列表传递到子报表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文