Использование JasperReports с относительным путем - PullRequest
12 голосов
/ 21 марта 2011

У меня есть веб-приложение, и клиент запросил несколько отчетов.Подход состоял в том, чтобы использовать 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, но я бы не стал его читать, если смогу помочь.

Ответы [ 3 ]

19 голосов
/ 02 апреля 2011
  • Пути должны быть абсолютными.
  • Компилировать .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>

Это позволит варьировать каталог подотчета в разных средах.

2 голосов
/ 17 марта 2014

У меня была такая же проблема, и я получил решение.Сначала поместите каждый объект (вложенный отчет, изображение и т. Д.), Использованный в отчете, и все расширения (.jasper, .jrxml) в одну папку и поместите эту папку на диск C: //.Вероятно, теперь он находится где-то в «Моих документах» или в любом пути с пробелами между словами, а затем iReport видит его как «My% 20Documents», и это его смущает.

Итак, поместите папку в C: //, поместите все материалы, связанные с вашим отчетом, в одну папку и укажите относительные пути ко всему.Это должно работать.Надеюсь, я кому-нибудь помог.

0 голосов
/ 20 апреля 2019
Path path = Paths.get("", new String[0]);   
String reportPath=path.toAbsolutePath().toString()+//reports//letter.jrxml";

JasperDesign jd = JRXmlLoader.load(reportPath);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...