刚开始学ireport是使用sql作为数据源,因为直接sql是最简单也最容易上手的,但是sql已经无法满足现在的业务需求了,于是乎寻找其他的解决方案,于是乎找到了JRDataSource数据源。个人觉得sql数据源最简单,其次就是JRDataSource数据源了。
一、使用JRDataSource数据源首先要实现 JRRewindableDataSource 接口
/**
* @Author: BlueSky
* @CreateTime: 2020-01-06 13:50
* @Description:
*/
import java.util.List;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
import net.sf.jasperreports.engine.JRRewindableDataSource;
public class GenericDataSource implements JRRewindableDataSource{
int index;
List<PrintRecord> records;
public GenericDataSource(List<PrintRecord> records) {
this.records = records;
this.index = -1;
}
@Override
public Object getFieldValue(JRField jrField) throws JRException {
String fieldName = jrField.getName();
return records.get(index).getValue(fieldName);
}
@Override
public boolean next() throws JRException {
++index;
return index < records.size();
}
public void moveFirst() {
}
}
二、新建一个通用打印的类
/**
* @Author: BlueSky
* @CreateTime: 2020-01-06 13:51
* @Description:
*/
import java.util.HashMap;
import java.util.Map;
public class PrintRecord {
public static final int KEY_NOT_FOUND = -1;
Map<String, Object> vals;
public PrintRecord() {
vals = new HashMap<String, Object>();
}
public void setValue(String key, Object value) {
vals.put(key, value);
}
public Object getValue(String key) {
Object val = vals.get(key);
if (val == null)
return "";
else
return val;
}
public int getKeyNum() {
return vals.size();
}
}
三、在java中封装所需要打印的参数数据(ps:详情见第六步代码)
四、在需要打印的报表中新建数据接收参数
- parameters -> add
- list集合参数需要注意下参数类型,这里需要把 Parameter Class 设置为 net.sf.jasperreports.engine.JRDataSource 类型。(ps:下拉框中没有的话直接复制上述类型粘贴到它下拉框中)
五、刚刚新建接收的list数据还无法直接在当前输出,我们还需要新建一个子报表,通过它来输出list内容
- 窗口 -> 打开组件面板 -> subreport 拉取它到相应位置
- 设置子报表Parameters 为装list的参数
- 去往子报表中 field 添加list集合中的属性
- 然后把添加的 field 拖到 Detail Brand中就能显示了
六、查看成果
public static void main(String args[]) {
try {
// 获取源文件
String path = "C:\\Users\\25109\\Desktop\\ \\iReportModel\\销售合同报表√\\javabean\\testBean.jasper";
TestModel testModel = new TestModel();
testModel.setProvice("湖南");
testModel.setCity("长沙");
TestModel testModel2 = new TestModel();
testModel2.setProvice("湖南");
testModel2.setCity("株洲");
TestModel testModel3 = new TestModel();
testModel3.setProvice("湖北");
testModel3.setCity("武汉");
List<TestModel> testModelList = new ArrayList<>(); //需要打印的list数据
testModelList.add(testModel);
testModelList.add(testModel2);
testModelList.add(testModel3);
HashMap<String, Object> map = new HashMap<String, Object>();
List<PrintRecord> printRecordList = new ArrayList<>(); // 封装后的数据集合
for (TestModel p : testModelList) {
PrintRecord pr = new PrintRecord();
pr.setValue("provice",p.getProvice()); // 子报表需要建立对应的field
pr.setValue("city",p.getCity());
printRecordList.add(pr);
}
map.put("data",new GenericDataSource(printRecordList)); // 主报表需要建立名为data的 Parameters
map.put("staticParam","静态参数");
JasperPrint jasperPrint = JasperFillManager.fillReport(path, map, new JREmptyDataSource());
if(jasperPrint != null && jasperPrint.getPages().size() > 0){
JasperViewer jasperViewer = new JasperViewer(jasperPrint,false); //以视图方式进行预览
jasperViewer.setVisible(true);
jasperViewer.setAlwaysOnTop(true);
jasperViewer.getGraphicsConfiguration().getDevice().setFullScreenWindow(jasperViewer);
}else {
System.err.println("报表内容为空暂不输出");
}
}catch (Exception e){
System.err.println(e.getMessage());
e.printStackTrace();
}
}