【问题标题】:How to pass ArrayList to JasperReports?如何将 ArrayList 传递给 JasperReports?
【发布时间】:2010-09-02 07:17:05
【问题描述】:

我是JasperReports 的新手。我想将ArrayList 传递给子报表的子报表。

我有一个包含一个 subreport1 的主报告,而这个 subreport1 封装了一个
subreport2 里面。

现在如何将arrayList传递给subreport2?

点赞MasterReport -> SubReport -> SubReport

注意:我正在使用iReport 创建 jasper 模板并将数据列表从我的 DAO java 类传递给 jasper。

下面是我的 Form bean 类

public class CollatReportData extends BaseItem {

    private List<CusipData> listCusipData = null;
    private String dealerID = null;
    private String tripID = null;
    private String loanNo = null;
    private String dealerName = null;
    private String tripDealerLoan = null;

    public CollatReportData() {
        super();
    }

    public List<CusipData> getListCusipData() {
        return listCusipData;
    }

    public void setListCusipData(List<CusipData> listCusipData) {
        this.listCusipData = listCusipData;
    }

    public String getDealerID() {
        return dealerID;
    }

    public void setDealerID(String dealerID) {
        this.dealerID = dealerID;
    }

    public String getTripID() {
        return tripID;
    }

    public void setTripID(String tripID) {
        this.tripID = tripID;
    }
} // and so on for other variables..

我的 DAO java 类在下面

