繁体   English   中英

JASPER 报告:子报告噩梦,数据源是列表

[英]JASPER REPORT: Subreport nightmare, datasource is List

无法查看带有子报表的主报表...

主 Java 类

   public class SubRepoExample {

    public static void main(String[] args) throws JRException {
       SubRepoExample repo = new SubRepoExample();
       repo.combineMasterAndSubreport();
    }

     public void combineMasterAndSubreport() throws JRException{

         JasperReport main = JasperCompileManager.compileReport("src/subrepoexample/masterReport.jrxml");

        JasperReport sub = JasperCompileManager.compileReport("src/subrepoexample/subReport.jrxml");

        //create a list for holding the subreport object



        SubreportWrapper subDataWrap = new SubreportWrapper();

        List<SubreportObject> subData = subDataWrap.getSubData();

        Map para = new HashMap();
        //pass the report itself through a parameter
        para.put("SUBREPORT", sub);
        //pass the list to parameter
        para.put("subData",subData);


        JasperPrint jp = JasperFillManager.fillReport(main, para,new   JRTableModelDataSource(createMasterData()));
        JasperViewer.viewReport(jp, false);  

    }

      public DefaultTableModel createMasterData(){

        String [] cols = {"COL_1","COL_2","COL_3"};
        Object[][] data = {{"Data","Data","Data"},
                        {"Data","Data","Data"},                                  
                      };
         DefaultTableModel dtm = new DefaultTableModel(data,cols);

    return dtm;}

}

SubreportObject 类负责创建最终放置在列表中的子报表数据。

 public class SubreportObject {
      String name;
      int age;

     public SubreportObject(String name,int age){
         this.name = name;
         this.age = age;  
         }

     public String getName() {
     return name;
         }

     public void setName(String name) {
     this.name = name;
         }

     public int getAge() {
     return age;
         }

     public void setAge(int age) {
     this.age = age;
         }

      }

Bean 工厂类

 public class SubreportWrapper {
    //String name;
    List<SubreportObject> subData;

//    public SubreportWrapper(List<SubreportObject> subData){
//        this.subData = subData;
//    }

    public List<SubreportObject> getSubData() {

        subData = new ArrayList();
        subData.add(new SubreportObject("Jane",20));
        subData.add(new SubreportObject("Mike",25));
        subData.add(new SubreportObject("Kev",20));
        return subData;
    }
    public void setSubData(List<SubreportObject> subData) {
        this.subData = subData;
    }  
  }

Main jrxml 和 Subreport jrxml 中的 JRXML 片段主报告和子报告中列表的字段声明

通过 JRBeanCollection 的数据源片段数据源 SUBREPORT_DIR 已就位

错误堆栈跟踪错误

我究竟做错了什么?

您正在使用子数据作为字段$F{subData}设置JRBeanCollectionDatasource构造函数,请改用参数: $P{subData}

无需通过子报表SUBREPORT参数,因为该.jasper文件,将根据被加载subreportExpressionSUBREPORT_DIR参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM