web-dev-qa-db-ja.com

JasperReportでのJava Beanデータソースの作成/受け渡し

JSFアプリケーションでJasperReportとireportを使用して、その場でレポートを生成しています。これは私が達成しようとしていることです:-

  1. 私の構造(HashMap/ArrayListとして読み取られる)には、レポートに同じものが表示されるようにレポートに渡す必要のあるデータが含まれています。

  2. 私のレポートにはすでにデータソース接続が含まれており、これを使用してDBから値をフェッチし、レポートに入力しています。

  3. コードから渡す必要のあるデータに対してサブレポートを使用し、このサブレポートをメインレポート内に埋め込むことができるように、サブレポートを作成しています。

私の問題は次のとおりです。-1。コレクション(HashMap/ArrayListとして読み取られる)をサブレポートに渡して、コードからのデータをデータに取り込むことができません。

コレクション全体をサブレポートに渡すには、コレクション全体をサブレポートに渡す方法が必要であると確信しています。また、JavaBeanデータソース接続を作成しようとしましたが、接続の作成中にクラスパスエントリがありませんと表示されます。

構造内で値が絶えず変化しているため、それぞれのクラスをjar内にバンドルして、jarをクラスパスに配置することはできません。

データを入力できるように、Java Beanデータソースを作成してレポートに渡す方法を教えてください...

親切にガイド...

更新された部分:-

パラメータをレポートに渡し、レポートを生成するためのJavaコード:-

public class TestDataSource
{
    public static void main(String[] args)
    {

        try {
            JasperDesign jasperDesign = JRXmlLoader.load("D:\\jasperReports\\subReportDataSource.jrxml");
            JasperReport jasperReport =(JasperReport)JasperCompileManager.compileReport(jasperDesign);
            Map<String,Object> parameters = new HashMap<String,Object>();
            parameters.put ("Title",generateCollection());

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

            JasperViewer.viewReport(jasperPrint);
            }catch(Exception e)
            {
                e.printStackTrace();
            }
    }

    public static ArrayList<PersonBean> generateCollection()
    {
        ArrayList<PersonBean> arrlist=new ArrayList<PersonBean>();
        arrlist.add(new PersonBean("A", 20));
        arrlist.add(new PersonBean("B",30));
        arrlist.add(new PersonBean("C",40));
        arrlist.add(new PersonBean("D",50));
        arrlist.add(new PersonBean("E",40));
        arrlist.add(new PersonBean("F",60));

        return arrlist;
    }

}

ここで、新しいレポート(Report)を作成しました。その中にサブレポート(Sub-Report)を配置しました。サブレポートのデータソースを新しいnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource($ P {題名})

接続タイプ:-データソース接続タイプを使用します。

サブレポート内に、NameとAgeの2つの静的フィールドを配置しました。渡されているハッシュマップに値として存在する値を出力するようにレポート/サブレポートに指示するにはどうすればよいですか。

10
AngelsandDemons

すでにデータソースがある場合は、レポートに入力するときに、リスト/マップをパラメータマップに渡すことができます。

Map<String, Object> param = new HashMap<String, Object>();
param.put("SUB_DATA_SOURCE", yourList);

JasperFillManager.fillReport(jasperReport, param,
                new JRBeanCollectionDataSource(yourMainListHere));

そのためには、パラメータマップで設定したのと同じ名前でMAINレポート内にパラメータを作成し、これにタイプクラス(私の場合はリスト)を指定する必要があります。

サブレポート要素を作成し、接続タイプを「データソース式を使用する」として設定する必要がある場合よりも、「データソース式」内で次のように設定します。

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_DATA_SOURCE})
9
Diego Urenia