Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用具有相对路径的JasperReports_Java_Jasper Reports - Fatal编程技术网

Java 使用具有相对路径的JasperReports

Java 使用具有相对路径的JasperReports,java,jasper-reports,Java,Jasper Reports,我有一个web应用程序,客户要求查看一些报告。方法是使用iReport并在屏幕上向他们显示报告 。但今天,我发现报告文件(jrxml)的路径是绝对的。所以我必须改变程序,让它接受相对路径。我一直在尝试这样做,但jrxml或编译(.jasper)文件似乎都不接受编译或填充报告的相对路径 这就是我到目前为止所得到的: //path is generated as request.getContextPath() + "/jrxmlFiles/" public void generateReport(

我有一个web应用程序,客户要求查看一些报告。方法是使用iReport并在屏幕上向他们显示报告

。但今天,我发现报告文件(jrxml)的路径是绝对的。所以我必须改变程序,让它接受相对路径。我一直在尝试这样做,但jrxml或编译(.jasper)文件似乎都不接受编译或填充报告的相对路径

这就是我到目前为止所得到的:

//path is generated as request.getContextPath() + "/jrxmlFiles/"
public void generateReport(HttpServletResponse res, ConexionAdmin con, String path) throws Exception{ 

    ServletOutputStream out = null;
    ByteArrayOutputStream bos    = new ByteArrayOutputStream();

    JasperDesign jasperDesign = JRXmlLoader.load(path);
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

  byte[] bytes = JasperRunManager.runReportToPdf(jasperReport, pars, con.initConexion());
        res.setContentType("application/pdf");
  res.setContentLength(bytes.length);
  out = res.getOutputStream();
  out.write(bytes, 0, bytes.length);

  res.setHeader("Cache-Control", "cache");
  res.setHeader("Content-Disposition", "attachment; filename=report.pdf"); 
  res.setHeader("Pragma", "cache");
  res.setContentLength(bos.size());

  out.write(bos.toByteArray());
  out.flush();
  bos.close();
  out.close(); 
  res.flushBuffer();
}
这似乎适用于绝对路径,但让我感到:

Exception Message
net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException
当更改为相对路径时。我在网上搜索了一下,但没有找到适合自己的方法

我有jasperapi的javaDoc,但是如果我能帮上忙的话,我宁愿不通读它

  • 路径必须是绝对的
  • 如果正在修改
    .jrxml
    ,则仅将
    .jrxml
    文件编译为
    .jasper
    文件。通常,您可以加载
    .jasper
    文件,然后完全跳过编译。速度快得多
  • .jasper
    .jrxml
    文件存储在web根目录之外
  • 在所有报告中创建以下参数: ROOT_DIR = "/full/path/to/reports/" IMAGE_DIR = $P{ROOT_DIR} + "images/" STYLES_DIR = $P{ROOT_DIR} + "styles/" SUBREPORT_DIR = $P{ROOT_DIR} + "subreports/" COMMON_DIR = $P{ROOT_DIR} + "common/"
    这将允许子报表目录在不同的环境中变化。

    我也遇到了同样的问题,我得到了解决方案。首先,将报表中使用的每个对象(子报表、图像等)和所有扩展(.jasper、.jrxml)放在一个文件夹中,并将该文件夹放在C://磁盘中。它现在可能被放在我的文档中的某个地方,或者任何单词之间有空格的路径中,然后iReport将其视为“我的%20文档”,这让他感到困惑


    因此,将文件夹放在C://,将所有与报表相关的内容放在同一文件夹中,并将所有内容的相对路径放在同一文件夹中。这应该行得通。希望我能帮助任何人。

    似乎我已经放弃添加PAR声明,它只是一个新的HasMap()(因为我正在尝试的报告没有变量)。对不起,放错地方了@Random:我不是建议你不要使用JasperReports。远非如此。我建议您使用一个使用JasperReports而不紧密耦合的实现。(有效地隔离了体系结构组件。)这个项目已经有很长一段时间了,我再也没有代码来测试它了。但当时的想法是,Jasper将能够使用一些相对路径,例如/JRXML_files/account/account_report.JRXML(在WebContent内部)。虽然在这篇文章发表的时候,贾斯珀有了一个新的版本,希望他们能接受。谢谢,我希望我能尽快尝试。是的,我理解你的问题。几天前,我在iReport 3.7.2上也遇到了同样的问题,最终我弄明白了什么让他困惑。不管怎样,我只是想把答案贴在某个地方,因为我看到了很多关于同一问题的问题。它在web应用程序中没有用处,就像我看到你的解决方案只能在独立应用程序中工作一样。
    <subreportExpression>
      <![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]>
    </subreportExpression>