贾斯珀报告中的子报告
我有两张表格可以在同一页面上打印。这些表格的数据将通过自定义数据源的地图提供。我需要实施它。我用Google来执行这项任务。贾斯珀报告中的子报告
那时我遇到了分报告的概念,但是我没有得到关于如何实现分报告的很多信息。
我对如何创建子报告有一个想法。但我不知道如何用customdatasource填充子报表。这是我的问题。请帮助我实现这一点。
注意:我试图实现子报表,但出现错误。下面是我用于编译子报表代码:
JasperPrint print = new JasperPrint();
JRPdfExporter exporter = new JRPdfExporter();
JasperDesign design, design1;
JasperReport report, report1;
JasperReport jasperReport;
JasperDesign jd1;
jd1 = JRXmlLoader.load("D:\\sub_report1.jrxml");
jasperReport = JasperCompileManager.compileReport(jd1);
Map parameters = new HashMap();
parameters.put("ReportTitle", "Table Report");
parameters.put("DataFile", "TableSource.java");
parameters.put("Subreport_1", jasperReport);
design = JRXmlLoader.load("D:\\sub_report2.jrxml");
report = JasperCompileManager.compileReport(design);
parameters.put("Subreport_2", report);
design1 = JRXmlLoader.load("D:\\master_report.jrxml");
report1 = JasperCompileManager.compileReport(design1);
JasperFillManager.fillReportToFile(report1, "D:\\master_report.jrprint", parameters, new TableDataSource());
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "D:K\\Report.pdf");
exporter.exportReport();
JasperViewer.viewReport(print);
在这里,我单独编译subreport1
& subreport2
并添加它们作为地图的参数。然后,我通过masterreports填充时发生错误。请帮我编写报告。编译器错误的
堆栈跟踪:
Exception in thread "main" net.sf.jasperreports.engine.JRRuntimeException: Unkown print order 0. at net.sf.jasperreports.engine.fill.JRFillSubreport.initSubreportFiller(Unknown Source) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(Unknown Source) at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(Unknown Source) at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(Unknown Source) at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(Unknown Source) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(Unknown Source) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(Unknown Source) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(Unknown Source) at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(Unknown Source) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(Unknown Source) at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(Unknown Source) at net.sf.jasperreports.engine.fill.JRFiller.fillReport(Unknown Source) at net.sf.jasperreports.engine.JasperFillManager.fillReport(Unknown Source) at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(Unknown Source) at ReportTableCompiler.main(ReportTableCompiler.java:53)
我张贴了类似的问题的答案。你可以在这里查看答案。
你已经指定了填写单个报表的代码。但我的问题是如何处理多个报告。即子报表? – Karthikeyan 2010-06-18 07:25:17
子报表与实际报表没有区别。您必须在生成报告之前编译子报告。因此,您可以使用相同的代码库来填充其他报表(子报表)。 – 2010-06-18 07:29:22
顺便说一句,代码不会告诉你如何使用自定义数据源。我为那些有疑问填充报告的人提供了该代码。 – 2010-06-18 07:30:21
子报告,就像任何其他正常的报告。他们拥有自己的JRXML文件并使用自己的数据源。您可以使用子报表工具单独或在主报表中调用子报表。在这种情况下,数据源在主JRXML,子报表属性对话框,子报表选项卡中指定,它与主报表数据源不同。
我不完全明白你想做什么,但你也可以提供参数给子报告,所以它根据主表中的当前行过滤它的数据。
@m_pGladiato:我修改了我的问题请帮我解决这个问题 – Karthikeyan 2010-06-22 09:32:19
如果你只有一个细节带和你的subreportExpression是像“SUBREPORT_1.jasper”你可以用它来编译几个子报表
JRDesignBand jrBand = (JRDesignBand) jasperDesign.getDetailSection().getBands()[0];
JRElement[] jrElements = jrBand.getElements();
for (JRElement jrElement : jrElements) {
if (jrElement instanceof JRDesignSubreport) {
JRDesignSubreport subReportDesign = (JRDesignSubreport) jrElement;
JRExpression jrExpression = subReportDesign.getExpression();
String file = jrExpression.getText();
file = file.substring(1, file.length()-8)+".jrxml";
JasperCompileManager.compileReport(file);
}
}
支付Jasper报表的所有教程。所以你可能无法获得免费的好资源。您可能需要在Google中查询一些帮助。这里的问题应该是具体的。 – 2010-06-18 06:10:55
这是不正确的。 JaspertReports是开源的,有很多免费的教程。 – Bozho 2010-06-18 06:41:14
@Purushotham:我修改了我的问题,现在你能理解了吗 – Karthikeyan 2010-06-18 07:17:10