簡體   English   中英

如何使用 JSP 將數據源傳遞給子報表並在碧玉報表中加載 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 從文件加載 object 時找不到:D:\Working\WebServer\wildfly-21.0.0F. \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 報告中正確創建字段和參數,並且與我們從 JSP 分配的相同。

  3. 如果我們使用 JRBeanCollectionDataSource,我們必須只使用一個 dataSource pass throw 到 sub-report。 這意味着我們必須在 ArrayList 中使用 ArrayList。

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

暫無
暫無

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

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