我有一个主报告和子报告,当我在计算机上运行它时,它运行正常。但是,当我将应用程序运行并在另一台计算机上运行时,它无效并显示错误“无法从位置加载对象”。我已将主报告和子报告放在同一文件夹中,但它不起作用。该错误告诉子报告始终读取旧目录。 这是我的代码:
JasperDesign jasperDesign = JasperManager.loadXmlDesign(new File(".").getCanonicalPath()+ "\\report\\report2.jrxml");
报告2是我的主要报告。
这是我的子报告表达式:
$P{SUBREPORT_DIR} + "subreport1.jasper"
有什么解决方案吗?
答案 0 :(得分:2)
我建议您不要将jrxml
路径指定为子报表表达式,而只需在运行时从类路径编译子报表,然后将编译后的子报表作为参数传递给报表。然后将该参数用作子报表表达式
Java代码
JasperReport jasperReport = null;
String reportName = "MySubreport.jrxml";
//load the the subreport jrxml from the classpath
InputStream ins = this.getClass().getClassLoader().getResourceAsStream(reportName);
JasperDesign design = JRXmlLoader.load(ins);
try {
jasperReport = JasperCompileManager.compileReport(design);
} catch (JRException e) {
e.printStackTrace();
}
//pass the jasperReport object as a parameter to the report
Map<String, Object> reportParams = new HashMap<String, Object>();
reportParams.put("SUB_JASPER", jasperReport);
//finally pass the parameter map to the report.
<强> JRXML 强>
net.sf.jasperreports.engine.JasperReport
net.sf.jasperreports.engine.JasperReport
,将子报表表达式设置为您创建的包含已编译子报表的参数。这样,你只需要将你的jrxmls放在你的类路径中然后你就可以了。