java Jasper Reports 中的子报表

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3067502/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 00:11:26  来源:igfitidea点击:

Subreports in Jasper Reports

javajasper-reportsreport

提问by Karthikeyan

I have two tables to be printed in same page. Data for those tables will be supplied from a map from a custom data source. I need to implement it. I googled for implementing this task.

我有两个表格要打印在同一页上。这些表的数据将由来自自定义数据源的地图提供。我需要实施它。我用谷歌搜索来实现这个任务。

At that time I came across sub-reports concept, but I didn't get much info for how to implement sub-reports.

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

I have an idea of how to create sub-reports. But I don't know how to fill sub reports with customdatasource. That's my question. Please help me in achieving this.

我知道如何创建子报告。但我不知道如何使用自定义数据源填充子报告。这是我的问题。请帮助我实现这一目标。

Note: I tried to implement subreports, but I am getting an error. Here is the code I used for compiling subreports:

注意:我尝试实现子报表,但出现错误。这是我用于编译子报表的代码:

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);

Here I have compiled subreport1& subreport2individually and added them as a parameter in map. Then I'm getting an error while filling it through masterreports. Please help me to compile the report.

在这里,我单独编译subreport1&subreport2并将它们添加为地图中的参数。然后我在通过 masterreports 填写时遇到错误。请帮我编译报告。

Stack trace of the compiler error:

编译器错误的堆栈跟踪:

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)

线程“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.爪哇:53)fillReport(Unknown Source) at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(Unknown Source) at ReportTableCompiler.main(ReportTableCompiler.java:53)fillReport(Unknown Source) at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(Unknown Source) at ReportTableCompiler.main(ReportTableCompiler.java:53)

采纳答案by User 1034

I posted the answer for the similar question. You can check the answer here.

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

Using iReport with eclipse to generate reports approperly

使用 iReport 和 eclipse 正确生成报告

回答by Cadu

If you have only one detail band and your subreportExpression is something like "SUBREPORT_1.jasper" you can use this to compile several subreports

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

回答by m_pGladiator

Sub reports are just like any other normal reports. They have own JRXML file and use own data sources. You can invoke the subreport alone or inside a master report, using the sub report tool. The data source in this case is specified in the master JRXML, the sub report properties dialog, Subreport tab, and it is different than the master's report data source.

子报告就像任何其他普通报告一样。他们有自己的 JRXML 文件并使用自己的数据源。您可以使用子报表工具单独调用子报表或在主报表中调用子报表。本例中的数据源在主JRXML、子报表属性对话框、子报表选项卡中指定,与主报表数据源不同。

I don't completely understand what are you trying to do, but you can also supply parameters to the sub report, so it filters its data based on the current row from the master table.

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