[英]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)
經過幾天的研究,我可以修復它並且它有效。
我們需要將 JSP Jasper Dependency 和 Jasper Studio(報表設計工具)的版本更新為相同。
確保我們在 Jasper 報告中正確創建字段和參數,並且與我們從 JSP 分配的相同。
如果我們使用 JRBeanCollectionDataSource,我們必須只使用一個 dataSource pass throw 到 sub-report。 這意味着我們必須在 ArrayList 中使用 ArrayList。
在子報表中,我們必須使用 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.