我有一个网络应用,客户要求查看一些报告。方法是使用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,但是如果我能帮助它,我宁愿不读它。
答案 0 :(得分:18)
.jrxml
,则仅将.jasper
个文件编译为.jrxml
个文件。通常,您只需加载.jasper
文件并完全跳过编译。它要快得多。.jasper
和.jrxml
个文件存储在您的网络根目录之外。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/"
$P{ROOT_DIR}
相关的参考项(例如,$P{IMAGE_DIR}
是根据$P{ROOT_DIR}
定义的。$P{ROOT_DIR}
的值。然后在必要时使用表达式。例如,引用子报告如下:
<subreportExpression>
<![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]>
</subreportExpression>
这将允许子报表目录在不同环境之间变化。
答案 1 :(得分:2)
我遇到了同样的问题,我得到了解决方案。首先,将报表中使用的每个对象(子报表,图像等)和所有扩展名(.jasper,.jrxml)放在一个文件夹中,并将该文件夹放在C://磁盘中。它现在可能放在我的文档中,或任何在单词之间有空格的路径,然后iReport将其视为“我的%20Documents”,这让他感到困惑。
因此,将文件夹放在C://中,将与报告相关的所有内容放在同一个文件夹中,并将相对路径放到所有内容中。这应该工作。希望我帮助过任何人。
答案 2 :(得分:-1)
Path path = Paths.get("", new String[0]);
String reportPath=path.toAbsolutePath().toString()+//reports//letter.jrxml";
JasperDesign jd = JRXmlLoader.load(reportPath);