0

私はJavaで取り組んでいるジャスパーレポートを持っています。

Java では、次のコードを使用して Bean にデータを動的に入力できます。

    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>

私の問題は、同じレポート内の 2 つの異なるテーブルに対して動的にこれを行う方法を考え出すことです。動的に追加されるデータの反復を 1 回しか使用できないようです。同じレポート内に生成された 2 つの完全に異なるテーブルがある結果を達成しようとしています。この質問が明確でない場合は、お知らせください。修正を試みます。ありがとう。

4

3 に答える 3

0

beanCollection を保持する別の Bean を作成することにより、複数の Bean コレクションをレポートに渡すことができます。そのような Bean は次のようになります。

public class DataBean {
    private Collection beanCollection = null;

    public DataBean() {
    }

    public Collection getBeanCollection() {
        return beanCollection;
    }

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

他のコレクションは とは異なるタイプになると思いThemeBeanます。FruitBean例として使用しています。渡す Bean コレクションごとに、 を作成し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ます。このレポートで使用できるフィールドは 1 つだけです。$F{beanCollection}

サブレポートのデータソース式を次のように設定します

new JRBeanCollectionDataSource($F{beanCollection}).

ThemeBeanまたはのフィールドFruitBeanがサブレポート内で使用可能になります。

サブレポートの代わりにリスト コンポーネントを使用したい場合は、それも機能します。

于 2013-03-22T10:46:39.437 に答える
0

Jasper のイデオロギー: 1 つのレポート - 1 つのデータソース。

メイン レポートで 2 つのサブレポートを使用します。Main.jrxml には、subreport1 (表示 List<ThemeBean> 用) と subreport2 (List<AnotherBean> 用) が含まれています。サブレポート 1 とサブレポート 2 は、タイトル (または概要) バンドに配置されます。

Main.jrxml でパラメーターを定義します: themesPar、anotherPar として java.util.Collection

コレクションをパラメーターとしてメイン レポートに挿入します。

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());

メインレポートのサブレポート1データソース式については、次のように記述します

new JRBeanCollectionDataSource($P{themesPar})

subreport2 の $P{anotherPar} で同じ方法を使用します。どちらの場合もサブレポートに設定

Connection Type = "Use a datasource expression"

なぜ初心者がこの質問をするのですか?:) このソリューションが jasperforge FAQ に存在しないのはなぜですか?

于 2013-03-22T10:00:31.303 に答える