2012-07-12 4 views
1

Мой Java код для создания отчетов Джасперне в состоянии использовать подотчетов в JasperReports

JasperReport report = JasperCompileManager.compileReport(jrxml); 
JasperPrint print = JasperFillManager.fillReport(report,parameters, conn); 
JasperExportManager.exportReportToPdfFile(print,filename); 

Его работает успешно, когда я создаю отчеты без использования отчетов суб. Когда я вставив любой подотчет мой код не удается, и исключение говорит

Причина: нулевой

MESSAGEnull

LOCAL MESSAGEnull

Пожалуйста, скажите мне, если мне нужно изменить мой Java-код?

Я прочитал эту строку где-нибудь, чтобы использовать подзаголовки.

JasperReport subreport = (JasperReport)JRLoader.loadObjectFromLocation("ProductReport.jasper"); 

Нужно ли использовать этот код? Я разработчик PHP. Не знаю много о Java. Я использовал отчеты Jasper, потому что нам нужно создавать большой PDF-файл. Этот инструмент нам очень помог. Но теперь я застрял в новом отчете, где мне нужно использовать информацию о субрепортаже.

+0

Вы можете посмотреть [этот пост] (http://stackoverflow.com/a/9786261/876298) –

ответ

1

Я использовал IREPORT 4.1.3, а мой файл jar в java-коде был Jasperreports-3.7.6.jar. Я много раз читал, что версия обоих должна быть одинаковой. Поэтому я попробовал и загрузил jasperreports-4.1.3.jar и использовал его. Это сработало. Теперь нет проблем с подзаголовками.

1

Это стало большим препятствием для меня, но здесь мы идем.

Прежде всего, вы должны выбрать, если вы получите отчет от .jrxml или .jasper

Если вы выбираете JRXML вы должны скомпилировать его, это код JRXML:

JasperReport report = JasperCompileManager.compileReport(jrxml); 

вы можете заметить, что вы делаете это уже, так что если вы хотите загрузить вы SubReport таким же образом, вы можете передать файл JRXML вашего подотчета таким же образом и поместить это в другой переменной:

JasperReport subReport = JasperCompileManager.compileReport(subReportjrxml); 

Когда мне нужно было поставить подотчета внутри моего основного доклада я только что прошел файл яшмы в качестве параметра внутри моей HashMap, как это:

Map<String, Object> params = new HashMap<String, Object>; 

params.put("SUB_REPORT", subReport); 

(вы положили «Params» в fillReport, но вы должны заполнить только mainReport, потому что, когда вы передаете свой SubReport в качестве параметра, он также должен быть заполнен)

Внутри редактора iReport в главном отчете вы создаете параметр с тем же именем «SUB_REPORT», вы можете сделать это в ReportInspector (или что-то в этом роде) ставит этот тип как объект.

Выберите элемент subReportElement и перейдите к свойствам, там вы увидите свойство под названием SubReport Expression, там вы разместили созданный параметр.

+0

его не работает !!! –

1

Я считаю, D.Родригес на самом деле дал вам правильное решение, я исследовал аналогичную проблему в течение последних трех дней без везения и, наконец, исправился с предложением Д. Родригеса. Я понимаю, что это сообщение год назад, я публикую это, потому что надеюсь, что кому-то удастся столкнуться с подобным вопросом в будущем.

Моя ситуация: У меня есть JasperReport, который содержит несколько уровней подписок, я хотел бы запустить его в приложении Java, построенном в Netbeans. Первоначально я использовал getResources() для моего основного отчета, когда я его запускаю, он отлично работает в среде IDE, но когда я его создаю и запускаю из jar, он дает «исключение, не найденное в файле», я попробовал альтернативу используя «Inputstream», и использовать подрепорт в качестве входного параметра, он всегда дает «входной поток ошибок загрузки», после дней исследований я был разочарован, и он работал с этим.

так что идея вам необходимо получить основной отчет

JasperReport main = (JasperReport)JRLoader.loadObject(this.getClass().getResource("main.jasper")); 

и ВСЕ подотчетов как ресурсы

JasperReport sub1 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub1.jasper")); 
JasperReport sub2 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub2.jasper")); 
JasperReport sub3 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub3.jasper")); 
JasperReport sub4 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub4.jasper")); 

(есть 4 подотчетов в приведенном выше примере)

С вами передают вложенные отчеты как «параметры», поэтому вам нужно иметь эти параметры в своих отчетах, и вам нужно убедиться, что эти параметры достигают уровня, на котором они используются, для моего, е слои Главной Sub1 Sub2 Sub3, Sub4

Так что на моем основном, у меня есть параметры: sub1, sub2, sub3, sub4, установите их все как "Объект" в классе параметров, установите выражение subrepot на " $ P {sub1} ", который будет вызывать subreport« Sub1 »при запуске, а в параметрах subreport добавить $ P {sub2}, $ P {sub3}, $ P {sub3}, потому что вы используете эти параметры в подписях, но на Java-код, вы только можете значения в основном отчете

И так далее так далее для слоев после того, мой код, наконец, в Java является:

JasperReport jr = (JasperReport)JRLoader.loadObject(this.getClass().getResource("main.jasper")); 
JasperReport sub1 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub1.jasper")); 
JasperReport sub2 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub2.jasper")); 
JasperReport sub3 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub3.jasper")); 
JasperReport sub4 = (JasperReport)JRLoader.loadObject(this.getClass().getResource("sub4.jasper")); 
Map para = new HashMap(); 
para.put("Sub1", sub1); 
para.put("Sub2", sub2); 
para.put("Sub3", sub3); 
para.put("Sub4", sub4); 
JasperPrint jp = JasperFillManager.fillReport(jr, para, conn); 
JasperViewer.viewReport(jp, false);  

и он работает как волшебство!

Если это все еще не работает, пожалуйста, комментарий или отправить мне по электронной почте по адресу: [email protected]

Я хотел бы видеть, что я могу сделать!

Смежные вопросы