簡體   English   中英

Jasper報表中的子報表

[英]Subreports in Jasper Reports

我有兩個表要打印在同一頁上。 這些表的數據將從自定義數據源的映射中提供。 我需要實現它。 我用谷歌搜索執行此任務。

當時我遇到了子報表的概念,但是我沒有獲得有關如何實現子報表的大量信息。

我對如何創建子報表有一個想法。 但是我不知道如何用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);

在這里,我分別編譯了subreport1subreport2 ,並將它們添加為map中的參數。 然后在通過masterreports填充它時出現錯誤。 請幫助我編寫報告。

堆棧跟蹤的編譯器錯誤:

net.sf.jasperreports.engine.JRRuntimeException線程“主”中的異常:net.sf.jasperreports.engine.fill處net.sf.jasperreports.engine.fill.JRFillSubreport.initSubreportFiller(未知源)處的打印順序為未知。 net.sf.jasperreports.engine.fill.JRFillSubreport.evaluateSubreport(未知源)位於net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(未知源)位於net.sf.jasperreports處。 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(未知源)的net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(未知源)的engine.fill.JRFillBand.evaluate(未知源)。 net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(未知源)的sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(未知源)net.sf.jasperreports.engine.fill.JRBaseFiller.fill(未知源) )net.sf.jasperreports.eng上的(JRBaseFiller.fill) ine.fill.JRFiller.fillReport(未知源)位於net.sf.jasperreports.engine.JasperFillManager.fillReport(未知源)位於net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(未知源)位於ReportTableCompiler.main(ReportTableCompiler。 Java的:53)

如果只有一個詳細信息區域,並且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);
       }
   }

我發布了類似問題的答案。 您可以在此處查看答案。

將iReport與eclipse結合使用可正確生成報告

子報告與其他任何普通報告一樣。 它們具有自己的JRXML文件並使用自己的數據源。 您可以使用子報表工具單獨或在主報表中調用子報表。 在這種情況下,數據源是在主JRXML,子報表屬性對話框,“子報表”選項卡中指定的,它與主報表數據源不同。

我不完全了解您要做什么,但是您也可以為子報表提供參數,因此它會基於主表中的當前行過濾其數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM