2013-03-20 3 views
0

У меня есть отчет Jasper, над которым я работаю в Java.Как динамически добавлять несколько частей данных в отчеты Jasper

В Java можно динамически заполнять боб с данными с помощью следующего кода:

List<ThemeBean> themes = new ArrayList<ThemeBean>(); 
    CSVReader csvReader = new CSVReader(new FileReader(csvFilename)); 
    List<String[]> data = csvReader.readAll(); 
    for(String[] d : data) { 
     ThemeBean tb = new ThemeBean(); 
     tb.setThemes(d[0]); 
     tb.setComments(d[1]); 
     tb.setSentiment(d[2]); 
     themes.add(tb); 
    } 
     JasperDesign jasperDesign = JRXmlLoader.load(fileName); 
     JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(themes); 
     JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
     JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, ds); 

Это хорошо работает, когда файл .jrxml указал правильные поля и textFieldExpression в тегах ...

следующая получает динамически заполняется список, который был построен:

<textFieldExpression><![CDATA[$F{themes}]]></textFieldExpression> 

Моя проблема является выяснение того, как сделать это динамично два дифф в том же отчете. Кажется, что я могу использовать только одну итерацию данных для динамического добавления. Я пытаюсь достичь результата, когда у меня есть две совершенно разные таблицы, созданные в одном отчете. Если этот вопрос не ясен, сообщите мне, и я попытаюсь его исправить. Благодарю.

+0

Я не уверен, если я полностью понимаю ваш вопрос, как я использую и старую версию Jasper, и я на самом деле не иметь дело с базовую архитектуру, поскольку она уже реализована в нашей системе, но, возможно, то, что вы собираетесь использовать, - это подписи. – jonny2k9

+0

Что означает «два разных набора данных»?
1. Является ли попытка использовать Список и список в одном сообщении? И показывать все записи в одной таблице?
2. Или пытается использовать список для первого выполнения и список для второго исполнения? С одним полем $ F {themes} – sanBez

+0

Это попытка использовать Список в одной таблице, а List - это другая таблица, но все в том же отчете – Tyrick

ответ

0

Джасперская идеология: один отчет - один источник данных.

Используйте 2 подзаголовка в основном отчете. Main.jrxml содержит subreport1 (для отображения списка <ThemeBean>) и subreport2 (для списка <AnotherBean>). Subreport1 и Subreport2 помещаются в группу Title (или Summary).

Определение параметров в Main.jrxml: themesPar, anotherPar в java.util.Collection

коллекция Put в качестве параметров в основной отчет:

List<ThemeBean> themes = new ArrayList<ThemeBean>(); 
themes.add(...); 
... 
List<AnotherBean> blablas = new ArrayList<AnotherBean>(); 
blablas.add(...); 
... 

HashMap<String, Object> parameters = new HashMap<String, Object>(); 
parameters.put("themesPar", themes); 
parameters.put("anotherPar", blablas); 

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource()); 

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

new JRBeanCollectionDataSource($P{themesPar}) 

и использовать то же самое с $ P {anotherPar} для subreport2. В обоих случаях набор для подотчетов

Connection Type = "Use a datasource expression" 

Почему любой начинающий задать этот вопрос ??? :) Почему это решение не присутствует в jasperforge FAQ?

0

Вы можете передать несколько коллекций bean в отчет, создав еще один bean-элемент, который содержит beanCollection. Такая фасоль будет выглядеть следующим образом:

public class DataBean { 
    private Collection beanCollection = null; 

    public DataBean() { 
    } 

    public Collection getBeanCollection() { 
     return beanCollection; 
    } 

    public void setBeanCollection(Collection beanCollection) { 
     this.beanCollection = beanCollection; 
    } 
} 

Я полагаю, что другая коллекция будет другого типа, чем ThemeBean. В качестве примера я использую FruitBean. Для каждой коллекции бобов, которую вы хотите передать, вы создаете DataBean и добавьте ее в коллекцию, затем передайте , что коллекции к отчету. Так что ваш код будет меняться, чтобы быть что-то вроде этого:

List<DataBean> allData = new ArrayList<DataBean>(); 

//...Create and populate `List<ThemeBean> themes` 

DataBean db = new DataBean(); 
db.setBeanCollection(themes); 
allData.add(db); 

//...Create and populate `List<FruitBean> fruits` 

db = new DataBean(); 
db.setBeanCollection(fruits); 
allData.add(db); 

//... Load the report 
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(allData); 
//... Fill the report 

отчет, который вы заполняете этот источник данных будет отчет оболочки, содержащий подотчет для каждого DataBean вы создали.Там будет доступен только в этом отчете одно поле: $F{beanCollection}

Установите DataSource выражение подотчета (ов)

new JRBeanCollectionDataSource($F{beanCollection}).

Поля для ThemeBean или FruitBean затем будут доступны в рамках отчета.

Если вы предпочитаете использовать компоненты списка вместо подписок, это также сработает.

0

Джасперская идеология: один отчет - один источник данных.

Используйте 2 подзаголовка в основном отчете. Main.jrxml содержит subreport1 (для отображения списка) и subreport2 (для списка). Subreport1 и Subreport2 помещаются в группу Title (или Summary).

Определение параметров в Main.jrxml: themesPar, anotherPar в java.util.Collection

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