请帮忙。我只创建了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)
1条答案
按热度按时间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)