代码之家  ›  专栏  ›  技术社区  ›  Karthikeyan

Jasper报告中的子报表

  •  2
  • Karthikeyan  · 技术社区  · 15 年前

    我有两张桌子要印在同一页上。这些表的数据将从自定义数据源的映射提供。我需要实现它。我在谷歌上搜索这项任务的执行情况。

    当时我遇到了子报告的概念,但是我没有得到关于如何实现子报告的太多信息。

    我知道如何创建子报表。但我不知道如何用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 单独添加它们作为映射中的参数。然后我在填写主报告时出错了。请帮我编制这份报告。

    编译器错误的堆栈跟踪:

    线程“main”中出现异常net.sf.jasperReports.engine.jrRuntimeException:未知打印顺序0。 at net.sf.jasperReports.engine.fill.jrfillsubreport.initsubreportfiller(未知源) at net.sf.jasperReports.engine.fill.jrfillSubReport.evaluateSubReport(未知源) at net.sf.jasperReports.engine.fill.jrfillSubReport.evaluate(未知源) at net.sf.jasperReports.engine.fill.jrfillElementContainer.evaluate(未知源) at net.sf.jasperReports.engine.fill.jrfillBand.evaluate(未知源) at net.sf.jasperReports.engine.fill.jrVerticalFiller.FillColumnBand(未知源) at net.sf.jasperReports.engine.fill.jrVerticalFiller.fillDetail(未知源) at net.sf.jasperReports.engine.fill.jrVerticalFiller.fillReportsStart(未知源) at net.sf.jasperReports.engine.fill.jrVerticalFiller.fillReport(未知源) at net.sf.jasperReports.engine.fill.jrbasefiller.fill(未知源) at net.sf.jasperReports.engine.fill.jrbasefiller.fill(未知源) at net.sf.jasperReports.engine.fill.jrfiller.fillReport(未知源) at net.sf.jasperReports.engine.jasperfillManager.fillReport(未知源) at net.sf.jasperreports.engine.jasperfillmanager.fillreporttofile(未知源) 在RePrtTabeCoprMr.MULL(ReaveTabeCoprimer-Java:53)

    3 回复  |  直到 13 年前
        1
  •  0
  •   Community CDub    8 年前

    我公布了类似问题的答案。你可以在这里查一下答案。

    Using iReport with eclipse to generate reports approperly

        2
  •  1
  •   Cadu    15 年前

    如果只有一个细节带,并且子报表表达类似于“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);
           }
       }
    
        3
  •  0
  •   m_pGladiator    15 年前

    子报表和其他普通报表一样。他们有自己的jrxml文件并使用自己的数据源。您可以使用子报表工具单独或在主报表内调用子报表。在这种情况下,数据源在主JRXML、子报表属性对话框、子报表选项卡中指定,它与主报表数据源不同。

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