关于myeclipse WEB项目使用javabean方式整合jasperReport,Ireport设计模板,Linux错误处理,几天的研究心得

关于myeclipse WEB项目使用javabean方式整合jasperReport本例使用jasperReport4.5.1和Ireport4.5.1,就目前是最新的版本

使用JDBC作为报表数据源其实是有很多缺陷的,例如,它要求使用SQL查询作为数据来源,但有时报表的内容并不能由一条SQL语句完成。因此,使用JavaBean集合作为数据源才是终极的解决之道,用户只需要将数据整理到一个JavaBean集合之中就可以了,无论用什么方法,数据源为何物。

3.1 定义Bean

定义一个最简单的Bean,只包含一个属性,如下所示

package com.nontax.ab.instittype.vo;

public class InstitClassBean {
	private String classid;
	private String classname;
	private String sortno;
	
	public String getClassid() {
		return classid;
	}
	public void setClassid(String classid) {
		this.classid = classid;
	}
	public String getClassname() {
		return classname;
	}
	public void setClassname(String classname) {
		this.classname = classname;
	}
	public String getSortno() {
		return sortno;
	}
	public void setSortno(String sortno) {
		this.sortno = sortno;
	}
	
	
}

3.2 在iReport中设定数据源及创建报表

要在iReport中使用JavaBean作为数据源,首先要定义好Classpath,以使iReport能够找到我们定义的Bean,使用菜单“Options”-“Classpath”定义Classpath,定义的路径为编译后的.class文件所在路径,例如,我定义的Classpath为“D:\apache-tomcat-6.0.20\webapps\ntax-base\WEB-INF\classes”。

在菜单中,

点击“New”添加数据源,将数据源类型设为“JavaBeans set data source”,设定的数据源属性如下图所示:

按道理而言,上图中的“Factory class”和 “The static method to call to retrieve the array or the collection of javaBeans”中,应该填写相应的工厂类及方法,然后,我们就能够在iReport集成环境中测试输出结果,但就我测试结果而言,发现在我赋上实际的工厂类后,按下Test按钮后,总是提示“The method doen't return a valid array or java.util.Collection”。所以,我们就只把iReport作为一个报表编辑器好了,不要对它报太大奢望,因为是开源的吗,原谅一下了,呵呵。

将其设为当前数据源,然后到菜单“Data”-“Report Query”中定义需要用到的 Bean属性,在“Class name”中输入自定义Bean的名称,本例中为“com.nontax.ab.instittype.vo.InstitClassBean”,然后点击“Read attributes”按钮,获取Bean属性,点击“Add Selected Field(s)”添加要用的属性,如下图所示:

然后在“Fields”,中拖拽到相应的区域就可以了,因为项目还没有上线,暂时就不截这部分的图片了。

3.3 编程导出PDF 和Excel

对于Web应用,以PDF格式导出报表是最常见的应用,另外如果是使用C/S模式的话,还可以导出来JRViewer格式。至于其它格式,例如Excel、HTML、Java2D图形等,基本上是自找麻烦,因为导出来的格式很难看,用户会有意见,不如自己去手工生成的好。因为领导说要实现没办法,在这说一下“上面”(压迫我们的那些人),不会写代码,只会说,感觉好像就是一SX,呵呵先不人身攻击了,技术最重要。

对于JavaBean集合,最终仍然要转化成为JRDataSource以供JasperReport使用,不过这个转换很简单

