new 一个数据源:
factory name:com.jaspersoft.ireport.examples.SampleJRDataSourceFactory(必填)
name:你的JRDataSource的路径,比如我的是:edu.pku.stu.status.bkxj.util.JDataSourceUtil(填写此项时应先在classpath中增加尼你的项目路径,但此项并不是必填的,在项目中用的时候设置成相应的JRdataSource就行了,但是factory name是必须的,否则会报错)。
优点 :Database JDBC Connection 会在整个填充过程一直占用数据库连接,而且在处理一些复杂问题时,用sql和一些简单的Java语句并不能很好的解决问题。JRdataSource只会在取数据时取得数据库连接,而非填充过程。而且后台的代码也比较容易控制
javaBean:每个报表都要配置一个相应的JavaBean,太繁琐,且不易维护。JRdataSource也没有这方面的烦恼。
我的代码:
package edu.pku.stu.status.bkxj.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
/**
* 此类自动将参数中值为null的数据转为“”
*
* @author lijf
* @see
*/
public class JDataSourceUtil implements JRDataSource {
private HashMap[] datasHm = null;
private List<HashMap> datasList = null;
private HashMap temp = null;
private int loop = -1;
// 打印多条数据
public JDataSourceUtil(HashMap[] datasHm) {
this.datasHm = datasHm;
}
// 打印多条数据
public JDataSourceUtil(List<HashMap> datasList) {
this.datasList = datasList;
}
/**
* 打印一页,一条数据时,用此构造参数
*
* @param hm
*/
public JDataSourceUtil(HashMap hm) {
this.datasList = new ArrayList<HashMap>();
datasList.add(hm);
}
public Object getFieldValue(JRField jRfield) throws JRException {
if (datasHm != null) {
temp = datasHm[loop];
} else {
temp = datasList.get(loop);
}
return temp.get(jRfield.getName()) == null ? "" : temp.get(jRfield
.getName());//过滤null值
}
public boolean next() throws JRException {
loop++;
if (datasHm != null) {
if (loop >= datasHm.length) {
return false;
} else {
return true;
}
} else {
if (loop >= datasList.size()) {
return false;
} else {
return true;
}
}
}
}
print.jsp中的使用:
<%
……………………………………
//list,reportFile 已声明
JDataSourceUtil jd = new JDataSourceUtil(list);
//windows
// PDF报表
byte bytes[] = JasperRunManager.runReportToPdf(reportFile
.getPath(), null, jd); //没有需要向报表传递的参数,所以此处第//二个参数是null
response.setContentType("application/pdf");
OutputStream output = response.getOutputStream();
output.write(bytes, 0, bytes.length);
output.flush();
output.close();
%>
有兴趣的朋友可以把声明一些JavaBean 的Jrdatasource的构造函数,也可以打印的单独写成一个方法(我当时写了一个打印一页,和打印多页的两个方法,后来项目没有用到,所以删掉了)。