生成报表(转)

使用JasperReport+iReport进行WEB开发  
 
 
   
 

  一、JasperReport和iReport简介:    1、JasperReport简介   JasperReport是一个强大、灵活的报表生成工具,是开放源代码组织sf.net中的一个java 报表打印工程。能够展示丰富的页面内容,并将之转换成PDF,HTML,XML,Excel(通过POI或JExcelAPI实现)和Rtf(通过POI实现)格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。它的主要目的是辅助生成面向页面的(page oriented),准备付诸打印的文档。JasperReport借由定义于XML文档中的report design进行数据组织。这些数据可能来自不同的数据源,包括关系型数据库,collections,java对象数组。通过实现简单的接口,用户就可以将report library插入到订制好的数据源中。用JasperReport进行报表开发的过程如图1.1: 

  2、iReport简介   iReport也是开源组织sf.net中的一款免费软件,是为JasperReport设计的强大的,直观的,易于使用的可视化报表设计器,采用纯Java开发。这个工具允许用户可视化编辑包含charts、图片、子报表等的复杂报表。iReport 还集成了JFreeChart图表制作包,允许用户可视化地编辑XML(JasperDesign)文件。用于打印的数据可以通过多种方式获取包括:JDBC, TableModels, JavaBeans, XML,Hibernate(支持HQL查询语言), CSV等。它支持多种输出格式包括:PDF,RTF,XML,XLS,CSV,HTM。

  注意下载的iReport一定要与你所使用的JasperReport 版本相匹配,当然您也可以更新iReport 中所使用的JasperReport 组件。

  二、JasperReport+iReport开发   1、报表设计一般过程

    • 定制报表格式 使用iReport制定报表模板或者直接写jrxml文件,其实就是xml文件,只不过是后缀名不一样罢了。将jrxml文件编译后就生成了jasper模板文件。

  • 填充数据 填充数据一般使用二种方式,一种方式是通过JDBC连接提供数据源,一种就是通过 JavaBean 的集合提供数据源。当然还有web Service的xml文件提供的。我的建议是,如果你的程序中的统计直接使用JDBC就可以完成,那么就使用jdbc数据源的方法,反之,使用javaBean的集合是不错的选择,因为这样不会在意你的数据的来源,你也可以任意处理,比如说,要通过权限检查的数据才在报表中生成的话,就可以过滤到不符合权限的数据。
  • 显示 将JasperReport生成的文件直接显示出来。点击执行报表按钮。

  2、报表安装与配置

  • JDK安装 安装jdk并配置系统环境变量JAVA_HOME;在classpath,path中均要配置。 例如:JAVA_HOME: C:/java/jdk1.5.0_06; classpath: c:/java/jdk1.5.0_06/lib/tools.jar;c:/java/jdk1.5.0_06/lib/dt.jar; path: c:/java/jdk1.5.0_06/bin;
  • iReport的安装: iReport的安装直接下一步就可以了,如果下载的是解压版的,解压后就可以用了。

  3、iReport入门

    • 新建报表文档

    • 选择”Data---->连接/资料来源”菜单

    • 新建数据库JDBC连接 单击 “new” 按钮,弹出如下窗口,设置JDBC连接参数

    • 新建报表查询 选择”Data---->报表查询”菜单,出现如下窗口,输入SQL语句: select * from employee

    • 放置列标题

    • 放置详细信息

    • 查看报表结果

  报表设计注意事项   (1)报表模板中每一个text或者file文本域属性common中的Position Type是很有用的一个属性,在使用中如果遇到了文本域需要浮动则选择float。 其他相应一些技巧均在属性中可以找到,在模板制作过程中应多注意,这里不再多说。

  (2)报表模板正文区域:

  title:title段只在整个报表的第一页的最上面部分显示,除了第一页以外不管报表中有多少个页面也不会出现title段的内容。    pageHeader:pageHeader段中的内容将会在整个报表中的每一个页面中都会出现,显示位置在页面的上部,如果是报表的第一页,pageHeader中的内容显示在title段的下面,除了第一页以外的其他所有页面中pageHeader中的内容将显示在页面的最上端。   columnHeader:针对detail段的表头段,一般情况下在这个段中画报表中列的列标题,每页均会出现一次。   detail:报表内容段,在这个段中设计报表中需要重复出现的内容,detail段中的内容每页都会出现。   columnFooter:针对detail段的表尾段,每页均会出现一次。   pageFooter:显示在所有页面的最下端,每页都显示,最后一页由lastPageFooter代替。   lastPageFooter:最后一页页尾段内容,只在最后一页出现一次。   summary:报表合计段,出现在整个报表的最后一页的detail段的后面,一般用来统计报表中某一个或某几个字段的合计值。

  4、iReport使用   iReport使用过程中将需要用到的jar文件放到工具下的lib文件夹下,例如oracleDriver的jar包。

  iReport制作的报表可视化文件后缀是.jrxml,编译此文件后将生成模板文件后缀名是.jasper。(如图2.1)

  使用JavaBean做为数据源的话,制作一个javaBean将其打为jar文件,在iReport工具中的Options选项下的Classpath中使用添加jar将文件引入。在Data?Report query中选择JavaBean Data Source将jar文件中的类名字输入到Class name位置点击右边按钮就可以了,javaBean中定义的字段就显示出来了选择自己需要用的字段点击add按钮。

  写一个DataSourceFactory类打成jar文件,并在classpath中将文件引入,然后在Data?Connections/Datasources选择new再弹出的对话框中选择JavaBeans set data source 然后将刚刚jar文件中的factory类对应的名字写下来就可以了。

  最后在iReport中动态执行报表就可以了。

  5、iReport生成文件中的字体问题    iReport在生成文件时有可能会遇到中问乱码的问题,那么在制作模板时就要注意中文字段属性要正确的选择,而且3个针对于pdf中文乱码问题的jar文件(iTextAsian.jar, itext-1.3.1.jar, iTextAsianCmaps.jar(该文件我似乎没有))不能少。还有一点就是关于中文字符问题可以将操作系统自带的字体文件copy到iReport对应的文件夹中就可以使用,在web工程中要放的class文件夹下。例如中文宋体字体文件(C:\WINDOWS\Fonts 文件夹下的文件)copy到web工程下的class文件夹下。

  6、java代码实例

