2010-04-08 4 views
6

Я оцениваю JasperReport и iReport, требование - создать многостраничный отчет, в котором каждая страница содержит другой отчет.Многостраничный отчет JasperReports с различным контентом

Пример:
Страница 1 содержит фактический счет-фактуру для клиента
Page 2 содержит список счетов-фактур для клиента
Page 3 содержит график количества счетов-фактур по годам
Page 4 содержит только фиксированный текст (скажем, инструкции оператора ...)

Возможно ли создать такой уникальный отчет вместо создания четырех автономных отчетов, а затем объединить PDF-файлы.

Большое спасибо.

Francesco

ответ

1

Да, это возможно. Вы можете создать весь отчет в виде композиции из четырех отдельных подписок. Это позволит их повторное использование и разделение проблем.

0

Да, вы можете даже включать отчеты, которые не имеют отношения к клиенту, «если это имеет смысл».

Кроме того, чтобы сделать вещи еще более интересными, после заполнения этого отчета вы можете поместить его в другой отчет , тогда вы получите тот же отчет для нескольких клиентов.

8

Я пробовал что-то другое.

Я использовал Ireport 4.1.3, и если вы щелкните правой кнопкой мыши по секции detail1, вы можете добавить еще один раздел.

Добавить страницу клюва, и все готово.

Надеется, что это помогает :) Привету

+0

Это не сработает для переменного количества секций деталей справа? – CodeMonkey

3

Да, вы можете путь создания DataSource и параметров карта для каждого подпроекта отчета в вашем основном докладе,

Источник данных содержит список, который будет отображаться в таблицу в отчете

Параметры карта содержит ключи и значения текстовых полей в отчете

хорошая новость заключается в том, что вы можете ВКЛЮЧАЕТ е все параметры всех страниц в каждой Параметры отображения, то в отчете для каждой страницы будет извлекать его параметры и забывает другие :)

Пример:

List<Map<String, Object>> ParamList = new ArrayList<Map<String, Object>>(); 
List<JRDataSource> SourceList = new ArrayList<JRDataSource>(); 

Map<String, Object> params = new HashMap<String, Object>(); 
params.put("Page1_param1", "value1_1"); 
params.put("Page1_param2", "value1_2"); 
params.put("Page1_param3", "value1_3"); 
.. 
params.put("Page2_param1", "value2_1"); 
params.put("Page2_param2", "value2_2"); 
params.put("Page2_param3", "value2_3"); 
.. 
params.put("Page3_param1", "value3_1"); 
params.put("Page3_param2", "value3_2"); 
params.put("Page3_param3", "value3_3"); 
.. 
.. 
List listResult_1 = //select table sql for example 
List listResult_2 = //select table sql for example 
List listResult_3 = //select table sql for example 

JRDataSource dataSource_1 = new ListOfArrayDataSource(
listResult_1, new String[] {"LastName", "FirstName", "address"}); 

JRDataSource dataSource_2 = new ListOfArrayDataSource(
listResult_2, new String[] {"LastName", "FirstName", "address"}); 

JRDataSource dataSource_3 = new ListOfArrayDataSource(
listResult_3, new String[] {"LastName", "FirstName", "address"}); 

// Yes i know ! :D , we put the same params list then as i said befor every sub report will take its own parameters values, so don't worry about this task ;) 
ParamList.add(params); 
ParamList.add(params); 
ParamList.add(params); 

SourceList.add(dataSource_1); 
SourceList.add(dataSource_2); 
SourceList.add(dataSource_3); 

File reportFile = // the jrxml file template of the report 

// We can use also a list of reportFile, so that every page uses his own template :D 


CreateReport(jasperReport, ParamList, SourceList); 

} 

Теперь мы создаем каждый суб отчет и приложить его к основной отчет:

Public void CreateReport(File reportFile, List<Map<String, Object>> ParamList, List<JRDataSource> SourceList){ 

    JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath()); 
    Map<String, Object> parameters = paramList.get(0); 
    JRDataSource datasource = datasourceList.get(0); 
    jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, datasource); 

    if(paramList.size()>1){ 
     for(int i=1; i < paramList.size(); i++) 
     { 
      JasperPrint jasperPrint_next = JasperFillManager.fillReport(jasperReport, paramList.get(i), datasourceList.get(i)); 
      List pages = jasperPrint_next.getPages(); 
      for (int j = 0; j < pages.size(); j++) { 
       JRPrintPage object = (JRPrintPage) pages.get(j); 
       jasperPrint.addPage(object); 
      } 
     } 
    } 

}