天天看点

ireport中Custom JRDataSourceFactory的数据源配置及使用

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的构造函数,也可以打印的单独写成一个方法(我当时写了一个打印一页,和打印多页的两个方法,后来项目没有用到,所以删掉了)。