然后奢侈一下,我把我自己的源码都给贴出来,

	/**
	 * Jasperexport导出PDF、Excel、HTML、Java2D实现方法
	 * 本方法为导出PDF、Excel方法
	 * 采用javabean方式进行报表的生成
	@SuppressWarnings("deprecation")
	public ActionForward Jasperexport(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		//获取前台传递的数据,此变量表示需要到处报表的格式。
		String format = request.getParameter("format");
		try{
			 //查询所需要导出的内容封装到一个以javabean为泛型的List中
			 List<javaBean> data = dataReader.queryForList("InstitType.Jasperexport");
			 //定义一个MAP 准备为模板中的参数传值。
			 Map reportParameters = new HashMap();
			 //报表所需参数
			 reportParameters.put("username",super.getSessionContainer(request).getUserInfo().getUsername());
			 //根据上面List中的数据来获取dataSource
			 JRDataSource dataSource = new JRBeanCollectionDataSource(data);
			 //获取模板存放的真是路径,绝对路径
			 String reportFilePath  = request.getSession().getServletContext().getRealPath("/report/report5.jasper");
			 //定义一个输出流
	         OutputStream ouputStream = response.getOutputStream();
	         // 设置输出格式,默认为pdf的格式,因为导出的Excel格式需要自己稍微的调整报表的大小,建议输出为pdf格式
	 		 String contentType="pdf";
	 		 //根据前台传递的参数判断导出的格式
	 		 if ("xls".equals(format.toLowerCase())) {
	 			contentType = "xls";
	 		 }
	 		 //设定导出的格式
	 		 response.setContentType("application/" + contentType);
	 		 //设定导出报表的格式
	         response.setCharacterEncoding("UTF-8");  
	         //定义导出报表的名称和格式,如:某某.xls或某某.pdf
	         response.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode("某某表", "UTF-8")+"." +contentType);
	         //定义一个模板导出器
	         JRAbstractExporter exporter = new JRRtfExporter();
	         //不同的格式导出器的方式不同,下面PDF和Excel为例
	         if ("pdf".equals(format.toLowerCase())) {
	 			exporter = new JRPdfExporter();		//重新new一个PDF格式的导出器
	 		} else if ("xls".equals(format.toLowerCase())) {
	 			exporter = new JRXlsExporter();  	 // excel导出器
	 			exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, false);
	 		}
	         //加载已经编译好的模板,编译好的模板格式为.jasper
			 JasperReport report = (JasperReport)JRLoader.loadObject(reportFilePath);
			 //此时,进行数据填充,report为Jasper文件,reportParameters为参数Map,dataSource为Connection
			 //注意:此时MAP中的参数的key名称一定要和模板中定义的参数名称一致,负责会获取不到数据从而导致填充数据失败
			 //第三个参数建议使用dataSource作为数据源,不建议使用Connection,因为
			 //要在Ireport里写SQL语句,将需要的字段在SQL语句里输出出来,然后再拖拉构造模版文件。当报表比较复杂时,这种情况就需要写一些非常复杂的SQL语句
	         JasperPrint jasperPrint = JasperFillManager.fillReport(report, reportParameters, dataSource);
	        // 设置要输出的jasper对象
	 		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
	 		// 设置输出流
	 		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
	 		// 导出带有数据的报表
	 		exporter.exportReport();
	 		ouputStream.flush();
	        ouputStream.close();  
		}catch(Exception e){
			e.printStackTrace();
		}
		return mapping.findForward(null);
	}

大家可以好好看看我自己写的代码,里面的注释还是挺全面的,因为要交给我们公司的不熟悉的同事使用,所以我能写注释的地方一般都写上了。

好了大体的设计和代码的实现就先写到这了,下面说一下我期间出现了好多错误什么的。

    1、首先使用Ireport报表工具,根据模板需求定义好模板

    2、注意生成的PDF格式的时候要采用宋体(STSong-Light)和选择亚洲字体(UniGB-UCS2-H)

    3、在项目的lib目录下引入亚洲字体包(iText.jar和iTextAsian.jar)

    4、要注意Ireport的版本要和Jasperexport的版本好一致,导入的jar包要一直,负责会导致很多奇怪的错误异常。

    5、poi的包要一致

    6、注意:项目部署到Linux上时,因为Linux中不自带window中的字体,需要自己重新打模板中所需要的字体的jar包和增加一个配置项,打jar包时需要配置里面的font.xml文件,配置为自己所需要的字体(我的为simsun.ttf 宋体常规)。我自己打的jar包为jasperreports-fonts-4.5.1.jar替换了原先的字体,增加的配置项在项目的根目录下,为:jasperreports.properties,至于AIX中导出字体的问题,暂时还没有实验,相信应该差不多。

    7、网上还有一种说法可以直接把WINDOW中的字体copy到Linux中去,我也试过那种方法,可是我的还是不行,不知道我是操作的问题还是别的

    8、因为window中的宋体是ttc格式的,Linux不识别这种格式的字体,有的说可以把后缀直接改成ttf,可是我也试验过,好像不行,不知道是Linux版本的问题,还是我的操作,所以我在网上下载了一个真正的ttf格式的宋体,放进去就可以了,没有再报错。

期间还遇到了不少错误,只是没有截图了,忘记了,不好意思哈。

我写的这些可能有操作不正确的地方,希望前辈们指正,我刚接触这东西也就两天。所以说一下供大家学习学习,好了先不写了,上班期间偷偷写的。呵呵

 

大家不明白的可以留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值