如何使用 JSP 将数据源传递给子报表并在 jasper 报表中加载 sup 报表

How to pass data source to sub report and load sup report in jasper report using JSP

请帮忙 我只创建 Jasper Report 主报告,它运行良好。 但是当我向它添加子报告时。它会导致错误。 它无法评估我输入的参数。我也尝试使用 (JasperReport) JRLoader.loadObjectFromFile(jrxmlFile_Jasper) 但它导致错误也无法加载文件。

这是我的JSP:

try{
            
    List<Map<String, ?>> dataSource = (List<Map<String, ?>>) request.getAttribute("listProducts");
    JRDataSource jrDataSource = new JRBeanCollectionDataSource(dataSource);

    List<Map<String, ?>> dataSource_sub = (List<Map<String, ?>>) request.getAttribute("listProducts");
    JRDataSource jrDataSource_sub = new JRBeanCollectionDataSource(dataSource);

    /*
    String jrxmlFile_Jasper = session.getServletContext().getRealPath("reports/productreport.jasper");  
    JasperReport jasperReport_onLoad = (JasperReport) JRLoader.loadObjectFromFile(jrxmlFile_Jasper);
    */
    
    String jrxmlFile = session.getServletContext().getRealPath("reports/productreport.jrxml");
    InputStream input = new FileInputStream(new File(jrxmlFile));
    JasperReport jasperReport = JasperCompileManager.compileReport(input);
    
    
    String jrxmlFile_Sub = session.getServletContext().getRealPath("reports/sub_productreport.jrxml");
    InputStream input_sub = new FileInputStream(new File(jrxmlFile_Sub));
    JasperReport jasperReport_Sub = JasperCompileManager.compileReport(input_sub);
    
    
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put("SUBREPORT_DIR", jasperReport_Sub);

    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, jrDataSource);

    JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
    response.getOutputStream().flush();
    response.getOutputStream().close(); 
    
}catch(Exception e){
    e.printStackTrace();
}

这是 Jasper 主报告中的子报告:

         <subreport>
            <reportElement x="150" y="22" width="200" height="30" uuid="d1150b63-2c7b-4dcc-858c-b73dbe178455"/>
            <subreportParameter name="SUBREPORT_DIR">
                <subreportParameterExpression><![CDATA[""]]></subreportParameterExpression>
            </subreportParameter>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR}]]></subreportExpression>
        </subreport>

这是我得到的错误:

20:57:09,547 错误 [stderr](默认任务 1)net.sf.jasperreports.engine.fill.JRExpressionEvalException:计算源文本的表达式时出错:$P{SUBREPORT_DIR}

20:57:09,548 错误 [stderr](默认任务 1)在 deployment.helloworld.war//net.sf.jasperreports.engine.fill.JREvaluator.handleEvaluationException(JREvaluator.java:287)

20:57:09,548 错误 [stderr](默认任务 1)在 deployment.helloworld.war//net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:319)

20:57:09,548 错误 [stderr](默认任务 1)在 deployment.helloworld.war//net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:671)

20:57:09,549 错误 [stderr](默认任务 1)在 deployment.helloworld.war//net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:639)

我在尝试使用时也遇到了错误:(JasperReport) JRLoader.loadObjectFromFile(jrxmlFile_Jasper)

    String jrxmlFile_Jasper = session.getServletContext().getRealPath("reports/productreport.jasper");  
    JasperReport jasperReport_onLoad = (JasperReport) JRLoader.loadObjectFromFile(jrxmlFile_Jasper);


    

(JasperReport) JRLoader错误:我看到错误显示的最后一个位置有“.”,我不知道为什么它会自动添加“.”。我是 Jasper Report 的新手,我已经尝试搜索解决方案两天了,但我无法修复它。请帮忙

21:12:47,644 错误 [stderr](默认任务 1)net.sf.jasperreports.engine.JRException:从文件加载对象时找不到 Class:D:\Working\WebServer\wildfly-21.0.0.Final\standalone\deployments\helloworld.war\reports\productreport.jasper.

21:12:47,645 错误 [stderr](默认任务 1)在 deployment.helloworld.war//net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:152)

21:12:47,645 错误 [stderr](默认任务 1)在 deployment.helloworld.war//net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:116)

21:12:47,645 错误 [stderr](默认任务 1)在 deployment.helloworld.war//net.sf.jasperreports.engine.util.JRLoader.loadObjectFromFile(JRLoader.java: 107)

研究了几天,修复成功了

  1. 我们需要将 JSP Jasper Dependency 和 Jasper Studio(报表设计工具)的版本更新为相同。

  2. 确保我们在 Jasper Report 中正确创建了字段和参数,并且与我们从 JSP 分配的相同。

  3. 如果我们使用JRBeanCollectionDataSource,我们必须只使用一个dataSource pass throw到子报表。这意味着我们必须在ArrayList中使用ArrayList。

  4. 在子报表中,我们必须使用dataSourceExpression: new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource ($Field_dataSource_to_Sub-Report_that_class_is_ArrayList)