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