【问题标题】:JASPER REPORT: Subreport nightmare, datasource is ListJASPER REPORT:子报表噩梦,数据源是List
【发布时间】:2019-11-29 11:09:37
【问题描述】:

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

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;
    }  
  }

主 jrxml 和子报表 jrxml 中的 JRXML sn-ps

Datasorce sn-p 通过 JRBeanCollection SUBREPORT_DIR 就位

错误堆栈跟踪

我做错了什么?

【问题讨论】:

    标签: java jasper-reports subreport


    【解决方案1】:

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

    无需在SUBREPORT 参数中传递子报表,因为.jasper 文件将根据subreportExpressionSUBREPORT_DIR 参数加载。

    【讨论】:

    • 谢谢先生!你帮了很多忙,奇怪的是,当报告加载时,我可以看到主报告数据,但看不到子报告数据,没有任何错误堆栈跟踪。
    • 请帮助question here
    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 2011-01-18
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多