转自:http://blog.csdn.net/jiebacai/article/details/7871517
概述:
现在简要的介绍Jasperreport 是
如何工作的,这样你可以更好的理解iReport 是如何帮助Jasperreport 实现前端的
工作,其实这些工作在我们看来就是“脏活”,为什么呢?看看下面的资料就知
道了:
首先是要有一个XML
文件(一般是以jrxml后缀),那么这个XML文件从那里来呢?做什么用呢?
这个XML 文件就是报表的定义文件,整个报表的每一个细节都在这个XML 文件之中定义,
一个简单报表的xml文件就有几百行,你可以手工编辑这个XML文件(一行一行,一段一段的编辑吧――这就是所谓的“脏活”),
然后可以在jsp后台使用JasperCompileManager将xml文件编译为jasper文件
ireport工具就是简化编写xml文件和编译的这个流程,而且提供可视化编辑窗口,非常方便
ireport部分:
我使用的是ireport3.0和现在最新的4.0界面上有很大的不同:
3.0界面:
这里,我假设ireport的环境已经配置完毕,点击左上角的档案,选择开启新档,设置报表初始化参数:
注意一下里边的字段数的按钮,字段数设置默认为1,如果设置为2的话,就相当于每一列会有2个字段排列,
这样讲有点抽象,请看下边的例子:
假设我们的数据表是这样:
name | sex | realname | remark |
a_1 | b_1 | c_1 | d_1 |
a_2 | b_2 | c_2 | d_2 |
a_3 | b_3 | c_3 | d_1 |
a_4 | b_4 | c_4 | d_4 |
a_5 | b_5 | c_5 | d_5 |
如果ireport的字段数设为2,结果会变成:
name | sex | realname | remark |
a_1 a_2 | b_1 b_2 | c_1 c_2 | d_1 d_2 |
a_3 a_4 | b_3 b_4 | c_3 c_4 | d_3 d_4 |
所以,一般设置字段数为1即可。
新建后,可以看到中间的控制面板:
这里,假设您只需要报表显示表格和统计数据,所以title和lastpagefooter可以不要,在左上角的预览里,选择栏,把title和lastpagefooter高度设为0.
下面开始设计报表:
然后可以拖拉到控制面板对应字段对齐
这里假设各位都会对其,效果图如下:
使用报表变量,计算统计值:
document下右键添加variable,出现这个界面,然后按照这样设置:
这里我是统计列a的个行相加值,因为前面
已经设置了sum,所以,报表会自动计算列a的相加值。
这里设计报表要注意几点:
1.字段间要对齐,方框为红色的,表明是超出报表边界
2.写表达式的时候,与java类型兼容,但是写法有点不同,类型转换要用new 类型 不然会报错
jsp处理报表部分
设置report环境:
1.每个Web应用都会有WEB-INF目录,但是lib 是不一定有的,
如果没有就创建它,本文需要的jar库文件有3个:
jasperreports-0.5.3.jar :jasperreports执行时需要的API
iTextAsian.jar :亚洲字符集支持
itext-1.02b.jar :其他字符集支持
2.在Web应用中根目录下创建repotrs目录,其实这是一种建议,
没有必要完全按照这样做,你可以根据你的业务需要创建N个目录或是层次目录。
把.jasper文件拷贝到repotrs目录下,比如例子中的BusinessRpt.jasper文件。
jsp两种模式:
1.直接使用jsp处理报表
2.使用servlet处理报表
1.使用jsp处理报表:
jsp文件:
1 <%@ page language="java" pageEncoding="GB18030"%> 2 <%@ page session="false"%> 3 <%@ page import="java.util.*"%> 4 <%@ page import="javax.naming.*"%> 5 <%@ page import="java.sql.*"%> 6 <%@ page import="javax.sql.*"%> 7 <%@ page import="java.util.*"%> 8 <%@ page import="java.io.*"%> 9 10 <%@ page import="dori.jasper.engine.*"%> 11 <% 12 String path = request.getContextPath(); 13 String basePath = request.getScheme() + "://" 14 + request.getServerName() + ":" + request.getServerPort() 15 + path + "/"; 16 %> 17 <html> 18 <head> 19 <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 20 <title></title> 21 <% 22 DataSource ds = null; 23 try { 24 InitialContext ctx = new InitialContext(); 25 ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql"); 26 Connection conn = ds.getConnection(); 27 //装载jasper 文件 28 File business_rpt = new File(application 29 .getRealPath("/reports/BusinessRpt.jasper")); 30 // http://blog.csdn.net/jemlee2002/archive/2004/10/08/JJem3.aspx 31 //ProjectName 就是iReport 的变量$P{ProjectName}的名称, 32 //proname 就是从界面上获取的值。 33 Map parameters = new HashMap(); 34 parameters.put("ProjectName ", proname); 35 // JasperRunManager是一个输出控制管理类,下文会提及部分内容 36 JasperRunManager.runReportToHtmlFile(business_rpt.getPath(), 37 parameters, conn); 38 //如果创建报表成功,则转向该报表,其实可以把报表套在框架内,这样实现比较有意义的报表格式。 39 response.sendRedirect("/reports/BusinessRpt.html"); 40 } catch (Exception ex) { 41 out.print("出现例外,信息是:" + ex.getMessage()); 42 ex.printStackTrace(); 43 } 44 %> 45 </head> 46 <body> 47 </body> 48 </html>
2.使用servlet处理报表:
主要区别就是,servlet是直接输出report报表流:
先写一个CustomDataSource类实现report的JRDataSource接口,转化vector向量为数据源:
1 public class CustomDataSource implements JRDataSource { 2 private Vector dataVector = new Vector(); 3 private int index = -1; 4 5 public CustomDataSource(Vector DataVector) { 6 dataVector = DataVector; 7 } 8 9 public boolean next() throws JRException { 10 index++; 11 return (index < dataVector.size()); 12 } 13 14 public Object getFieldValue(JRField field) throws JRException { 15 Object value = null; 16 String fieldName = field.getName(); 17 18 value = ((Map) dataVector.get(index)).get(fieldName); 19 return value; 20 } 21 22 }
输出html:
1 <%@ page language="java" pageEncoding="GB18030"%> 2 ServletContext context = this.getServletConfig().getServletContext(); 3 File reportFile = new File(context 4 .getRealPath("/reports/test.jasper"));// 加载报表路径 5 if (!reportFile.exists()) { 6 response.setContentType(CONTENT_TYPE); 7 PrintWriter out = response.getWriter(); 8 out.print("<script language='javascript'>"); 9 out.print("alert('找不到报表!');"); 10 out.print("</script>"); 11 return; 12 } 13 14 Map parameters = new HashMap(); 15 16 response.setContentType(CONTENT_TYPE); 17 PrintWriter out = response.getWriter(); 18 try { 19 20 JasperReport jasperReport = (JasperReport) JRLoader 21 .loadObject(reportFile.getPath());// 加载报表 22 23 /* 24 * java.lang.reflect.Field pageHeight = 25 * JRBaseReport.class.getDeclaredField("pageHeight"); 26 * pageHeight.setAccessible(true); 27 * pageHeight.setInt(jasperReport, 500); 28 */ 29 30 31 JasperPrint jasperPrint = JasperFillManager 32 .fillReport(jasperReport, parameters, 33 new CustomDataSource((Vector) re 34 .get(1)));// 加载数据源和parameters,这里的数据源用到的是JRDataSource,所以要实现JRDataSource接口 35 36 JRHtmlExporter exporter = new JRHtmlExporter(); 37 38 Map imagesMap = new HashMap(); 39 request.getSession().setAttribute("IMAGES_MAP", 40 imagesMap); 41 %> 42 String header = ""; 43 header = "<script language='javascript'>\n"; 44 header += "window.history.forward(1);\n"; 45 header += "document.onkeydown=function(){if(event.keyCode==8){if((document.activeElement.type!='text')&&(document.activeElement.type!='textarea')){event.keyCode=0}};}\n"; 46 header += "document.oncontextmenu=function() {return false;};\n"; 47 header += "</script>\n"; 48 49 header += "<html>\n"; 50 header += "<head>\n"; 51 header += " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=GBK\">\n"; 52 header += "<style type=\"text/css\">\n"; 53 header += " a {text-decoration: none}\n"; 54 header += " </style>\n"; 55 header += "</head>\n"; 56 header += "<body text=\"#000000\" link=\"#000000\" alink=\"#000000\" vlink=\"#000000\">\n"; 57 header += "<table width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n"; 58 header += "<tr><td width=\"50%\"> </td><td align=\"center\">\n"; 59 header += "\n"; 60 61 exporter.setParameter( 62 JRExporterParameter.JASPER_PRINT, 63 jasperPrint); 64 exporter.setParameter( 65 JRExporterParameter.OUTPUT_WRITER, out); 66 exporter.setParameter( 67 JRHtmlExporterParameter.IMAGES_MAP, 68 imagesMap); 69 exporter.setParameter( 70 JRHtmlExporterParameter.IMAGES_URI, 71 "/Images/"); 72 exporter 73 .setParameter( 74 JRHtmlExporterParameter.HTML_HEADER, 75 header); 76 77 exporter.exportReport(); 78
pdf输出:
1 byte[] bytes = null; 2 3 try { 4 bytes = JasperRunManager.runReportToPdf(reportFile 5 .getPath(), parameters, 6 new CustomDataSource((Vector) re.get(1))); 7 if (bytes != null && bytes.length > 0) { 8 response.setContentType("application/pdf"); 9 response.setContentLength(bytes.length); 10 ServletOutputStream ouputStream = response 11 .getOutputStream(); 12 ouputStream.write(bytes, 0, bytes.length); 13 ouputStream.flush(); 14 ouputStream.close(); 15 } 16 17 } catch (Exception e) { 18 e.printStackTrace(); 19 System.out.println("ErrorTime:" + new Date()); 20 response.setContentType(CONTENT_TYPE); 21 PrintWriter out = response.getWriter(); 22 out.print("<script language='javascript'>"); 23 out.print("alert('" 24 + e.toString().replace("'", " ") + "');"); 25 out.print("</script>"); 26 27 }
excel输出:
1 try { 2 3 JasperReport jasperReport = (JasperReport) JRLoader 4 .loadObject(reportFile.getPath()); 5 6 7 ServletOutputStream ouputStream = response 8 .getOutputStream(); 9 10 JasperPrint jasperPrint = JasperFillManager 11 .fillReport(jasperReport, parameters, 12 new CustomDataSource((Vector) re 13 .get(1))); 14 15 response.setContentType("application/ms-excel"); 16 response.setHeader("Content-Disposition", 17 "inline;filename=\"" 18 + jasperPrint.getName() + ".XLS\""); 19 20 JRXlsExporter exporter = new JRXlsExporter(); 21 22 exporter.setParameter( 23 JRExporterParameter.JASPER_PRINT, 24 jasperPrint); 25 exporter.setParameter( 26 JRExporterParameter.OUTPUT_STREAM, 27 ouputStream); 28 exporter 29 .setParameter( 30 JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, 31 Boolean.TRUE); 32 exporter 33 .setParameter( 34 JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, 35 Boolean.FALSE); 36 exporter 37 .setParameter( 38 JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, 39 Boolean.FALSE); 40 exporter.exportReport(); 41 42 } 43 44 catch (Exception e) { 45 e.printStackTrace(); 46 System.out.println("ErrorTime:" + new Date()); 47 48 response.setContentType(CONTENT_TYPE); 49 PrintWriter out = response.getWriter(); 50 out.print("<script language='javascript'>"); 51 out.print("alert('" 52 + e.toString().replace("'", " ") + "');"); 53 out.print("</script>"); 54 55 }
代码不够完善,这几天刚好要做报表,到时把一个完整的代码贴上来,现在先拿别人的学习下。