我有两张桌子要打印在同一页面上。这些表的数据将从自定义数据源的映射中提供。我需要实现它。我用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)
答案 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)
我发布了类似问题的答案。你可以在这里查看答案。
答案 2 :(得分:0)
子报告就像任何其他正常报告一样。他们拥有自己的JRXML文件并使用自己的数据源。您可以使用子报表工具单独或在主报表内调用子报表。在这种情况下,数据源在主JRXML,子报表属性对话框,子报表选项卡中指定,并且与主报表数据源不同。
我不完全理解您要做什么,但您也可以为子报表提供参数,因此它会根据主表中的当前行过滤其数据。