Jasper Reports:子端口在主报表中显示空值,数据源是一个 java 列表
Jasper Reports: Subeport showing null values in Main Report, datasource is a java List
我有什么
我的主报表显示我的子报表中的所有值都为空。
我想要什么
我正在通过名为 subData 的参数将数据从 MainReport 传递到 subReport,如下面的 MainReport JRXML 片段所示。
注意:它是一个列表
我在主报表中的子报表片段如下,数据源表达式显然是“$P{subData}”
我的 main java class 通过如下所示的参数(名为 subDataOrion)传递 List(名为 subData)的实例。
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 = new ArrayList();
//subData.add(subDataWrap.getSubData());
subData.add(new SubreportObject("Kevin",20));
subData.add(new SubreportObject("Jane",20));
subData.add(new SubreportObject("Mike",20));
subData.add(new SubreportObject("Simon",20));
//subData.add(new SubreportObject("Naomi",25));
//subData.add(new SubreportObject("Pat",20));
//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
//JRDataSource subx = new JRBeanCollectionDataSource(subData);
para.put("subDataOrion",subData);
//JasperPrint jp = JasperFillManager.fillReport(sub, para,new JRBeanCollectionDataSource(subData));
//JasperPrint jp = JasperFillManager.fillReport(main, para,new JRTableModelDataSource(createMasterData()));
JasperCompileManager.compileReportToFile(
"src/subrepoexample/subReport.jrxml",
"src/subrepoexample/subReport.jasper");
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"},
{"Data","Data","Data"},
{"Data","Data","Data"},
{"Data","Data","Data"},
};
DefaultTableModel dtm = new DefaultTableModel(data,cols);
return dtm;}
}
创建子报表对象的子报表class
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;
}
}
我知道这里有两个问题,排列数据问题,因为子报表数据是混合的。或如第一个屏幕截图所示与主要报告数据混合。这个我觉得可以通过组来解决,这不是我的问题。
我的问题:
我需要先消除 'null' 值,以便我可以进入使用组表达式的下一阶段。我被困在这里,不确定出了什么问题?至少我问了 并且至少出现了 'null' 个值,早些时候它们完全没有出现。
为什么List中的数据显示为'null',单独编译时,编译的很好
编辑 1:
很抱歉在这个问题的早期版本上草率了。谢谢大家。
编辑 2:
我已经添加了 JRBeanCollection,如下所示
甚至将参数 class 更改为 JRDataSource 如下
但仍然显示空值..???
您遗漏了 JRBeanCollectionDatasource
,List 本身不是数据源,除非它实现 JRDataSource 接口应该 wrapped/adapted 由 JRDataSource 实现。
我有什么
我的主报表显示我的子报表中的所有值都为空。
我想要什么
我正在通过名为 subData 的参数将数据从 MainReport 传递到 subReport,如下面的 MainReport JRXML 片段所示。
注意:它是一个列表
我在主报表中的子报表片段如下,数据源表达式显然是“$P{subData}”
我的 main java class 通过如下所示的参数(名为 subDataOrion)传递 List(名为 subData)的实例。
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 = new ArrayList();
//subData.add(subDataWrap.getSubData());
subData.add(new SubreportObject("Kevin",20));
subData.add(new SubreportObject("Jane",20));
subData.add(new SubreportObject("Mike",20));
subData.add(new SubreportObject("Simon",20));
//subData.add(new SubreportObject("Naomi",25));
//subData.add(new SubreportObject("Pat",20));
//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
//JRDataSource subx = new JRBeanCollectionDataSource(subData);
para.put("subDataOrion",subData);
//JasperPrint jp = JasperFillManager.fillReport(sub, para,new JRBeanCollectionDataSource(subData));
//JasperPrint jp = JasperFillManager.fillReport(main, para,new JRTableModelDataSource(createMasterData()));
JasperCompileManager.compileReportToFile(
"src/subrepoexample/subReport.jrxml",
"src/subrepoexample/subReport.jasper");
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"},
{"Data","Data","Data"},
{"Data","Data","Data"},
{"Data","Data","Data"},
};
DefaultTableModel dtm = new DefaultTableModel(data,cols);
return dtm;}
}
创建子报表对象的子报表class
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;
}
}
我知道这里有两个问题,排列数据问题,因为子报表数据是混合的。或如第一个屏幕截图所示与主要报告数据混合。这个我觉得可以通过组来解决,这不是我的问题。
我的问题:
我需要先消除 'null' 值,以便我可以进入使用组表达式的下一阶段。我被困在这里,不确定出了什么问题?至少我问了
为什么List中的数据显示为'null',单独编译时,编译的很好
编辑 1:
很抱歉在这个问题的早期版本上草率了。谢谢大家。
编辑 2:
我已经添加了 JRBeanCollection,如下所示
甚至将参数 class 更改为 JRDataSource 如下
但仍然显示空值..???
您遗漏了 JRBeanCollectionDatasource
,List 本身不是数据源,除非它实现 JRDataSource 接口应该 wrapped/adapted 由 JRDataSource 实现。