Использование JasperReports с относительным путем
У меня есть веб-приложение, и клиент запросил несколько отчетов. Подход состоял в том, чтобы использовать 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
при изменении на относительный путь. Я обыскал сеть без каких-либо успехов в том, как изменить мои подгонки.
У меня есть javaDoc для jasper API, но я скорее не прочитал его, если смогу помочь.
Ответы
Ответ 1
Затем при необходимости используйте выражения. Например, ссылочные вложенные отчеты:
<subreportExpression>
<![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]>
</subreportExpression>
Это позволит каталогу подчиненности меняться между средами.
Ответ 2
У меня была та же проблема, и я получил решение. Сначала поместите каждый объект (подзаголовок, изображение и т.д.), Используемый в отчете, и все расширения (.jasper,.jrxml) в одной папке и поместите эту папку в диск C://. Вероятно, теперь он находится где-то в My Documents или в любом пути, в котором есть пробелы между словами, а затем iReport видит его как "My %20Documents", и он смущает его.
Итак, поместите папку в C://, поместите все материалы, относящиеся к вашему отчету, в одну папку и поместите относительные пути ко всему. Это должно сработать. Надеюсь, я помог всем.
Ответ 3
Path path = Paths.get("", new String[0]);
String reportPath=path.toAbsolutePath().toString()+//reports//letter.jrxml";
JasperDesign jd = JRXmlLoader.load(reportPath);