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

oewdyzsn  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(404)

请帮忙。我只创建了jasper报告主报告,工作正常。但当我给它添加子报告时。它会导致错误。它不能计算我输入的参数。我也尝试使用(jasperreport)jrloader.loadobjectfromfile(jrxmlfile\u 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:09547错误[stderr](默认任务-1)net.sf.jasperreports.engine.fill.jrepressionevalexception:计算源文本的表达式时出错:$p{subreport\u dir}
20:57:09548 deployment.helloworld.war//net.sf.jasperreports.engine.fill.jrevaluator.handleevaluationexception(jrevaluator)处出现错误[stderr](默认任务-1)。java:287)
20:57:09548 deployment.helloworld.war//net.sf.jasperreports.engine.fill.jrevaluator.evaluate(jrevaluator)处出现错误[stderr](默认任务-1)。java:319)
20:57:09548 deployment.helloworld.war//net.sf.jasperreports.engine.fill.jrcalculator.evaluate(jrcalculator)处出现错误[stderr](默认任务-1)。java:671)
20:57:09549 deployment.helloworld.war//net.sf.jasperreports.engine.fill.jrcalculator.evaluate(jrcalculator)处出现错误[stderr](默认任务-1)。java:639)
当我尝试使用:(jasperreport)jrloader.loadobjectfromfile(jrxmlfile\u jasper)时,也出现了错误

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

(jasperreport)jrloader的错误:我看到错误显示的最后一个位置是“.”,我不知道为什么它会自动添加“.”。我是一个新的贾斯珀报告我试图寻找解决方案已经两天了,但我不能修复它。请帮忙。
21:12:47644错误[stderr](默认任务-1)net.sf.jasperreports.engine.jrexception:从文件d:\working\webserver\wildfly-21.0.0.final\standalone\deployments\helloworld.war\reports\productreport.jasper加载对象时找不到类。
21:12:47645 deployment.helloworld.war//net.sf.jasperreports.engine.util.jrloader.loadobject(jrloader)处出现错误[stderr](默认任务-1)。java:152)
21:12:47645 deployment.helloworld.war//net.sf.jasperreports.engine.util.jrloader.loadobject(jrloader)处出现错误[stderr](默认任务-1)。java:116)
21:12:47645 deployment.helloworld.war//net.sf.jasperreports.engine.util.jrloader.loadobjectfromfile(jrloader)处出现错误[stderr](默认任务-1)。java:107)

wvyml7n5

wvyml7n51#

经过几天的研究,我可以解决它,它的工作。
我们需要更新jsp jasper dependency和jasper studio(报表设计工具)的版本,使之相同。
确保在jasper报告中正确地创建字段和参数,并且与从jsp分配的字段和参数相同。
如果我们使用jrbeancollectiondatasource,我们只能使用一个数据源传递到子报表。这意味着我们必须在arraylist中使用arraylist。
在子报表中,我们必须使用datasourceexpression:new net.sf.jasperreports.engine.data.jrbeancollectiondatasource($field\u datasource\u to\u sub-report\u class\u is\u arraylist)

相关问题