将 JasperReports 与相对路径一起使用

Posted

技术标签:

【中文标题】将 JasperReports 与相对路径一起使用【英文标题】:Using JasperReports with a relative path 【发布时间】:2011-07-19 14:28:25 【问题描述】:

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

I have already asked something like this。但是今天我发现报告文件(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

当更改为相对路径时。我已经在网上搜索了如何改变我的适应症没有成功。

我有 jasper API 的 javaDoc,但如果我能提供帮助,我宁愿不通读它。

【问题讨论】:

似乎我忘记添加 pars 的声明,它只是一个新的 HasMap() (因为我正在尝试的报告没有变量)。对不起,放错地方了! 【参考方案1】: 路径必须是绝对路径。 只有在修改.jrxml 时才将.jrxml 文件编译为.jasper 文件。通常你可以只加载.jasper 文件并完全跳过编译。它要快得多。 将 .jasper.jrxml 文件存储在您的 Web 根目录之外。 在所有报告中创建以下参数:
   ROOT_DIR = "/full/path/to/reports/"
   IMAGE_DIR = $PROOT_DIR + "图像/"
   STYLES_DIR = $PROOT_DIR + "样式/"
   SUBREPORT_DIR = $PROOT_DIR + "子报告/"
   COMMON_DIR = $PROOT_DIR + "common/"
$PROOT_DIR 相关的引用项(例如,$PIMAGE_DIR 是根据$PROOT_DIR 定义的)。 从您的环境中传递$PROOT_DIR 的值。 将您的应用程序松散地耦合到您使用的任何报告框架。

然后在必要时使用表达式。例如,引用子报表如下:

<subreportExpression>
  <![CDATA[$PSUBREPORT_DIR + "subreport.jasper"]]>
</subreportExpression>

这将允许子报表目录在不同环境之间变化。

【讨论】:

@Random:我并不是建议您不要使用 JasperReports。离得很远。我建议您使用一个使用 JasperReports 而没有紧密耦合的实现。 (有效地隔离架构组件。)【参考方案2】:

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

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

【讨论】:

这个项目有一段时间了,我没有代码来测试它了。但想法是 Jasper 将能够使用一些相对路径,例如 /JRXML_files/account/account_report.jrxml(在 WebContent 内部)。尽管在发布时 Jasper 有一个新版本,但希望他们能接受这条路径。谢谢,我希望我能尽快尝试。 是的,我了解您的问题。几天前我在 iReport 3.7.2 上遇到了同样的问题,最后弄明白了让他感到困惑的地方。无论如何,只是想在某个地方发布答案,因为我看到很多关于同一问题的问题。 它在 Web 应用程序中没有用,就像我看到您的解决方案仅适用于独立应用程序一样。

以上是关于将 JasperReports 与相对路径一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Dotnet Core 3.1:如何将 AddJsonFile 与文件的绝对路径一起使用?

delphi 打开本机相对路径的.html文件

POI与jasperReports的关系

JasperReports 怎么与 spring boot集成

在带有符号链接的可执行文件中使用相对路径

IE 在引用 CSS 文件时不支持基本元素中的相对路径