贾斯珀报告中的子报告

时间:2010-06-18 05:58:34

标签: java jasper-reports report

我有两张桌子要打印在同一页面上。这些表的数据将从自定义数据源的映射中提供。我需要实现它。我用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填充它时出错。请帮我编写报告。

编译器错误的堆栈跟踪:

  

线程“main”中的异常net.sf.jasperreports.engine.JRRuntimeException:未知的打印顺序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)       在ReportTableCompiler.main(ReportTableCompiler.java:53)

3 个答案:

答案 0 :(得分:1)

如果您只有一个详细信息区域,并且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);
       }
   }

答案 1 :(得分:0)

我发布了类似问题的答案。你可以在这里查看答案。

Using iReport with eclipse to generate reports approperly

答案 2 :(得分:0)

子报告就像任何其他正常报告一样。他们拥有自己的JRXML文件并使用自己的数据源。您可以使用子报表工具单独或在主报表内调用子报表。在这种情况下,数据源在主JRXML,子报表属性对话框,子报表选项卡中指定,并且与主报表数据源不同。

我不完全理解您要做什么,但您也可以为子报表提供参数,因此它会根据主表中的当前行过滤其数据。

相关问题