public List<Object> getCollatData(String custName, String ctripid, 
        String dealerid, String userID) {

    final Connection conn = super.getCurrentConnection();
    String sqlQueryTrip = null;
    ResultSet rsCollat = null;
    String tripID = null;
    String dealerID = null;
    String cusSysID = null;
    String loanNo = null;
    String txnNo = null;
    String cusipNo = null;
    String cusipStatus = null;
    String parVal = null;
    String tripDealerLoan = null;
    String OldtripDealerLoan = "";
    String NewtripDealerLoan = "";

    CollatReportData reportData = null;
    CusipData cusipData = null;
    List listCusip = new ArrayList<Object>();
    List CollatList = new ArrayList<Object>();
    try {
        PreparedStatement pstmtTrip;
        sqlQueryTrip = "SELECT iscl_sys_id, iscl_trip_id, iscl_trip_dealer_id, "
                + "iscl_cus_sys_id, iscl_bankref_cd, iscl_bdas_db_cd, "
                + "iscl_loan_no, iscl_txn_no, iscl_cusip_no, iscl_status_cd, "
                + "iscl_sec_de_tx, iscl_par_val_am, iscl_market_val_am, "
                + "scl_pri_source_cd, iscl_colla_mar_val_am, iscl_mature_dt, "
                + "iscl_sec_ty, iscl_sec_rt, iscl_sec_price_am, iscl_sec_factor, "
                + "iscl_sec_margin, iscl_sec_accrued_am "
                + "FROM BDS_DBA.INVCONF_SHELL_COLLAT "
                + "WHERE iscl_cus_sys_id='" + custName + "'";
        pstmtTrip = conn.prepareStatement(sqlQueryTrip);
        rsCollat = pstmtTrip.executeQuery();
        if (rsCollat != null) {
            while (rsCollat.next()) {
                tripID = rsCollat.getString("iscl_trip_id");
                dealerID = rsCollat.getString("iscl_trip_dealer_id");
                loanNo = rsCollat.getString("iscl_loan_no");

                tripDealerLoan = tripID + dealerID + loanNo;
                cusipData = new CusipData();
                cusipData.setTripID(tripID);
                cusipData.setCusipNo(cusipNo);
                cusipData.setTripDealerLoan(tripDealerLoan);

                listCusip.add(cusipData);
            } // end rsCollat
        } // end if
        CusipData cusipData1 = new CusipData();
        List CusipList = new ArrayList<Object>();

        for (int io = 0; io < listCusip.size(); io++) {
            cusipData1 = (CusipData) listCusip.get(io);
            NewtripDealerLoan = cusipData1.getTripDealerLoan();
            tripID = cusipData1.getTripID();
            dealerID = cusipData1.getDealerID();
            loanNo = cusipData1.getLoanNo();

            if (NewtripDealerLoan.equalsIgnoreCase(OldtripDealerLoan) || OldtripDealerLoan.equalsIgnoreCase("")) {
                CusipList.add(cusipData1);

            }
            if (!NewtripDealerLoan.equalsIgnoreCase(OldtripDealerLoan)) {
                reportData = new CollatReportData();
                reportData.setTripID(tripID);
                reportData.setTripDealerLoan(NewtripDealerLoan);
                reportData.setListCusipData(CusipList);
                //and so on
                //........
                CollatList.add(reportData);

                CusipList = null;
            }
            OldtripDealerLoan = NewtripDealerLoan;
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        System.out.println("Inside LoanDetailDAO:strTripQuery:Exception" + sqlQueryTrip + e);
    }

    return CollatList;
}

上面的 DAO 类返回 List 并通过 Hashmap Param 将这个 Arraylist 传递给 Jasper 模板。

下面是我的示例 Master jasper 模板,从这里我将 ArrayList 传递给 subReport

     <parameter name="list" isForPrompting="false" class="java.util.List"/>

     <detail>
        <band height="100"  isSplitAllowed="true" >
            <subreport  isUsingCache="true">
                <reportElement
                    x="30"
                    y="20"
                    width="170"
                    height="40"
                    key="subreport-1"/>
                <dataSourceExpression><![CDATA[new JRBeanCollectionDataSource( $P{list})]]></dataSourceExpression>
                <subreportExpression  class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "Collateral_SubReport1.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>

其中$p{list} 是ArrayList。并使用此列表照常在 subReport1 中打印

在运行代码时,我收到以下错误:

Error retrieving field value from bean : tripID

提前感谢您的帮助。

【问题讨论】:

  • 顺便说一句,你真的应该阅读更多关于 Java 泛型的内容——你没有正确使用它们。
  • 这个问题解决了吗?我很沮丧,因为我遇到了类似的问题。数组列表对象具有另一个数组列表对象和另一个数组列表对象。我有 3 个级别。

标签: jasper-reports


【解决方案1】:

这是通过传递一个集合数据源来完成的:new BeanCollectionDataSource(yourArrayList);

然后获取JasperPrint对象:

JasperPrint jasperPrint = 
      JasperFillManager.fillReport(jasperReport, params, dataSource);

要传递到子报表,您有两种选择:

  • 如果它是每行的子报表,只需将数组作为 bean 的属性。 IE。 List&lt;Something&gt; 其中Something 具有List&lt;AnotherThing&gt; 类型的属性
  • 如果它是整个报表的一个,则将其作为参数传递(上面的params)。

【讨论】:

  • 是的,我知道。但是如何通过它。你能简要地给我一些示例代码吗?我能够将arrayList 传递给第一个子报表,但不能从subreport1(master-sureport1-subreport2)传递给supreport2。 subreport2 在 subreport1 内
  • 好吧,你先展示一些代码 - 你是如何在 Java 代码中获得你的报告的。
  • @Bozho .. 我的代码很大,所以我不能在这里发布。抱歉。您能否发布一些示例代码,用于将 Arraylist 传递给子报表的子报表。
  • 好吧,它并没有让它更清楚。也许你应该找出相关的部分。无论如何,我添加了一行用于将数据源传递给报表并获取结果。
  • 我的代码中也使用了相同的代码,但无法将列表传递给嵌套子报表。让我在这里简单解释一下。 1) 我有主报告 - master.jrxml 2) 子报告 - subreport1.jrxml 3) 子报告 - subreport2.jrxml - master.jrxml 包含 subreport1.jrxml,subreport1.jrxml 包含 subreport2.jrxml,根据您发布的上述代码我能够将 arrayList 传递给 subreport1.jrxml,但如何将相同或不同的 arrayList 传递给 subreport2.jrxml
【解决方案2】:

步骤:1 定义一个类似的字段
字段名称="listCusipData" 和 class="java.util.ArrayList"

步骤:2 在您的子报表 dataSourceExpression 中使用此表达式
新 net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listCusipData},false)

【讨论】:

    【解决方案3】:

    您可以使用列表和/或子报表、数据源和 JRBeanCollectionDatasource 来完成。

    检查这个例子:

    http://siempredesdeelcurro.blogspot.com.es/2013/06/jasper-reports-crear-report-utilizando.html

    它是西班牙文的,但我猜你的名字可以读出来;)

    对于非西班牙语使用者,您仍然可以使用它,因为在教程结束时您可以找到带有 jrxml 模板的 XML。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 2017-01-25
      • 2014-05-02
      • 2014-03-09
      • 2017-11-24
      • 1970-01-01
      • 2017-07-28
      • 2015-06-07
      相关资源
      最近更新 更多