1.package report;   
2.  
3.import java.sql.Connection;   
4.import java.sql.DriverManager;   
5./**
6.*数据库的连接类
7.*/
8.public class JDBCConnection {   
9.public static Connection getConnection(){
10.try {
11.String url = "jdbc:oracle:thin:@127.0.0.1:1521:ruanko";
12.Class.forName("oracle.jdbc.driver.OracleDriver");
13.Connection con = DriverManager.getConnection(url, "little", "little");
14.return con;
15.   }
16.  }catch(Exception e){
17.    e. printStackTrace();
18.  }
19.  return null;
20.}
java 代码
1.package report.datasource;
2.
3.import java.util.HashMap;
4.import java.util.Iterator;
5.import java.util.List;
6.import java.util.Map;
7.
8.import net.sf.jasperreports.engine.JRDataSource;
9.import net.sf.jasperreports.engine.JRException;
10.import net.sf.jasperreports.engine.JRField;
11./**
12.*  dataSource类(也就是数据填充类),实现JRDataSource接口
13.*  通过放在list里面的Map对象迭代实现数据对应
14.*/
15.public class ReportDataSource implements JRDataSource {
16.
17.private List datas = DateSourceBaseFactory.createBeanCollection(String id);
18.
19.private Iterator iter = datas.iterator();
20.
21.Map map = new HashMap();
22.
23.public ReportDataSource() {
24.	}
25.
26.public ReportDataSource(String id) {
27.	}
28.
29.public boolean next() throws JRException {
30.	if(iter.hasNext()){
31.		map = (Map) iter.next();
32.		return true;
33.		}
34.	return false;
35.	}
36.
37.public Object getFieldValue(JRField arg0) throws JRException {
38.return map.get(arg0.getName());
39.	}
40.
41.}   
java代码
1.package report.factory;
2.
3.import report.JDBCConnection;
4.import java.sql.Connection;
5.import java.sql.ResultSet;
6.import java.sql.SQLException;
7.import java.sql.Statement;
8.import java.sql.Timestamp;
9.import java.util.ArrayList;
10.import java.util.HashMap;
11.import java.util.List;
12.import java.util.Map;
13./**
14.* Map中的键值要与模板文件的file值对应。
15.*/
16.public class DataSourceBaseFactory {
17.
18.public static List createBeanCollection(String id) {
19.
20.ResultSet rs = null;
21.Statement st = null;
22.Connection con = null;
23.List datas = new ArrayList();
24.
25.try {
26.con = JDBCConnection .getConnection();
27.st = con.createStatement();
28.rs = st. executeQuery (“select name,password,sex from people where id = ” id);
29.while(rs.next()){
30.Map attris = new HashMap();
31.attris.put("name", rs.getString(“name”));
32.attris.put("password", rs.getString(“password”);
33.attris.put("sex", rs.getString(“sex”));
34.datas.add(attris);
35.			}
36.		} catch (Exception e) {
37.			e.printStackTrace();
38.		} finally {
39.			try {
40.            if(rs != null) rs.close();
41.            if(st != null) st.close();
42.            if(con != null) con.close();
43.			} catch (SQLException e) {
44.				e.printStackTrace();
45.			}
46.		}
47.		return datas;
48.	}
49.}
50.  
java 代码
1.package report.bean
2.
3.import java.io.Serializable;
4./**
5.* dataSource的javaBean类。用于创建模板
6.*/
7.public class DataSourceBean implements Serializable {
8.
9.  private static final long serialVersionUID = -4038978834455400007L;
10.
11.  private String name;
12.  private String password;
13.  private String sex;
14.
15.  public String getName(){
16.    return name;
17.  }
18.
19.  public void setName(String name){
20.    this.name = name;
21.  }
22.
23.  public String getPassword (){
24.    return password;
25.  }
26.
27.  public void setPassword(String password){
28.    this.password = password
29.  }
30.
31.  public String getSex(){
32.    return sex;
33.  }
34.
35.  public void setSex(String sex){
36.    this.sex = sex;
37.  }
38.
39.}

java 代码
1.package report;
2.
3.import java.io.ByteArrayOutputStream;
4.import java.io.File;
5.import java.io.FileOutputStream;
6.import java.io.IOException;
7.import java.util.Date;
8.import java.util.HashMap;
9.import java.util.Map;
10.
11.import net.sf.jasperreports.engine.JRAbstractExporter;
12.import net.sf.jasperreports.engine.JRException;
13.import net.sf.jasperreports.engine.JRExporterParameter;
14.import net.sf.jasperreports.engine.JasperFillManager;
15.import net.sf.jasperreports.engine.JasperPrint;
16.import net.sf.jasperreports.engine.export.JRPdfExporter;
17.import net.sf.jasperreports.engine.export.JRPdfExporterParameter;
18./**
19.* 测试入口类,生成pdf文件
20.* JasperFillManager中有多个生成文件的方法
21.* 除了可以生成pdf文件外还可以生成ofice文档文件。
22.*/
23.public class TestReportHere {
24.
25.public static void main(String[] args) {
26.Map parameters = new HashMap();
27.
28.ByteArrayOutputStream outPut = new ByteArrayOutputStream();
29.FileOutputStream outputStream = null;
30.File file = new File("E:/workspace/report.pdf");
31.String reportModelFile = "E:/workspace/reportModel.jasper";
32.
33.try {
34.JasperPrint jasperPrint = JasperFillManager.fillReport(reportModelFile,  parameters, new ReportDataSource(“123”));
35.JRAbstractExporter exporter = new JRPdfExporter();
36./**
37.*  创建jasperPrint
38.*/
39.exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);
40./**
41.*  生成输出流
42.*/
43.exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,outPut);
44./**
45.*  屏蔽copy功能
46.*/
47. exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED,Boolean.TRUE);
48./**
49.*  加密
50.*/
51.exporter.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY,Boolean.TRUE);
52.exporter.exportReport();
53.outputStream = new FileOutputStream(file);
54.outputStream.write(outPut.toByteArray());
55.		}catch (JRException e) {
56.			e.printStackTrace();
57.		} catch (Exception e) {
58.			e.printStackTrace();
59.		}finally{
60.			try {
61.				outPut.flush();
62.				outPut.close();
63.			} catch (IOException e) {
64.				e.printStackTrace();
65.			}
66.		}
67.	}
68.
69.}
70.
 
   
时间: 2024-07-31 06:24:50

生成报表(转)的相关文章

告别.NET生成报表统计图的烦恼

告别.NET生成报表统计图的烦恼 标签: 报表.netstatistics图形数据库文档 2009-10-09 12:00 635人阅读 评论(0) 收藏 举报  分类: .net程序设计(C#)(21)  目录(?)[+] 文章出处:http://www.cnblogs.com 告别.NET生成报表统计图的烦恼 信息系统大多会涉及到数据的统计,如数据的导出及生成统计对比图等,记得之前有一次要生成一个统计图在WEB页面上显示,那时也是在网上找了段Code,完全是一点点画横纵轴坐标上面的画出来的,

4、如何利用reportViewer在VS中生成报表

4.如何利用reportViewer在VS中生成报表

python自动处理数据生成报表

使用模块xlsxwriter import xlsxwriter workbook = xlsxwriter.Workbook('chart.xlsx')     #创建一个Excel文件 worksheet = workbook.add_worksheet()             #创建一个工作表对象 chart = workbook.add_chart({'type': 'column'})    #创建一个图表对象 #定义数据表头列表 title = [u'业务名称',u'星期一',u

使用C#通过调用minitab的COM库自动化生成报表

本文介绍通过C#调用minitab com组建自动化生成报表的方法. 首先需要在minitab中通过手动配置的方式生成报表来得到该报表的命令行,过程如下 选择菜单“编辑器”->“启用命令”启用命令窗口 在工作表中输入数据,并按需求配置并生成需要的报表 拷贝出会话窗口中生成该报表的命令行 得到所需的mimitab命令后就可以在C#中通过调用minitab执行该命令得到对应的报表了,过程如下 新建C#工程,并把名为Mtb 17.0 Type Library的COM库加入到该工程的引用 执行以下代码,

把sar的数据生成报表

kSar是一个Java应用程序,用来把sar的数据生成报表,输出为pdf文件. 文件下载: http://sourceforge.net/projects/ ... -5.0.6.zip/download kSar有生成报表的能力: LC_ALL=C sar -A > /xuzheng/sar.log java -jar kSar.jar -input /xuzheng/sar.log -outputPDF /xuzheng/sar.pdf 也可以用sar命令抓取数据,用ksar导入文本生成报表

使用Python定时执行一任务,自动登录某web系统,生成报表,然后发送邮件给指定人员

一.项目需求 每周从A系统生成一张Excel报表,发送此报表给指定人员,相关人员依据此报表去完成后续的工作. 项目限制: 1.无法通过EDI系统交互的方式从后台读取数据 2.由于公司网络环境限制,不能使用SMTP发送邮件,比如,不能通过smtp.163.com发送邮件 二.解决方案 模拟人工操作,登录系统,输入相应查询条件,生成报表,保存后发送邮件给指定人员. 采用技术:采用Python 三.关键点 1.使用selenium模拟登录浏览器 '使用IE浏览器 driver.webdriver.Ie

检查邮箱数据库状态并生成报表脚本

此脚本是群里面的哥们共享的,本人特整理出来分享给有需要的同学. 注意:1.使用前修改下里面的一些参数(原作者都贴心的标注了)2.有必要的话修改下脚本的执行策略 效果截图: 计划任务截图: 脚本内容: add-pssnapin microsoft.exchange* #加载EMS不然exchange命令无法识别 $Smtp="mail.demo.com"#需要修改的地方br/>$AdminEamil="[email protected],[email protected]

jenkins持续集成Allure生成报表+邮件推送

本次基于<jenkins 生成HTML报表,邮件推送>的基础上将生成HTML报表修改为Allure生成报表,可以参考官方文档:https://docs.qameta.io/allure/#_jenkins 1.启动tomcat登录jenkins 2.Install the latest version of Allure Plugin from "Plugin Manager" page. 3.(1)Open Plugin Advanced Settings (at <

Zabbix 使用规范和生成报表

一.软件版本 操作系统:CentOS-6.5-x86_64 zabbix版本:3.0.3 二.zabbix标准:   1.  主机命名规范: BJ-monitor-h-zabbix-01 **命名规范是,我们看一台主机能够知道主机位于哪里:BJ:做什么的:monitor:虚拟化还是实体机:h:跑什么服务:zabbix  第几台:01 2.  一台主机直接关联多个模板:不用创建多个分组(可以结合CMDB平台) Memcached :192.168.10.100 Php Linux:192.168.

RDLC报表之动态生成报表

首先,必须感谢和致敬蜡人张前辈: http://waxdoll.cnblogs.com/archive/2006/02/25/337713.html 2.微软GotReportViewer官方的案例: http://www.gotreportviewer.com/(约有20来个,很详细.有时候会上不了) ) 前段时间,做了RDLC报表,主要是三块功能: 1.从DataGrid提取数据,然后创建对应的RDLC报表文件,以利用ReportViewer类的打印排版的功能(其中做了个提取数据的通用函数,